import datetime
from django.db.models import Sum
from rest_framework import serializers
from src.pre_recebimento.base.api.serializers.serializers import (
UnidadeMedidaSimplesSerializer,
)
from src.pre_recebimento.documento_recebimento.models import (
ArquivoDoTipoDeDocumento,
DataDeFabricaoEPrazo,
DocumentoDeRecebimento,
TipoDeDocumentoDeRecebimento,
)
from src.pre_recebimento.qualidade.api.serializers.serializers import (
LaboratorioCredenciadoSimplesSerializer,
)
from src.recebimento.ajuste_saldo_laudo.models import AjusteSaldo
from src.recebimento.models import DocumentoFichaDeRecebimento
from .....dados_comuns.api.serializers import (
LogSolicitacoesUsuarioSimplesSerializer,
)
[docs]
def calcular_saldo_laudo(documento_recebimento):
from decimal import Decimal
total_recebido = (
DocumentoFichaDeRecebimento.objects.filter(
documento_recebimento=documento_recebimento,
ficha_recebimento__status="ASSINADA",
).aggregate(total=Sum("quantidade_recebida"))["total"]
or 0
)
total_recebido = DocumentoFichaDeRecebimento.objects.filter(
documento_recebimento=documento_recebimento,
ficha_recebimento__status="ASSINADA",
quantidade_recebida__isnull=False,
).aggregate(total=Sum("quantidade_recebida"))["total"]
if total_recebido is None:
total_recebido = Decimal("0.00")
else:
total_recebido = Decimal(str(total_recebido))
total_ajustes = AjusteSaldo.objects.filter(
documento_recebimento=documento_recebimento
).aggregate(total=Sum("quantidade_descontada"))["total"]
if total_ajustes is None:
total_ajustes = Decimal("0.00")
else:
total_ajustes = Decimal(str(total_ajustes))
quantidade_laudo = documento_recebimento.quantidade_laudo
if quantidade_laudo is None:
quantidade_laudo = Decimal("0.00")
else:
quantidade_laudo = Decimal(str(quantidade_laudo))
return quantidade_laudo - total_recebido - total_ajustes
[docs]
class DocRecebimentoFichaDeRecebimentoSerializer(serializers.ModelSerializer):
datas_fabricacao = serializers.SerializerMethodField()
datas_validade = serializers.SerializerMethodField()
quantidade_recebida = serializers.SerializerMethodField()
saldo_laudo = serializers.SerializerMethodField()
[docs]
def get_datas_fabricacao(self, obj):
try:
return ", ".join(
[
d.strftime("%d/%m/%Y")
for d in obj.datas_fabricacao_e_prazos.values_list(
"data_fabricacao", flat=True
)
]
)
except AttributeError:
return None
[docs]
def get_datas_validade(self, obj):
try:
return ", ".join(
[
d.strftime("%d/%m/%Y")
for d in obj.datas_fabricacao_e_prazos.values_list(
"data_validade", flat=True
)
]
)
except AttributeError:
return None
[docs]
def get_quantidade_recebida(self, obj):
if hasattr(self, "context") and "ficha_recebimento" in self.context:
ficha = self.context["ficha_recebimento"]
try:
documento_ficha = obj.fichas_documentos.get(ficha_recebimento=ficha)
return documento_ficha.quantidade_recebida
except Exception as e:
return e
return None
[docs]
def get_saldo_laudo(self, obj):
return calcular_saldo_laudo(obj)
[docs]
class DocumentoDeRecebimentoSerializer(serializers.ModelSerializer):
criado_em = serializers.SerializerMethodField()
numero_cronograma = serializers.SerializerMethodField()
pregao_chamada_publica = serializers.SerializerMethodField()
nome_produto = serializers.SerializerMethodField()
programa_leve_leite = serializers.SerializerMethodField()
status = serializers.CharField(source="get_status_display")
[docs]
def get_numero_cronograma(self, obj):
return obj.cronograma.numero if obj.cronograma else None
[docs]
def get_pregao_chamada_publica(self, obj):
return (
obj.cronograma.contrato.pregao_chamada_publica
if obj.cronograma.contrato
else None
)
[docs]
def get_nome_produto(self, obj):
try:
return obj.cronograma.ficha_tecnica.produto.nome
except AttributeError:
None
[docs]
def get_criado_em(self, obj):
return obj.criado_em.strftime("%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]
class PainelDocumentoDeRecebimentoSerializer(serializers.ModelSerializer):
numero_cronograma = serializers.CharField(source="cronograma.numero")
nome_produto = serializers.SerializerMethodField()
nome_empresa = serializers.SerializerMethodField()
status = serializers.CharField(source="get_status_display")
log_mais_recente = serializers.SerializerMethodField()
programa_leve_leite = serializers.SerializerMethodField()
[docs]
def get_nome_produto(self, obj):
try:
return obj.cronograma.ficha_tecnica.produto.nome
except AttributeError:
return ""
[docs]
def get_nome_empresa(self, obj):
try:
return obj.cronograma.empresa.nome_fantasia
except AttributeError:
return ""
[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.cronograma.ficha_tecnica.programa == "LEVE_LEITE"
except AttributeError:
return None
[docs]
class ArquivoDoTipoDeDocumentoLookupSerializer(serializers.ModelSerializer):
[docs]
class TipoDocumentoDeRecebimentoLookupSerializer(serializers.ModelSerializer):
arquivos = ArquivoDoTipoDeDocumentoLookupSerializer(many=True)
[docs]
class DocRecebimentoDetalharSerializer(serializers.ModelSerializer):
criado_em = serializers.SerializerMethodField()
numero_cronograma = serializers.SerializerMethodField()
pregao_chamada_publica = serializers.SerializerMethodField()
nome_produto = serializers.SerializerMethodField()
status = serializers.CharField(source="get_status_display")
tipos_de_documentos = TipoDocumentoDeRecebimentoLookupSerializer(many=True)
logs = LogSolicitacoesUsuarioSimplesSerializer(many=True)
programa_leve_leite = serializers.SerializerMethodField()
[docs]
def get_numero_cronograma(self, obj):
return obj.cronograma.numero if obj.cronograma else None
[docs]
def get_pregao_chamada_publica(self, obj):
return (
obj.cronograma.contrato.pregao_chamada_publica
if obj.cronograma.contrato
else None
)
[docs]
def get_nome_produto(self, obj):
try:
return obj.cronograma.ficha_tecnica.produto.nome
except AttributeError:
return None
[docs]
def get_criado_em(self, obj):
return obj.criado_em.strftime("%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]
class DataDeFabricacaoEPrazoLookupSerializer(serializers.ModelSerializer):
[docs]
class DocRecebimentoDetalharCodaeSerializer(DocRecebimentoDetalharSerializer):
laboratorio = LaboratorioCredenciadoSimplesSerializer()
unidade_medida = UnidadeMedidaSimplesSerializer()
datas_fabricacao_e_prazos = DataDeFabricacaoEPrazoLookupSerializer(many=True)
numero_sei = serializers.SerializerMethodField()
fornecedor = serializers.SerializerMethodField()
saldo_laudo = serializers.SerializerMethodField()
[docs]
def get_numero_sei(self, obj):
return obj.cronograma.contrato.processo if obj.cronograma.contrato else None
[docs]
def get_fornecedor(self, obj):
return obj.cronograma.empresa.nome_fantasia if obj.cronograma.empresa else None
[docs]
def get_saldo_laudo(self, obj):
return calcular_saldo_laudo(obj)
[docs]
class DocumentoDeRecebimentoDetalheRelatorioSerializer(serializers.ModelSerializer):
nome_laboratorio = serializers.CharField(source="laboratorio.nome", read_only=True)
unidade_medida = serializers.CharField(
source="unidade_medida.abreviacao", read_only=True
)
datas_fabricacao_e_prazos = DataDeFabricacaoEPrazoLookupSerializer(
many=True, read_only=True
)
status_documento = serializers.CharField(
source="get_status_display", read_only=True
)
saldo_inicial_laudo = serializers.DecimalField(
source="quantidade_laudo", max_digits=15, decimal_places=2, read_only=True
)
saldo_atual = serializers.SerializerMethodField()
[docs]
def get_saldo_atual(self, obj):
return calcular_saldo_laudo(obj)
[docs]
class CronogramaRelatorioDocumentosSerializer(serializers.Serializer):
uuid = serializers.UUIDField(read_only=True)
numero_cronograma = serializers.CharField(source="numero", read_only=True)
produto = serializers.CharField(source="ficha_tecnica.produto.nome", read_only=True)
empresa = serializers.CharField(source="empresa.razao_social", read_only=True)
numero_pregao_chamada_publica = serializers.SerializerMethodField()
numero_processo_sei = serializers.CharField(
source="contrato.processo", read_only=True
)
documentos = serializers.SerializerMethodField()
[docs]
def get_numero_pregao_chamada_publica(self, obj):
return obj.contrato.numero_pregao if obj.contrato else None
[docs]
def get_documentos(self, obj):
docs = obj.documentos_de_recebimento.select_related(
"laboratorio", "unidade_medida"
).prefetch_related("datas_fabricacao_e_prazos")
return DocumentoDeRecebimentoDetalheRelatorioSerializer(docs, many=True).data
[docs]
class DocumentoDeRecebimentoParaAjusteSaldoSerializer(serializers.ModelSerializer):
unidade_medida = serializers.CharField(
source="unidade_medida.abreviacao", read_only=True
)
saldo_atual = serializers.SerializerMethodField()
[docs]
def get_saldo_atual(self, obj):
return calcular_saldo_laudo(obj)