예제 #1
0
def notificar_pendencia_envio_prestacao_de_contas():
    logger.info(f'Notificar pendência envio prestação de contas service')

    data_de_hoje = date.today()

    periodo = Periodo.objects.filter(
        data_fim_realizacao_despesas__lt=data_de_hoje,
        data_fim_prestacao_contas__lt=data_de_hoje,
        notificacao_pendencia_envio_pc_realizada=False).first()

    associacoes = Associacao.objects.all().exclude(
        cnpj__exact='').order_by('unidade__codigo_eol')

    users = get_users_by_permission(
        'recebe_notificacao_pendencia_envio_prestacao_de_contas')

    users = users.filter(visoes__nome="UE")

    if periodo:

        for associacao in associacoes:

            prestacao_conta = PrestacaoConta.objects.filter(
                associacao=associacao, periodo=periodo).first()

            # Devem entrar apenas Prestações de contas não apresentadas ou não recebidas
            if prestacao_conta and prestacao_conta.status != PrestacaoConta.STATUS_NAO_APRESENTADA:
                continue

            usuarios = users.filter(
                unidades__codigo_eol=associacao.unidade.codigo_eol)

            if usuarios:
                for usuario in usuarios:
                    logger.info(
                        f"Gerando notificação de pendência de envio de PC para o usuario: {usuario} | Período: {periodo.referencia}"
                    )

                    Notificacao.notificar(
                        tipo=Notificacao.TIPO_NOTIFICACAO_ALERTA,
                        categoria=Notificacao.
                        CATEGORIA_NOTIFICACAO_ELABORACAO_PC,
                        remetente=Notificacao.REMETENTE_NOTIFICACAO_SISTEMA,
                        titulo=f"Pendência de envio de PC {periodo.referencia}",
                        descricao=
                        f"Terminou o período de prestações de contas para a associação {associacao.unidade.codigo_eol} - {associacao.unidade.nome} e você ainda não enviou sua PC.",
                        usuario=usuario,
                        renotificar=True,
                    )

                periodo.notificacao_pendencia_envio_prestacao_de_contas_realizada(
                )

    else:
        logger.info(
            f"Não foram encontrados períodos a serem notificados sobre pendência de envio de prestação de contas"
        )
def notificar_proximidade_inicio_periodo_prestacao_conta():
    logging.info(
        "Criando notificações de proximidade do inicio do período de prestação de contas..."
    )
    dias_antes = Parametros.get().dias_antes_inicio_periodo_pc_para_notificacao
    data_alvo = date.today() + timedelta(days=dias_antes)

    periodo = Periodo.objects.filter(
        data_inicio_prestacao_contas__lte=data_alvo,
        data_fim_prestacao_contas__gte=data_alvo,
        notificacao_proximidade_inicio_pc_realizada=False).first()

    users = get_users_by_permission(
        'recebe_notificacao_proximidade_inicio_prestacao_de_contas')

    if users:
        try:
            users = users.filter(visoes__nome="UE")
            users = users.annotate(c=Count('unidades')).filter(c__gt=0)
        except Exception:
            logger.error(f'Erro ao filtrar usuario por visão e ou unidade')

    if periodo:
        if users:
            for user in users:
                logger.info(
                    f"Gerando notificação para o usuario: {user} | Período: {periodo.referencia}"
                )

                dias_para_inicio = periodo.data_inicio_prestacao_contas - date.today(
                )

                Notificacao.notificar(
                    tipo=Notificacao.TIPO_NOTIFICACAO_INFORMACAO,
                    categoria=Notificacao.CATEGORIA_NOTIFICACAO_ELABORACAO_PC,
                    remetente=Notificacao.REMETENTE_NOTIFICACAO_SISTEMA,
                    titulo=
                    f"O período de envio da PC de {periodo.referencia} está se aproximando.",
                    descricao=
                    f"Faltam apenas {dias_para_inicio.days} dias para o início do período de prestações "
                    f"de contas. Finalize o cadastro de crédito e de gastos, a conciliação bancária e "
                    f"gere os documentos da prestação de contas.",
                    usuario=user)
                periodo.notificacao_proximidade_inicio_prestacao_de_contas_realizada(
                )
        else:
            logger.info(f"Não foram encontrados usuários a serem notificados.")
    else:
        logger.info(f"Não foram encontrados períodos a serem notificados.")
