Source code for src.pre_recebimento.cronograma_entrega.api.serializers.serializers

import datetime
from collections import OrderedDict

from django.db.models import Case, CharField, Q, Value, When
from rest_framework import serializers

from src.dados_comuns.fluxo_status import DocumentoDeRecebimentoWorkflow
from src.dados_comuns.utils import numero_com_agrupador_de_milhar_e_decimal
from src.pre_recebimento.cronograma_entrega.models import (
    Cronograma,
    EtapasDoCronograma,
    InterrupcaoProgramadaEntrega,
    ProgramacaoDoRecebimentoDoCronograma,
    SolicitacaoAlteracaoCronograma,
    UnidadeMedida,
)
from src.pre_recebimento.documento_recebimento.api.serializers.serializers import (
    DocRecebimentoFichaDeRecebimentoSerializer,
)
from src.pre_recebimento.ficha_tecnica.api.serializers.serializers import (
    FichaTecnicaCronogramaSerializer,
)
from src.pre_recebimento.qualidade.models import (
    TipoEmbalagemQld,
)
from src.terceirizada.api.serializers.serializers import (
    ContratoSimplesSerializer,
    DistribuidorComEnderecoSimplesSerializer,
    DistribuidorSimplesSerializer,
    TerceirizadaLookUpSerializer,
)

from .....dados_comuns.api.serializers import (
    LogSolicitacoesUsuarioSerializer,
)


