models ====== .. automodule:: src.pos_recebimento.models :members: :show-inheritance: :exclude-members: TermoRecebimentoDefinitivo, CronogramaTermoRecebimentoDefinitivo, DoesNotExist, MultipleObjectsReturned TermoRecebimentoDefinitivo -------------------------- O Termo de Recebimento Definitivo é o documento que formaliza o recebimento definitivo (físico e financeiro) de produtos de uma empresa/contrato no módulo Pós-Recebimento. Ele registra a entrega final de um conjunto de cronogramas de entrega, nomeia os fiscais responsáveis (três usuários com perfil ``DILOG_QUALIDADE``) e carrega o texto do termo (conteúdo rico, ex.: HTML gerado por um editor de texto). Regras de negócio da criação: - A **empresa** deve possuir ao menos uma ficha de recebimento com status "Assinado CODAE" (``FichaDeRecebimentoWorkflow.ASSINADA``). Essa regra é aplicada tanto na listagem de empresas disponíveis (``/terceirizadas/lista-empresas-pos-recebimento/``) quanto na validação do payload de criação do termo. - O **contrato** deve pertencer à empresa selecionada (``contrato.terceirizada == empresa``). - Cada **cronograma** deve pertencer ao contrato e à empresa selecionados e não pode ser repetido no mesmo payload. - Os **fiscais** devem possuir vínculo ativo com o perfil ``DILOG_QUALIDADE``. - O **texto do termo** é obrigatório e deve conter conteúdo textual após a remoção das tags HTML (não basta apenas ``

``). - A criação via API **sempre persiste o termo com status ``ENVIADO``** (fluxo "Salvar e Enviar"), independentemente do default do modelo (``RASCUNHO``). O status ``RASCUNHO`` existe no modelo, mas não é utilizado pela API atual. Cada cronograma do termo carrega o seu próprio **valor de contrato** e **quantidade total recebida** (valores decimais de até 15 dígitos com 2 casas decimais), armazenados no modelo intermediário :class:`CronogramaTermoRecebimentoDefinitivo` — ambos devem ser maiores que zero. .. autoclass:: TermoRecebimentoDefinitivo :members: :show-inheritance: :exclude-members: DoesNotExist, ENVIADO, MultipleObjectsReturned, RASCUNHO, STATUS_CHOICES, alterado_em, alterado_por, alterado_por_id, contrato, contrato_id, criado_em, criado_por, criado_por_id, cronogramas, cronogramas_termo, empresa, empresa_id, fiscal_1, fiscal_1_id, fiscal_2, fiscal_2_id, fiscal_3, fiscal_3_id, get_next_by_alterado_em, get_next_by_criado_em, get_previous_by_alterado_em, get_previous_by_criado_em, get_status_display, id, objects, status, termos_recebimento_definitivo_alterados, termos_recebimento_definitivo_fiscal_1, termos_recebimento_definitivo_fiscal_2, termos_recebimento_definitivo_fiscal_3, texto_termo, uuid .. attribute:: id :type: int **Origem:** ``dados_comuns/behaviors.py`` (``ModeloBase``) **Descrição:** Chave primária inteira criada automaticamente pelo Django para identificar o termo. .. attribute:: uuid :type: uuid.UUID **Origem:** ``dados_comuns/behaviors.py`` (``TemChaveExterna``) **Descrição:** Identificador externo único do termo, usado em integrações, endpoints que expõem UUID e como referência nas mensagens de log. .. attribute:: empresa :type: terceirizada.Terceirizada **Descrição:** Empresa fornecedora responsável pelas entregas formalizadas no termo. Campo obrigatório com ``on_delete=PROTECT`` (não pode ser removida enquanto houver termo vinculado). Regra de negócio: a empresa deve possuir ao menos uma ficha de recebimento "Assinado CODAE" (``FichaDeRecebimentoWorkflow.ASSINADA``) para ser utilizada em um termo. .. attribute:: contrato :type: terceirizada.Contrato **Descrição:** Contrato ao qual as entregas pertencem. Campo obrigatório com ``on_delete=PROTECT``. Regra de negócio: o contrato deve pertencer à empresa selecionada (``contrato.terceirizada == empresa``). .. attribute:: cronogramas :type: django.db.models.QuerySet[Cronograma] **Descrição:** Relação M:N com :class:`Cronograma ` através do modelo intermediário :class:`CronogramaTermoRecebimentoDefinitivo`. Lista os cronogramas de entrega formalizados no termo. Cada vínculo carrega o ``valor_contrato`` e a ``quantidade_total_recebida`` específicos daquele cronograma (ver ``cronogramas_termo``). Regra de negócio: cada cronograma deve pertencer ao contrato e à empresa selecionados e não pode ser repetido no mesmo termo (``unique_together`` entre ``termo`` e ``cronograma``). .. attribute:: cronogramas_termo :type: django.db.models.QuerySet[CronogramaTermoRecebimentoDefinitivo] **Descrição:** Relação reversa 1:N com :class:`CronogramaTermoRecebimentoDefinitivo` (``related_name="cronogramas_termo"``). Acesso direto às linhas intermediárias do termo, incluindo o valor de contrato e a quantidade total recebida de cada cronograma. É a fonte utilizada pelo serializador de saída para expor os cronogramas com seus valores. .. attribute:: fiscal_1 :type: perfil.Usuario **Descrição:** Primeiro fiscal responsável pelo recebimento. Campo obrigatório com ``on_delete=PROTECT`` (usuário não pode ser removido enquanto houver termo vinculado). Regra de negócio: o usuário deve possuir vínculo ativo com o perfil ``DILOG_QUALIDADE``. .. attribute:: fiscal_2 :type: perfil.Usuario **Descrição:** Segundo fiscal responsável pelo recebimento. Mesmas regras de ``fiscal_1`` (obrigatório, ``on_delete=PROTECT``, perfil ``DILOG_QUALIDADE`` com vínculo ativo). .. attribute:: fiscal_3 :type: perfil.Usuario **Descrição:** Terceiro fiscal responsável pelo recebimento. Mesmas regras de ``fiscal_1`` (obrigatório, ``on_delete=PROTECT``, perfil ``DILOG_QUALIDADE`` com vínculo ativo). .. attribute:: texto_termo :type: str **Descrição:** Texto do termo em conteúdo rico (aceita HTML, ex.: produzido por editor de texto). Obrigatório e deve conter conteúdo textual após a remoção das tags HTML. .. attribute:: status :type: str **Descrição:** Status do termo. Valores possíveis: ``RASCUNHO`` (Rascunho) e ``ENVIADO`` (Enviado). O default do modelo é ``RASCUNHO``, porém a criação via API **sempre persiste ``ENVIADO``** (fluxo "Salvar e Enviar"). .. attribute:: criado_por :type: perfil.Usuario | None **Origem:** ``dados_comuns/behaviors.py`` (``CriadoPor``) **Descrição:** Usuário que criou o termo. Preenchido com o usuário autenticado da requisição no momento da criação via API. .. attribute:: alterado_por :type: perfil.Usuario | None **Descrição:** Usuário que realizou a última alteração do termo. Preenchido com o usuário autenticado da requisição no momento da criação via API (mesmo usuário de ``criado_por`` na criação). .. attribute:: criado_em :type: datetime.datetime **Origem:** ``dados_comuns/behaviors.py`` (``CriadoEm``) **Descrição:** Timestamp preenchido automaticamente na criação do termo. .. attribute:: alterado_em :type: datetime.datetime **Origem:** ``dados_comuns/behaviors.py`` (``TemAlteradoEm``) **Descrição:** Timestamp preenchido automaticamente na última alteração do termo. CronogramaTermoRecebimentoDefinitivo ------------------------------------ Modelo intermediário (through) que vincula um :class:`TermoRecebimentoDefinitivo` a um :class:`Cronograma `. Como cada cronograma de um termo pode ter valores financeiros próprios, o valor de contrato e a quantidade total recebida são armazenados **neste modelo** (por cronograma) e não no termo. O mesmo cronograma não pode aparecer duas vezes no mesmo termo (``unique_together`` entre ``termo`` e ``cronograma``). Regras de negócio na criação: - ``valor_contrato`` deve ser maior que zero. - ``quantidade_total_recebida`` deve ser maior que zero. - O cronograma deve pertencer ao contrato e à empresa selecionados no termo. .. autoclass:: CronogramaTermoRecebimentoDefinitivo :members: :show-inheritance: :exclude-members: DoesNotExist, MultipleObjectsReturned, cronograma, cronograma_id, id, objects, quantidade_total_recebida, termo, termo_id, valor_contrato .. attribute:: id :type: int **Descrição:** Chave primária inteira criada automaticamente pelo Django para identificar o vínculo. .. attribute:: termo :type: TermoRecebimentoDefinitivo **Descrição:** Termo de Recebimento Definitivo ao qual o vínculo pertence. ``on_delete=CASCADE``: ao remover o termo, os vínculos são removidos junto. .. attribute:: cronograma :type: Cronograma **Descrição:** Cronograma de entrega vinculado ao termo. ``on_delete=PROTECT``: o cronograma não pode ser removido enquanto houver termo vinculado. .. attribute:: valor_contrato :type: decimal.Decimal **Descrição:** Valor de contrato (em reais) relativo a este cronograma dentro do termo. Decimal com até 15 dígitos e 2 casas decimais. Deve ser maior que zero. .. attribute:: quantidade_total_recebida :type: decimal.Decimal **Descrição:** Quantidade total recebida relativa a este cronograma dentro do termo. Decimal com até 15 dígitos e 2 casas decimais. Deve ser maior que zero.