def notificar_proximidade_fim_prazo_ajustes_prestacao_de_contas():
    logging.info(
        "Criando notificações de proximidade do fim do prazo de ajustes de prestação de contas service"
    )
    dias_antes = Parametros.get(
    ).dias_antes_fim_prazo_ajustes_pc_para_notificacao
    data_alvo = date.today() + timedelta(days=dias_antes)

    users = get_users_by_permission(
        'recebe_notificacao_proximidade_fim_prazo_ajustes_prestacao_de_contas')
    users = users.filter(visoes__nome="UE")

    devolucoes = DevolucaoPrestacaoConta.objects.filter(
        prestacao_conta__status="DEVOLVIDA",
        data_limite_ue__lte=data_alvo,
        data_limite_ue__gte=date.today(),
    ).order_by('-data_limite_ue')

    if devolucoes:
        for devolucao in devolucoes:
            prestacao_de_contas = devolucao.prestacao_conta
            associacao = prestacao_de_contas.associacao
            usuarios = users.filter(
                unidades__codigo_eol=associacao.unidade.codigo_eol)

            if usuarios:
                for usuario in usuarios:
                    logger.info(
                        f"Gerando notificação de atraso na entrega de ajustes de PC para o usuario: {usuario}"
                    )

                    dias_para_fim = devolucao.data_limite_ue - date.today()

                    # Gerando apenas 1 notificação por período e data ordenado decrescente por -data_limite_ue
                    Notificacao.notificar(
                        tipo=Notificacao.TIPO_NOTIFICACAO_INFORMACAO,
                        categoria=Notificacao.CATEGORIA_NOTIFICACAO_ANALISE_PC,
                        remetente=Notificacao.REMETENTE_NOTIFICACAO_SISTEMA,
                        titulo=
                        f"O prazo para envio dos ajustes da PC está se aproximando {prestacao_de_contas.periodo.referencia}",
                        descricao=
                        f"Faltam apenas {dias_para_fim.days} dia(s) para o fim do prazo de envio dos ajustes de sua prestações de contas de {prestacao_de_contas.periodo.referencia}. Fique atento para não perder o prazo e realize os ajustes solicitados.",
                        usuario=usuario,
                        renotificar=False,
                    )
    else:
        logger.info(
            f"Não foram encontrados prestações de contas a serem notificadas.")
def notificar_atraso_entrega_ajustes_prestacao_de_contas():
    logger.info(
        f'Iniciando a geração de notificação sobre atraso na entrega de ajustes de prestações de contas service'
    )
    data_de_hoje = date.today()

    users = get_users_by_permission(
        'recebe_notificacao_atraso_entrega_ajustes_prestacao_de_contas')
    users = users.filter(visoes__nome="UE")

    devolucoes = DevolucaoPrestacaoConta.objects.filter(
        prestacao_conta__status="DEVOLVIDA",
        data_limite_ue__lt=data_de_hoje).order_by('-data_limite_ue')

    if devolucoes:
        for devolucao in devolucoes:
            prestacao_de_contas = devolucao.prestacao_conta
            associacao = prestacao_de_contas.associacao
            usuarios = users.filter(
                unidades__codigo_eol=associacao.unidade.codigo_eol)

            if usuarios:
                for usuario in usuarios:
                    logger.info(
                        f"Gerando notificação de atraso na entrega de ajustes de PC para o usuario: {usuario}"
                    )

                    # Gerando apenas 1 notificação por período e data ordenado decrescente por -data_limite_ue
                    Notificacao.notificar(
                        tipo=Notificacao.TIPO_NOTIFICACAO_ALERTA,
                        categoria=Notificacao.CATEGORIA_NOTIFICACAO_ANALISE_PC,
                        remetente=Notificacao.REMETENTE_NOTIFICACAO_SISTEMA,
                        titulo=
                        f"Devolução de ajustes na PC atrasada {prestacao_de_contas.periodo.referencia}",
                        descricao=f"Sua unidade ainda não enviou os ajustes "
                        f"solicitados pela DRE em sua prestação de contas do período "
                        f"{prestacao_de_contas.periodo.referencia}. "
                        f"O seu prazo era {formata_data_dd_mm_yyyy(devolucao.data_limite_ue)}",
                        usuario=usuario,
                        renotificar=False,
                    )
    else:
        logger.info(
            f"Não foram encontrados prestações de contas a serem notificadas.")
