Open josircg opened 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.
Coloquei tudo apenas no ambiente de testes.
Rode por favor apenas no ambiente de teste mas sem o último processamento. Preciso saber quais ficaram com valor null.
Pronto. Rodei no final o script:
Operacao.objects.filter(dt_criacao=None).count()
Saída: 0
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).
Resolvido. Coloquei apenas no ambiente de testes.
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