estagio/pessoal/models.py
#-*- coding: UTF-8 -*-
from django.db import models
from django.contrib.auth.models import User
from django.core.exceptions import ValidationError
from django.utils.translation import ugettext_lazy as _
from django.utils.html import format_html
from django.utils.encoding import python_2_unicode_compatible
from django.core.urlresolvers import reverse
from sorl.thumbnail import ImageField
import datetime
from datetime import date
from banco.models import Banco, Agencia
from localidade.models import Cidade
from contas_receber.funcoes import status_financeiro as sit_finan_cliente
from contas_pagar.funcoes import status_financeiro as sit_finan_fornecedor
from utilitarios.funcoes import lista_status_parcela as cor_finan
# faz a validação da data de nascimento para que o usuário fique impedido de informar data maior ou igual a hoje, e seja maior de 18 anos
def valida_data_nascimento(value):
# verifica se data é menor que hoje
if value >= datetime.date.today():
raise ValidationError(_(u"Data de nascimento deve ser menor que hoje!"))
# verifica se pessoa é maior de 18 anos
dias_no_ano = 365.2425
if int((date.today() - value).days / dias_no_ano) < 18:
raise ValidationError(_(u"Cliente deve ser maior de 18 anos!"))
class BaseCadastroPessoa(models.Model):
u"""
Classe BaseCadastroPessoa.
Criada para servir de base para as outras models de cadastros de pessoas no sistema. Todas as outras herdam dessa classe.
Criada em 15/06/2014.
Última alteração em 16/06/2014.
"""
ESTADO_CIVIL_CHOICES = (
('solteiro', _(u"Solteiro")),
('casado', _(u"Casado")),
('separado', _(u"Separado")),
('viuvo', _(u"Viuvo")),
('divorciado', _(u"Divorciado")),
('marital', _(u"Marital")),
('separado_judicialmente', _(u"Separado Judicialmente")),
('separado_concensualmente', _(u"Separado Concensualmente")),
('uniao_estavel', _(u"União Estável")),
)
SEXO_CHOICES = (
('M', _(u"Masculino")),
('F', _(u"Feminino")),
)
nome = models.CharField(max_length=255, verbose_name=_(u"Nome"))
data_nasc = models.DateField(validators=[valida_data_nascimento], blank=True, null=True, verbose_name=_(u"Data de nascimento"))
cpf = models.CharField(max_length=11, null=True, unique=True, verbose_name=_(u"CPF"))
rg = models.CharField(max_length=20, blank=True, verbose_name=_(u"RG"))
sexo = models.CharField(max_length=1, blank=True, null=True, choices=SEXO_CHOICES, verbose_name=_(u"Sexo"))
estado_civil = models.CharField(max_length=30, blank=True, choices=ESTADO_CIVIL_CHOICES, verbose_name=_(u"Estado civil"))
endereco = models.CharField(max_length=50, verbose_name=_(u"Endereço"))
numero = models.CharField(max_length=15, verbose_name=_(u"Número"))
bairro = models.CharField(max_length=50, verbose_name=_(u"Bairro"))
complemento = models.CharField(max_length=50, blank=True, verbose_name=_(u"Complemento"))
estado = models.CharField(max_length=2, blank=True, null=True, verbose_name=_(u"Estado"))
cidade = models.ForeignKey(Cidade, on_delete=models.PROTECT, verbose_name=_(u"Cidade"))
cep = models.CharField(max_length=9, verbose_name=_(u"CEP"))
telefone = models.CharField(max_length=30, blank=True, verbose_name=_(u"Telefone"))
celular = models.CharField(max_length=30, blank=True, verbose_name=_(u"Celular"))
email = models.EmailField(max_length=100, blank=True, verbose_name=_(u"E-mail"))
banco = models.ForeignKey(Banco, null=True, blank=True, verbose_name=_(u"Banco"))
agencia = models.ForeignKey(Agencia, null=True, blank=True, verbose_name=_(u"Agência"))
conta_banco = models.CharField(max_length=15, null=True, blank=True, verbose_name=_(u"Conta corrente"))
data = models.DateTimeField(auto_now_add=True, verbose_name=_(u"Data de cadastro"))
status = models.BooleanField(default=True, db_index=True, verbose_name=_(u"Status"))
observacao = models.TextField(blank=True, verbose_name=_(u"Observações"))
foto = ImageField(upload_to='fotos_pessoas', max_length=255, blank=True, verbose_name=_(u"Foto"))
class Meta(object):
abstract = True
def formata_data_nascimento(obj):
u""" Retorna a idade baseada na data de nascimento cadastrada para a pessoa """
if obj.data_nasc:
idade = int((date.today() - obj.data_nasc).days / 365.2425)
return format_html('<span style="color: #000000;">{0}</span>', '%s anos' % (idade))
return '-'
formata_data_nascimento.allow_tags = True
formata_data_nascimento.short_description = 'Idade'
@python_2_unicode_compatible
class Cliente(BaseCadastroPessoa):
TIPO_PESSOA_CHOICES = (
('PF', _(u"Pessoa Física")),
('PJ', _(u"Pessoa Jurídica")),
)
tipo_pessoa = models.CharField(choices=TIPO_PESSOA_CHOICES, max_length=2, blank=False, null=False, default='PF', verbose_name=_(u"Tipo de pessoa"))
cnpj = models.CharField(max_length=14, null=True, unique=True, verbose_name=_(u"CNPJ"))
razao_social = models.CharField(max_length=255, blank=True, null=True, verbose_name=_(u"Razão social"))
class Meta(object):
verbose_name = _(u"Cliente")
verbose_name_plural = _(u"Clientes")
permissions = ((u"pode_exportar_cliente", _(u"Exportar Clientes")),)
def __str__(self):
return u'%s' % (self.nome)
def status_financeiro(obj):
url = reverse('admin:pessoal_cliente_changelist')
sf = sit_finan_cliente(obj.pk)
cf = cor_finan()
if sf[0] == 'I':
return format_html('<a href="{0}detalhes_financeiros/{1}" style="text-decoration:none;"><span style="color: {2};"><b>{3}</b></span></a>', url, obj.pk, cf[2][0], sf[1])
else:
return format_html('<a href="{0}detalhes_financeiros/{1}" style=" text-decoration:none;"><span style="color: {2};"><b>{3}</b></span></a>', url, obj.pk, cf[1][0], sf[1])
status_financeiro.allow_tags = True
status_financeiro.short_description = _(u"Status financeiro")
def save(self, *args, **kwargs):
if self.pk:
super(Cliente, self).save(*args, **kwargs)
else:
super(Cliente, self).save(*args, **kwargs)
endereco_cliente = EnderecoEntregaCliente(status=True,
endereco=self.endereco,
numero=self.numero,
bairro=self.bairro,
complemento=self.complemento,
estado=self.estado,
cidade=self.cidade,
cep=self.cep,
cliente=self
)
endereco_cliente.save()
@python_2_unicode_compatible
class Fornecedor(BaseCadastroPessoa):
TIPO_PESSOA_CHOICES = (
('PF', _(u"Pessoa Física")),
('PJ', _(u"Pessoa Jurídica")),
)
tipo_pessoa = models.CharField(choices=TIPO_PESSOA_CHOICES, max_length=2, blank=False, null=False, default='PF', verbose_name=_(u"Tipo de pessoa"))
cnpj = models.CharField(max_length=14, null=True, unique=True, verbose_name=_(u"CNPJ"))
razao_social = models.CharField(max_length=255, blank=True, null=True, verbose_name=_(u"Razão social"))
class Meta(object):
verbose_name = _(u"Fornecedor")
verbose_name_plural = _(u"Fornecedores")
permissions = ((u"pode_exportar_fornecedor", _(u"Exportar Fornecedores")),)
def __str__(self):
return u'%s' % (self.nome)
def status_financeiro(obj):
sf = sit_finan_fornecedor(obj.pk)
cf = cor_finan()
if sf[0] == 'I':
return format_html('<span style="color: {0};"><b>{1}</b></span>', cf[2][0], sf[1])
else:
return format_html('<span style="color: {0};"><b>{1}</b></span>', cf[1][0], sf[1])
status_financeiro.allow_tags = True
status_financeiro.short_description = _(u"Status financeiro")
@python_2_unicode_compatible
class Cargo(models.Model):
nome = models.CharField(max_length=100, unique=True, verbose_name=_(u"Nome"))
descricao = models.TextField(blank=True, verbose_name=_(u"Descrição"))
class Meta(object):
verbose_name = _(u"Cargo")
verbose_name_plural = _(u"Cargos")
permissions = ((u"pode_exportar_cargo", _(u"Exportar Cargos")),)
def __str__(self):
return u'%s' % (self.nome)
@python_2_unicode_compatible
class Funcionario(BaseCadastroPessoa):
salario = models.DecimalField(max_digits=20, decimal_places=2, blank=True, null=True, verbose_name=_(u"Salário"))
cargo = models.ForeignKey(Cargo, on_delete=models.PROTECT, verbose_name=_(u"Cargo"))
usuario = models.OneToOneField(User, on_delete=models.PROTECT, null=True, blank=True, unique=True, verbose_name=_(u"Usuário"))
class Meta(object):
verbose_name = _(u"Funcionário")
verbose_name_plural = _(u"Funcionários")
permissions = ((u"pode_exportar_funcionario", _(u"Exportar Funcionários")),)
def __str__(self):
return u'%s' % (self.nome)
@python_2_unicode_compatible
class EnderecoEntregaCliente(models.Model):
status = models.BooleanField(default=True, db_index=True, verbose_name=_(u"Status"))
endereco = models.CharField(max_length=50, verbose_name=_(u"Endereço"))
numero = models.CharField(max_length=15, verbose_name=_(u"Número"))
bairro = models.CharField(max_length=50, verbose_name=_(u"Bairro"))
complemento = models.CharField(max_length=50, blank=True, verbose_name=_(u"Complemento"))
estado = models.CharField(max_length=2, blank=True, null=True, verbose_name=_(u"Estado"))
cidade = models.ForeignKey(Cidade, on_delete=models.PROTECT, verbose_name=_(u"Cidade"))
cep = models.CharField(max_length=9, verbose_name=_(u"CEP"))
observacao = models.TextField(blank=True, verbose_name=_(u"Observações"))
cliente = models.ForeignKey(Cliente, on_delete=models.PROTECT, verbose_name=_(u"Cliente"))
class Meta(object):
verbose_name = _(u"Endereço de Entrega")
verbose_name_plural = _(u"Endereços de Entrega")
def __str__(self):
return u'%s, %s, %s, %s - %s' % (self.endereco, self.numero, self.bairro, self.cidade, self.estado)