예제 #5
0
def notificar_inicio_periodo_prestacao_de_contas():
    logger.info(f'Notificar início período prestação de contas service')
    data_de_hoje = date.today()

    periodo = Periodo.objects.filter(
        data_inicio_prestacao_contas__lte=data_de_hoje,
        data_fim_prestacao_contas__gte=data_de_hoje,
        notificacao_inicio_periodo_pc_realizada=False
    ).first()

    users = get_users_by_permission('recebe_notificacao_inicio_periodo_prestacao_de_contas')

    if users:
        try:
            users = users.filter(visoes__nome="UE")
            users = users.annotate(c=Count('unidades')).filter(c__gt=0)
        except Exception:
            logger.error(f'Erro ao filtrar usuario por visão e ou unidade')

    if periodo:
        if users:
            for user in users:
                logger.info(f"Gerando notificação início período prestação de contas para o usuario: {user} | Período: {periodo.referencia}")

                Notificacao.notificar(
                    tipo=Notificacao.TIPO_NOTIFICACAO_INFORMACAO,
                    categoria=Notificacao.CATEGORIA_NOTIFICACAO_ELABORACAO_PC,
                    remetente=Notificacao.REMETENTE_NOTIFICACAO_SISTEMA,
                    titulo=f"O período de envio da PC de {periodo.referencia} começou",
                    descricao="O período de prestações de contas já foi iniciado. Fique atento para não perder o prazo e envie os documentos da prestação de contas",
                    usuario=user,
                    renotificar=False,
                )

            periodo.notificacao_inicio_prestacao_de_contas_realizada()
        else:
            logger.info(f"Não foram encontrados usuários a serem notificados sobre início do período de prestação de contas")
    else:
        logger.info(f"Não foram encontrados períodos a serem notificados sobre início do período de prestação de contas")
예제 #6
0
def notificar_prestacao_de_contas_devolvida_para_acertos(prestacao_de_contas, data_limite_ue):
    logger.info(f'Iniciando a geração de notificação prestação de contas devolvida para acertos {prestacao_de_contas} service')

    users = get_users_by_permission('recebe_notificacao_prestacao_de_contas_devolvida_para_acertos')
    users = users.filter(visoes__nome="UE")
    associacao = prestacao_de_contas.associacao
    usuarios = users.filter(unidades__codigo_eol=associacao.unidade.codigo_eol)

    if usuarios:
        for usuario in usuarios:
            logger.info(f"Gerando notificação de PC devolvida para acerto para o usuario: {usuario} | Data Limite: {formata_data_dd_mm_yyyy(data_limite_ue)}")

            Notificacao.notificar(
                tipo=Notificacao.TIPO_NOTIFICACAO_ALERTA,
                categoria=Notificacao.CATEGORIA_NOTIFICACAO_ANALISE_PC,
                remetente=Notificacao.REMETENTE_NOTIFICACAO_DRE,
                titulo=f"Ajustes necessários na PC",
                descricao=f"A DRE solicitou alguns ajustes em sua prestação de contas do período {prestacao_de_contas.periodo.referencia}. O seu prazo para envio das mudanças é {formata_data_dd_mm_yyyy(data_limite_ue)}",
                usuario=usuario,
                renotificar=True,
            )

    logger.info(f'Finalizando a geração de notificação prestação de contas devolvida para acertos')