josircg / raizcidadanista

Sistema de Gerenciamento da Raiz Cidadanista
http://www.raiz.org.br
GNU General Public License v3.0
1 stars 2 forks source link

Data de Criação da Operação #133

Open josircg opened 7 years ago

josircg commented 7 years ago

Registrar a data em que a operação financeira foi registrada:

1) criar o campo dt_criacao como nulo com o auto_add_now 2) popular o campo a partir do log da operação filha (Receita, Despesa, Pagamento, etc) 3) verificar se ficaram casos em branco e tornar o campo not null 4) Incluir o campo como filtro no admin da Operacao e da Receita

leonardocsantoss commented 7 years ago

1) Já tinha o campo. Rodei só o migrate. 2) 4) Receita não é filha da Operação. 3) Script para popular o campo:

from django.contrib.admin.models import LogEntry
from django.contrib.contenttypes.models import ContentType
from financeiro.models import Operacao, Pagamento, Transferencia, Deposito, Receita

from datetime import datetime

# Pagamento
pag_type = ContentType.objects.get_for_model(Pagamento)
for pag in Pagamento.objects.filter(dt_criacao=None):
    try:
        first = LogEntry.objects.filter(content_type=pag_type, object_id=pag.pk).order_by('action_time')[0]
    except IndexError: continue
    Pagamento.objects.filter(pk=pag.pk).update(dt_criacao=first.action_time)

# Transferencias
transf_type = ContentType.objects.get_for_model(Transferencia)
for transf in Transferencia.objects.filter(dt_criacao=None):
    try:
        first = LogEntry.objects.filter(content_type=transf_type, object_id=transf.pk).order_by('action_time')[0]
    except IndexError:
        # Se não encontrar, procura o log da Transferencia associada
        try: first = LogEntry.objects.filter(content_type=transf_type, object_id=transf.transf_associada.pk).order_by('action_time')[0]
        except IndexError: continue
    Transferencia.objects.filter(pk=transf.pk).update(dt_criacao=first.action_time)

# Deposito
dep_type = ContentType.objects.get_for_model(Deposito)
receita_type = ContentType.objects.get_for_model(Receita)
for dep in Deposito.objects.filter(dt_criacao=None):
    if dep.receita:
        # Se tiver Receita associada, procura o log da Receita
        try:
            first = LogEntry.objects.filter(content_type=receita_type, object_id=dep.receita.pk).order_by('action_time')[0]
        except IndexError: continue
        Deposito.objects.filter(pk=dep.pk).update(dt_criacao=first.action_time)
    else:
        try:
            first = LogEntry.objects.filter(content_type=dep_type, object_id=dep.pk).order_by('action_time')[0]
        except IndexError:  continue
        Deposito.objects.filter(pk=dep.pk).update(dt_criacao=first.action_time)

# Otras operacoes
ope_type = ContentType.objects.get_for_model(Operacao)
for ope in Operacao.objects.filter(dt_criacao=None):
    try:
        first = LogEntry.objects.filter(content_type=ope_type, object_id=ope.pk).order_by('action_time')[0]
    except IndexError: continue
    Operacao.objects.filter(pk=ope.pk).update(dt_criacao=first.action_time)

# Se sobrar alguma, seta com a data de hoje
Operacao.objects.filter(dt_criacao=None).update(datetime.now())

Ps.: Ainda não rodei nem no ambiente de testes.

leonardocsantoss commented 7 years ago

Coloquei tudo apenas no ambiente de testes.

josircg commented 7 years ago

Rode por favor apenas no ambiente de teste mas sem o último processamento. Preciso saber quais ficaram com valor null.

leonardocsantoss commented 7 years ago

Pronto. Rodei no final o script:

Operacao.objects.filter(dt_criacao=None).count()

Saída: 0

josircg commented 7 years ago

http://teste.raiz.org.br/admin/financeiro/operacao/276/

1) Em caso de edição, o combo do tipo de operação deve vir sempre read-only.

2) Incluir um PowerButton "Lançamento Original" para que o usuário possa ir direto para o registro original (no caso pagamento, depósito, transferência, etc).

leonardocsantoss commented 7 years ago

Resolvido. Coloquei apenas no ambiente de testes.