[docs] class ProgramacaoDoRecebimentoDoCronogramaSerializer(serializers.ModelSerializer):
[docs] class Meta: model = ProgramacaoDoRecebimentoDoCronograma fields = ( "uuid", "data_programada", "tipo_carga", )
[docs] class EtapasDoCronogramaSerializer(serializers.ModelSerializer): data_programada = serializers.SerializerMethodField() etapa = serializers.SerializerMethodField() parte = serializers.SerializerMethodField() quantidade_estimada_disponivel = serializers.SerializerMethodField()
[docs] def get_data_programada(self, obj): if not obj.data_programada: return None if obj.cronograma and obj.cronograma.ponto_a_ponto: return obj.data_programada.strftime("%m/%Y") return obj.data_programada.strftime("%d/%m/%Y")
[docs] def get_etapa(self, obj): return f"Etapa {obj.etapa}" if obj.etapa is not None else None
[docs] def get_parte(self, obj): return f"Parte {obj.parte}" if obj.parte is not None else None
[docs] def get_quantidade_estimada_disponivel(self, obj): return obj.quantidade_estimada_disponivel
[docs] class Meta: model = EtapasDoCronograma fields = ( "uuid", "numero_empenho", "qtd_total_empenho", "etapa", "parte", "data_programada", "quantidade", "total_embalagens", "quantidade_estimada_disponivel", )
[docs] class EtapasDoCronogramaCalendarioSerializer(serializers.ModelSerializer): nome_produto = serializers.SerializerMethodField() uuid_cronograma = serializers.SerializerMethodField() numero_cronograma = serializers.SerializerMethodField() nome_fornecedor = serializers.SerializerMethodField() data_programada = serializers.SerializerMethodField() status = serializers.SerializerMethodField() unidade_medida = serializers.SerializerMethodField() etapa = serializers.SerializerMethodField() parte = serializers.SerializerMethodField() programa_leve_leite = serializers.SerializerMethodField()
[docs] def get_etapa(self, obj): return f"Etapa {obj.etapa}" if obj.etapa is not None else None
[docs] def get_parte(self, obj): return f"Parte {obj.parte}" if obj.parte is not None else None
[docs] def get_nome_produto(self, obj): try: return obj.cronograma.ficha_tecnica.produto.nome except AttributeError: return None
[docs] def get_uuid_cronograma(self, obj): return obj.cronograma.uuid if obj.cronograma else None
[docs] def get_numero_cronograma(self, obj): return str(obj.cronograma.numero) if obj.cronograma else None
[docs] def get_nome_fornecedor(self, obj): return obj.cronograma.empresa.nome_fantasia if obj.cronograma.empresa else None
[docs] def get_data_programada(self, obj): if not obj.data_programada: return None if obj.cronograma and obj.cronograma.ponto_a_ponto: return obj.data_programada.strftime("%m/%Y") return obj.data_programada.strftime("%d/%m/%Y")
[docs] def get_status(self, obj): return obj.cronograma.get_status_display() if obj.cronograma else None
[docs] def get_unidade_medida(self, obj): return obj.cronograma.unidade_medida.abreviacao if obj.cronograma else None
[docs] def get_programa_leve_leite(self, obj): try: return obj.cronograma.ficha_tecnica.programa == "LEVE_LEITE" except AttributeError: return False
[docs] class Meta: model = EtapasDoCronograma fields = ( "uuid", "nome_produto", "uuid_cronograma", "numero_cronograma", "nome_fornecedor", "data_programada", "numero_empenho", "etapa", "parte", "quantidade", "status", "unidade_medida", "programa_leve_leite", )
[docs] class SolicitacaoAlteracaoCronogramaSerializer(serializers.ModelSerializer): fornecedor = serializers.CharField(source="cronograma.empresa") cronograma = serializers.CharField(source="cronograma.numero") status = serializers.CharField(source="get_status_display") programa_leve_leite = serializers.SerializerMethodField()
[docs] def get_programa_leve_leite(self, obj): try: return obj.cronograma.ficha_tecnica.programa == "LEVE_LEITE" except AttributeError: return False
[docs] class Meta: model = SolicitacaoAlteracaoCronograma fields = ( "uuid", "numero_solicitacao", "fornecedor", "status", "criado_em", "cronograma", "programa_leve_leite", )
[docs] class TipoEmbalagemQldSerializer(serializers.ModelSerializer):
[docs] class Meta: model = TipoEmbalagemQld exclude = ("id",)
[docs] class TipoEmbalagemQldSimplesSerializer(serializers.ModelSerializer):
[docs] class Meta: model = TipoEmbalagemQld fields = ("uuid", "nome", "abreviacao")
[docs] class UnidadeMedidaSerialzer(serializers.ModelSerializer):
[docs] class Meta: model = UnidadeMedida fields = ("uuid", "nome", "abreviacao", "criado_em") read_only_fields = ("uuid", "nome", "abreviacao", "criado_em")
[docs] class CronogramaSerializer(serializers.ModelSerializer): etapas = EtapasDoCronogramaSerializer(many=True) programacoes_de_recebimento = ProgramacaoDoRecebimentoDoCronogramaSerializer( many=True ) armazem = DistribuidorSimplesSerializer() status = serializers.CharField(source="get_status_display") empresa = TerceirizadaLookUpSerializer() contrato = ContratoSimplesSerializer() unidade_medida = UnidadeMedidaSerialzer() ficha_tecnica = FichaTecnicaCronogramaSerializer() tipo_embalagem_secundaria = TipoEmbalagemQldSimplesSerializer() ponto_a_ponto = serializers.SerializerMethodField()
[docs] def get_ponto_a_ponto(self, obj): return obj.ponto_a_ponto
[docs] class Meta: model = Cronograma fields = ( "uuid", "numero", "status", "criado_em", "alterado_em", "contrato", "empresa", "qtd_total_programada", "unidade_medida", "armazem", "etapas", "programacoes_de_recebimento", "ficha_tecnica", "tipo_embalagem_secundaria", "custo_unitario_produto", "observacoes", "numero_empenho", "qtd_total_empenho", "ponto_a_ponto", )
[docs] class CronogramaComLogSerializer(serializers.ModelSerializer): etapas = EtapasDoCronogramaSerializer(many=True) programacoes_de_recebimento = ProgramacaoDoRecebimentoDoCronogramaSerializer( many=True ) armazem = DistribuidorComEnderecoSimplesSerializer() status = serializers.CharField(source="get_status_display") empresa = TerceirizadaLookUpSerializer() contrato = ContratoSimplesSerializer() unidade_medida = UnidadeMedidaSerialzer() logs = LogSolicitacoesUsuarioSerializer(many=True) ficha_tecnica = FichaTecnicaCronogramaSerializer() tipo_embalagem_secundaria = TipoEmbalagemQldSimplesSerializer()
[docs] class Meta: model = Cronograma fields = ( "uuid", "numero", "status", "criado_em", "alterado_em", "contrato", "empresa", "qtd_total_programada", "unidade_medida", "armazem", "etapas", "programacoes_de_recebimento", "ficha_tecnica", "tipo_embalagem_secundaria", "custo_unitario_produto", "logs", "observacoes", "numero_empenho", "qtd_total_empenho", "ponto_a_ponto", )
ponto_a_ponto = serializers.BooleanField(read_only=True)
[docs] class SolicitacaoAlteracaoCronogramaCompletoSerializer(serializers.ModelSerializer): fornecedor = serializers.CharField(source="cronograma.empresa") cronograma = CronogramaSerializer() status = serializers.CharField(source="get_status_display") etapas_antigas = EtapasDoCronogramaSerializer(many=True) etapas_novas = EtapasDoCronogramaSerializer(many=True) logs = LogSolicitacoesUsuarioSerializer(many=True)
[docs] class Meta: model = SolicitacaoAlteracaoCronograma fields = ( "uuid", "numero_solicitacao", "fornecedor", "status", "criado_em", "cronograma", "etapas_antigas", "etapas_novas", "justificativa", "logs", )
[docs] class CronogramaRascunhosSerializer(serializers.ModelSerializer): ponto_a_ponto = serializers.BooleanField(read_only=True)
[docs] class Meta: model = Cronograma fields = ("uuid", "numero", "alterado_em", "ponto_a_ponto")
[docs] class CronogramaSimplesSerializer(serializers.ModelSerializer): pregao_chamada_publica = serializers.SerializerMethodField() nome_produto = serializers.SerializerMethodField() programa_leve_leite = serializers.SerializerMethodField()
[docs] def get_pregao_chamada_publica(self, obj): return obj.contrato.pregao_chamada_publica if obj.contrato else None
[docs] def get_nome_produto(self, obj): return obj.ficha_tecnica.produto.nome if obj.ficha_tecnica else None
[docs] def get_programa_leve_leite(self, obj): try: return obj.ficha_tecnica.programa == "LEVE_LEITE" except AttributeError: return False
[docs] def get_ponto_a_ponto(self, obj): return obj.ponto_a_ponto
[docs] class Meta: model = Cronograma fields = ( "uuid", "numero", "pregao_chamada_publica", "nome_produto", "programa_leve_leite", "ponto_a_ponto", )
[docs] class EtapasDoCronogramaFichaDeRecebimentoSerializer(serializers.ModelSerializer): qtd_total_empenho = serializers.SerializerMethodField() data_programada = serializers.SerializerMethodField() quantidade = serializers.SerializerMethodField() total_embalagens = serializers.SerializerMethodField() desvinculada_recebimento = serializers.SerializerMethodField() etapa = serializers.SerializerMethodField() parte = serializers.SerializerMethodField() houve_ocorrencia = serializers.SerializerMethodField() houve_reposicao = serializers.SerializerMethodField() fichas_recebimento = serializers.SerializerMethodField() foi_recebida = serializers.SerializerMethodField() unidade_medida = serializers.SerializerMethodField()
[docs] def get_etapa(self, obj): return f"Etapa {obj.etapa}" if obj.etapa is not None else None
[docs] def get_parte(self, obj): return f"Parte {obj.parte}" if obj.parte is not None else None
[docs] def get_qtd_total_empenho(self, obj): try: valor = numero_com_agrupador_de_milhar_e_decimal(obj.qtd_total_empenho) return f"{valor} {obj.cronograma.unidade_medida.abreviacao}" except AttributeError: return valor
[docs] def get_quantidade(self, obj): try: valor = numero_com_agrupador_de_milhar_e_decimal(obj.quantidade) return f"{valor} {obj.cronograma.unidade_medida.abreviacao}" except AttributeError: return valor
[docs] def get_total_embalagens(self, obj): try: valor = numero_com_agrupador_de_milhar_e_decimal(obj.total_embalagens) return f"{valor} {obj.cronograma.tipo_embalagem_secundaria.abreviacao}" except AttributeError: return valor
[docs] def get_data_programada(self, obj): if not obj.data_programada: return None if obj.cronograma and obj.cronograma.ponto_a_ponto: return obj.data_programada.strftime("%m/%Y") return obj.data_programada.strftime("%d/%m/%Y")
[docs] def get_desvinculada_recebimento(self, obj): return not obj.ficha_recebimento.exists()
[docs] def get_houve_ocorrencia(self, obj): return obj.ficha_recebimento.filter( houve_ocorrencia=True, status="ASSINADA" ).exists()
[docs] def get_houve_reposicao(self, obj): return obj.ficha_recebimento.filter( Q(houve_ocorrencia=False) | Q(houve_ocorrencia__isnull=True), reposicao_cronograma__isnull=False, ).exists()
[docs] def get_foi_recebida(self, obj): return obj.ficha_recebimento.filter( Q(houve_ocorrencia=False) | Q(houve_ocorrencia__isnull=True) ).exists()
[docs] def get_fichas_recebimento(self, obj): return list( obj.ficha_recebimento.values( "uuid", "houve_ocorrencia", ).annotate( houve_reposicao=Q(reposicao_cronograma__isnull=False), situacao=Case( When(houve_ocorrencia=True, then=Value("Ocorrência")), default=Value("Recebido"), output_field=CharField(), ), ) )
[docs] def get_unidade_medida(self, obj): try: return obj.cronograma.unidade_medida.abreviacao except AttributeError: return "-"
[docs] class Meta: model = EtapasDoCronograma fields = ( "uuid", "numero_empenho", "qtd_total_empenho", "etapa", "parte", "data_programada", "quantidade", "total_embalagens", "desvinculada_recebimento", "houve_ocorrencia", "houve_reposicao", "fichas_recebimento", "foi_recebida", "unidade_medida", )
[docs] class CronogramaFichaDeRecebimentoSerializer(serializers.ModelSerializer): fornecedor = serializers.SerializerMethodField() contrato = serializers.SerializerMethodField() pregao_chamada_publica = serializers.SerializerMethodField() numero_chamada_publica = serializers.SerializerMethodField() ata = serializers.SerializerMethodField() produto = serializers.SerializerMethodField() marca = serializers.SerializerMethodField() qtd_total_programada = serializers.SerializerMethodField() peso_liquido_embalagem_primaria = serializers.SerializerMethodField() peso_liquido_embalagem_secundaria = serializers.SerializerMethodField() embalagem_primaria = serializers.SerializerMethodField() embalagem_secundaria = serializers.SerializerMethodField() categoria = serializers.SerializerMethodField() etapas = EtapasDoCronogramaFichaDeRecebimentoSerializer(many=True) documentos_de_recebimento = serializers.SerializerMethodField() sistema_vedacao_embalagem_secundaria = serializers.SerializerMethodField() programa_leve_leite = serializers.SerializerMethodField()
[docs] def get_fornecedor(self, obj): return obj.empresa.nome_fantasia if obj.empresa else None
[docs] def get_contrato(self, obj): return obj.contrato.numero if obj.contrato else None
[docs] def get_pregao_chamada_publica(self, obj): return obj.contrato.pregao_chamada_publica if obj.contrato else None
[docs] def get_numero_chamada_publica(self, obj): return obj.contrato.numero_chamada_publica if obj.contrato else None
[docs] def get_ata(self, obj): return obj.contrato.ata if obj.contrato else None
[docs] def get_produto(self, obj): try: return obj.ficha_tecnica.produto.nome except AttributeError: return None
[docs] def get_marca(self, obj): try: return obj.ficha_tecnica.marca.nome if obj.ficha_tecnica else None except AttributeError: return None
[docs] def get_qtd_total_programada(self, obj): valor = numero_com_agrupador_de_milhar_e_decimal(obj.qtd_total_programada) return ( f"{valor} {obj.unidade_medida.abreviacao}" if obj.unidade_medida else valor )
[docs] def get_peso_liquido_embalagem_primaria(self, obj): try: return f"{obj.ficha_tecnica.peso_liquido_embalagem_primaria} {obj.ficha_tecnica.unidade_medida_primaria.abreviacao}" except AttributeError: return None
[docs] def get_peso_liquido_embalagem_secundaria(self, obj): try: return f"{obj.ficha_tecnica.peso_liquido_embalagem_secundaria} {obj.ficha_tecnica.unidade_medida_secundaria.abreviacao}" except AttributeError: return None
[docs] def get_embalagem_primaria(self, obj): return ( obj.ficha_tecnica.material_embalagem_primaria if obj.ficha_tecnica else None )
[docs] def get_embalagem_secundaria(self, obj): return ( obj.ficha_tecnica.sistema_vedacao_embalagem_secundaria if obj.ficha_tecnica else None )
[docs] def get_categoria(self, obj): return obj.ficha_tecnica.categoria if obj.ficha_tecnica else None
[docs] def get_documentos_de_recebimento(self, obj): return DocRecebimentoFichaDeRecebimentoSerializer( obj.documentos_de_recebimento.filter( status=DocumentoDeRecebimentoWorkflow.APROVADO ), many=True, ).data
[docs] def get_sistema_vedacao_embalagem_secundaria(self, obj): return ( obj.ficha_tecnica.sistema_vedacao_embalagem_secundaria if obj.ficha_tecnica else None )
[docs] def get_programa_leve_leite(self, obj): try: return obj.ficha_tecnica.programa == "LEVE_LEITE" except AttributeError: return False
[docs] class Meta: model = Cronograma fields = ( "uuid", "fornecedor", "contrato", "pregao_chamada_publica", "ata", "produto", "marca", "qtd_total_programada", "peso_liquido_embalagem_primaria", "peso_liquido_embalagem_secundaria", "embalagem_primaria", "embalagem_secundaria", "categoria", "etapas", "documentos_de_recebimento", "sistema_vedacao_embalagem_secundaria", "programa_leve_leite", "numero_chamada_publica", )
[docs] class EtapaCronogramaRelatorioSerializer(serializers.ModelSerializer): numero_cronograma = serializers.SerializerMethodField() produto = serializers.SerializerMethodField() empresa = serializers.SerializerMethodField() marca = serializers.SerializerMethodField() qtd_total_programada = serializers.SerializerMethodField() unidade_medida = serializers.SerializerMethodField() custo_unitario_produto = serializers.SerializerMethodField() armazem = serializers.SerializerMethodField() status_cronograma = serializers.SerializerMethodField() total_embalagens = serializers.SerializerMethodField() situacao = serializers.SerializerMethodField() etapa = serializers.SerializerMethodField() parte = serializers.SerializerMethodField() numero_empenho = serializers.SerializerMethodField() data_programada = serializers.SerializerMethodField()
[docs] def get_data_programada(self, obj): if not obj.data_programada: return None if obj.cronograma and obj.cronograma.ponto_a_ponto: return obj.data_programada.strftime("%m/%Y") return obj.data_programada.strftime("%d/%m/%Y")
[docs] def get_etapa(self, obj): return f"Etapa {obj.etapa}" if obj.etapa is not None else None
[docs] def get_parte(self, obj): return f"Parte {obj.parte}" if obj.parte is not None else None
[docs] def get_numero_cronograma(self, obj): try: return obj.cronograma.numero except AttributeError: return "-"
[docs] def get_produto(self, obj): try: return obj.cronograma.ficha_tecnica.produto.nome except AttributeError: return "-"
[docs] def get_empresa(self, obj): try: return obj.cronograma.empresa.nome_fantasia except AttributeError: return "-"
[docs] def get_marca(self, obj): try: return obj.cronograma.ficha_tecnica.marca.nome except AttributeError: return "-"
[docs] def get_qtd_total_programada(self, obj): try: return obj.cronograma.qtd_total_programada except AttributeError: return "-"
[docs] def get_unidade_medida(self, obj): try: return obj.cronograma.unidade_medida.abreviacao except AttributeError: return "-"
[docs] def get_custo_unitario_produto(self, obj): return ( f"R$ {numero_com_agrupador_de_milhar_e_decimal(obj.cronograma.custo_unitario_produto)}" if obj.cronograma.custo_unitario_produto else "-" )
[docs] def get_armazem(self, obj): try: return obj.cronograma.armazem.nome_fantasia except AttributeError: return "-"
[docs] def get_status_cronograma(self, obj): try: return obj.cronograma.get_status_display() except AttributeError: return "-"
[docs] def get_total_embalagens(self, obj): try: return f"{obj.total_embalagens} {obj.cronograma.tipo_embalagem_secundaria.abreviacao}" except AttributeError: return "-"
[docs] def get_situacao(self, obj): return "-"
[docs] def get_numero_empenho(self, obj): try: return obj.numero_empenho except AttributeError: return "-"
[docs] class Meta: model = EtapasDoCronograma fields = ( "numero_cronograma", "produto", "empresa", "marca", "qtd_total_programada", "unidade_medida", "custo_unitario_produto", "armazem", "status_cronograma", "etapa", "parte", "data_programada", "quantidade", "total_embalagens", "situacao", )
[docs] class CronogramaRelatorioSerializer(serializers.ModelSerializer): etapas = EtapasDoCronogramaFichaDeRecebimentoSerializer(many=True) numero_contrato = serializers.SerializerMethodField() numero_processo = serializers.SerializerMethodField() produto = serializers.SerializerMethodField() empresa = serializers.SerializerMethodField() armazem = serializers.SerializerMethodField() marca = serializers.SerializerMethodField() custo_unitario_produto = serializers.SerializerMethodField() status = serializers.CharField(source="get_status_display") programa_leve_leite = serializers.SerializerMethodField() modalidade = serializers.SerializerMethodField()
[docs] def get_programa_leve_leite(self, obj): try: return obj.ficha_tecnica.programa == "LEVE_LEITE" except AttributeError: return False
[docs] def get_numero_contrato(self, obj): try: return obj.contrato.numero except AttributeError: return None
[docs] def get_numero_processo(self, obj): try: return obj.contrato.processo except AttributeError: return None
[docs] def get_produto(self, obj): try: return obj.ficha_tecnica.produto.nome except AttributeError: return None
[docs] def get_empresa(self, obj): try: return obj.empresa.nome_fantasia except AttributeError: return None
[docs] def get_armazem(self, obj): try: return obj.armazem.nome_fantasia except AttributeError: return None
[docs] def get_marca(self, obj): try: return obj.ficha_tecnica.marca.nome if obj.ficha_tecnica else None except AttributeError: return None
[docs] def get_custo_unitario_produto(self, obj): return ( f"R$ {numero_com_agrupador_de_milhar_e_decimal(obj.custo_unitario_produto)}" if obj.custo_unitario_produto else None )
[docs] def get_modalidade(self, obj): if not obj.contrato: return "Não Informado" if not obj.contrato.modalidade: return "Não Informado" return obj.contrato.modalidade.nome or "Não Informado"
[docs] class Meta: model = Cronograma fields = ( "uuid", "numero", "numero_contrato", "numero_processo", "produto", "empresa", "qtd_total_programada", "armazem", "status", "marca", "custo_unitario_produto", "etapas", "programa_leve_leite", "modalidade", )
[docs] class PainelCronogramaSerializer(serializers.ModelSerializer): produto = serializers.SerializerMethodField() empresa = serializers.SerializerMethodField() log_mais_recente = serializers.SerializerMethodField() status = serializers.CharField(source="get_status_display") programa_leve_leite = serializers.SerializerMethodField() ponto_a_ponto = serializers.BooleanField(read_only=True)
[docs] def get_produto(self, obj): try: return obj.ficha_tecnica.produto.nome except AttributeError: return None
[docs] def get_empresa(self, obj): return obj.empresa.nome_fantasia if obj.empresa else None
[docs] def get_log_mais_recente(self, obj): if obj.log_mais_recente: if obj.log_mais_recente.criado_em.date() == datetime.date.today(): return datetime.datetime.strftime( obj.log_mais_recente.criado_em, "%d/%m/%Y %H:%M" ) return datetime.datetime.strftime( obj.log_mais_recente.criado_em, "%d/%m/%Y" ) else: return datetime.datetime.strftime(obj.criado_em, "%d/%m/%Y")
[docs] def get_programa_leve_leite(self, obj): try: return obj.ficha_tecnica.programa == "LEVE_LEITE" except AttributeError: return None
[docs] class Meta: model = Cronograma fields = ( "uuid", "numero", "status", "empresa", "produto", "log_mais_recente", "programa_leve_leite", "ponto_a_ponto", )
[docs] class PainelSolicitacaoAlteracaoCronogramaSerializerItem(serializers.ModelSerializer): empresa = serializers.CharField(source="cronograma.empresa") cronograma = serializers.CharField(source="cronograma.numero") produto = serializers.SerializerMethodField() status = serializers.CharField(source="get_status_display") log_mais_recente = serializers.SerializerMethodField() programa_leve_leite = serializers.SerializerMethodField() ponto_a_ponto = serializers.SerializerMethodField()
[docs] def get_produto(self, obj): try: return obj.cronograma.ficha_tecnica.produto.nome except AttributeError: return None
[docs] def get_log_mais_recente(self, obj): if obj.log_criado_em: if obj.log_criado_em.date() == datetime.date.today(): return datetime.datetime.strftime(obj.log_criado_em, "%d/%m/%Y %H:%M") return datetime.datetime.strftime(obj.log_criado_em, "%d/%m/%Y") else: return datetime.datetime.strftime(obj.log_criado_em, "%d/%m/%Y")
[docs] def get_programa_leve_leite(self, obj): try: return obj.cronograma.ficha_tecnica.programa == "LEVE_LEITE" except AttributeError: return None
[docs] def get_ponto_a_ponto(self, obj): try: return obj.cronograma.ponto_a_ponto except AttributeError: return False
[docs] class Meta: model = SolicitacaoAlteracaoCronograma fields = ( "uuid", "numero_solicitacao", "empresa", "status", "cronograma", "produto", "log_mais_recente", "programa_leve_leite", "ponto_a_ponto", )
[docs] class PainelSolicitacaoAlteracaoCronogramaSerializer(serializers.Serializer): status = serializers.CharField() dados = serializers.SerializerMethodField() total = serializers.IntegerField(allow_null=True)
[docs] def get_dados(self, obj): return PainelSolicitacaoAlteracaoCronogramaSerializerItem( obj["dados"], many=True ).data
[docs] class Meta: model = SolicitacaoAlteracaoCronograma fields = ("uuid", "status", "total", "dados")
[docs] def to_representation(self, instance): result = super( PainelSolicitacaoAlteracaoCronogramaSerializer, self ).to_representation(instance) return OrderedDict( [(key, result[key]) for key in result if result[key] is not None] )
[docs] class InterrupcaoProgramadaEntregaSerializer(serializers.ModelSerializer): motivo_display = serializers.CharField(source="get_motivo_display", read_only=True) tipo_calendario_display = serializers.CharField( source="get_tipo_calendario_display", read_only=True )
[docs] class Meta: model = InterrupcaoProgramadaEntrega fields = [ "uuid", "data", "motivo", "motivo_display", "descricao_motivo", "tipo_calendario", "tipo_calendario_display", ]
[docs] class InterrupcaoProgramadaEntregaCreateSerializer(serializers.ModelSerializer):
[docs] class Meta: model = InterrupcaoProgramadaEntrega fields = ["data", "motivo", "descricao_motivo", "tipo_calendario"]
[docs] def validate(self, attrs): if attrs.get("motivo") == "OUTROS" and not attrs.get("descricao_motivo"): raise serializers.ValidationError( {"descricao_motivo": "Descrição é obrigatória quando motivo é 'Outros'"} ) return attrs
[docs] class CronogramaMensalAssinadoSerializer(serializers.ModelSerializer): """Serializer para listar cronogramas mensal Ponto a Ponto assinados""" produto_nome = serializers.SerializerMethodField() fornecedor_nome = serializers.SerializerMethodField() numero_contrato = serializers.SerializerMethodField()
[docs] def get_produto_nome(self, obj): if obj.ficha_tecnica and obj.ficha_tecnica.produto: return obj.ficha_tecnica.produto.nome return None
[docs] def get_fornecedor_nome(self, obj): if obj.empresa: return obj.empresa.nome_fantasia return None
[docs] def get_numero_contrato(self, obj): if obj.contrato: return obj.contrato.numero return None
[docs] class Meta: model = Cronograma fields = ( "uuid", "numero", "produto_nome", "fornecedor_nome", "numero_contrato", )
[docs] class CronogramaDetalhePosRecebimentoSerializer(serializers.ModelSerializer): """Dados do cronograma para preenchimento automático do cadastro do Termo de Recebimento Definitivo (Pós-Recebimento). Produto e unidade de medida vêm da ficha técnica; o número do processo SEI vem do contrato vinculado ao cronograma. As relações são opcionais (blank/null) e os campos são protegidos contra ausência. """ produto = serializers.SerializerMethodField() processo_sei = serializers.SerializerMethodField() unidade_medida = serializers.SerializerMethodField() unidade_medida_abreviacao = serializers.SerializerMethodField()
[docs] def get_produto(self, obj): if obj.ficha_tecnica and obj.ficha_tecnica.produto: return obj.ficha_tecnica.produto.nome return None
[docs] def get_processo_sei(self, obj): if obj.contrato: return obj.contrato.processo return None
[docs] def get_unidade_medida(self, obj): if obj.unidade_medida: return obj.unidade_medida.nome return None
[docs] def get_unidade_medida_abreviacao(self, obj): if obj.unidade_medida: return obj.unidade_medida.abreviacao return None
[docs] class Meta: model = Cronograma fields = ( "uuid", "numero", "produto", "processo_sei", "unidade_medida", "unidade_medida_abreviacao", ) read_only_fields = fields