From d882719549ea809f7fbd2583ff67e5569768368f Mon Sep 17 00:00:00 2001 From: itecnologys Date: Wed, 7 Oct 2026 10:38:24 +0000 Subject: [PATCH] docs: Rently cycle spec - autosave, stale, drafts cleanup, admin reopen Co-Authored-By: Claude Opus 5.5 --- Infra-Network/SPEC-CLOSING-TILL-CYCLE.md | 31 +++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/Infra-Network/SPEC-CLOSING-TILL-CYCLE.md b/Infra-Network/SPEC-CLOSING-TILL-CYCLE.md index b686cde..5cac75f 100644 --- a/Infra-Network/SPEC-CLOSING-TILL-CYCLE.md +++ b/Infra-Network/SPEC-CLOSING-TILL-CYCLE.md @@ -26,6 +26,14 @@ O congelamento **definitivo** acontece **só** no **Send to HO**. - Pode salvar **várias vezes** no mesmo dia (correcções, lançamentos esquecidos). - O ficheiro fica **editável** (não imutável) enquanto o ciclo a que pertence não foi enviado ao HO. +### R1a — Auto-save às 23:55 (se o operador esquecer) +- Um job diário às **23:55 (hora local, Europe/Dublin)** verifica o dia: + - se há movimentos e **nenhum** statement salvo, **ou** o último save está **desactualizado** (R3a) → faz o **Save statement automaticamente** (salvo por `system (auto 23:55)`); + - envia aviso para **admin@myvexx.com** com a lista do que foi salvo automaticamente (dia, nº do ficheiro, total, nº de movimentos). +- Assim cada dia começa com os ficheiros do dia anterior salvos. +- O auto-save **não** faz *Save EOD for Closing Till* (o corte é sempre um acto do operador). +- Implementação: timer systemd `rently-prod-eod-autosave.timer` (padrão dos jobs existentes), `OnCalendar=*-*-* 23:55 Europe/Dublin`. + ### R2 — Save EOD for Closing Till (dia de fecho: quinta ou outro dia escolhido) - Faz o mesmo que o Save statement **e** marca a hora do clique, colocando a **linha de corte** após o último lançamento: - **before-cut** (00:00 → corte) = este ciclo; @@ -47,11 +55,21 @@ Lista **todos** os ficheiros do ciclo aberto: - Ficheiros de ciclos já enviados não aparecem. - Nada vem pré-seleccionado; *used · applied* só depois de marcar + **Apply start & preview**. +### R3a — Ficheiro desactualizado +- Se houver lançamento ou correcção num dia **depois** do último save desse dia, o ficheiro aparece no Cycle Start com o selo **"desactualizado — salve de novo"** (com o nº de movimentos novos). +- O auto-save das 23:55 (R1a) re-salva automaticamente estes casos. + ### R4 — Apply start & preview / Generate draft - **Apply start & preview** une os ficheiros marcados num **ficheiro único** (preview). Pode repetir-se. - **Generate draft** gera um draft a partir de uma selecção de cada vez. - Pode haver **vários drafts**; **os drafts não trancam ficheiros** (os mesmos ficheiros podem estar em vários drafts). Só um será usado; os outros ficam para leitura e podem ser apagados. +### R4a — Limpeza de drafts não usados (card "Drafts" já existente no Closing Till) +- O card **Drafts (n)** passa a mostrar em cada draft o estado: **Em uso** (é o pacote em freeze temporário ou enviado) ou **Não usado**. +- Drafts **Não usados** têm **Delete** individual e um botão **"Apagar todos os não usados"** (com confirmação), para evitar lixo na base. +- Drafts **Em uso** não podem ser apagados. +- Depois do **Send to HO**, o card sugere apagar os drafts não usados daquele ciclo. + ### R5 — Freeze temporário (Closing Till) — OBRIGATÓRIO antes do Remittance Pack - O operador escolhe **um** draft e faz **Freeze** → estado **Temporarily frozen**. - Trava os ficheiros e valores desse pacote, para que o envelope e o pack batam com o que vai ser enviado (edições nesses dias ficam bloqueadas com mensagem). @@ -70,7 +88,11 @@ Lista **todos** os ficheiros do ciclo aberto: ### R7 — Approve selected ROI → Send to HO (congelamento DEFINITIVO) - Neste momento os ficheiros do pacote (incluindo o **before-cut**) passam a **Frozen · Sent**: imutáveis, indisponíveis para novos ciclos. - O **after-cut** **não** fica congelado — pertence ao próximo ciclo (R3.1). -- Depois do envio **só o admin** pode reverter, como excepção registada em auditoria (motivo obrigatório). +- Depois do envio **só o admin** pode reverter, como excepção: + - **motivo obrigatório**, registado em auditoria; + - fica um registo visível no **ROI Archive** e o pacote é marcado **"Re-aberto"**, para o HO saber que haverá reenvio; + - os ficheiros voltam ao estado *Temporarily frozen* (não a editáveis) até novo envio ou unfreeze. +- Só existe **um** pacote em freeze temporário por ciclo; para trocar de draft é preciso libertar o freeze primeiro. ### R8 — Lançamentos atrasados em dias enviados - Por regra **nada entra** nos ficheiros imutáveis/enviados. Um lançamento num dia já enviado é bloqueado. @@ -103,6 +125,10 @@ Lista **todos** os ficheiros do ciclo aberto: | Corte | carimbado pelo Freeze | carimbado pelo **Save EOD for Closing Till** | | 2.º clique no dia de fecho | sem tratamento | aviso + substituir enquanto não enviado | | Remittance Pack sem freeze | sem aviso | aviso + Create Official Draft desactivado | +| Dia sem statement salvo | dinheiro fica fora do Cycle Start | **auto-save 23:55** + email admin@myvexx.com | +| Statement desactualizado | sem aviso | selo "desactualizado — salve de novo" | +| Drafts não usados | Delete um a um | estado Em uso / Não usado + "Apagar todos os não usados" | +| Reversão após envio | impossível | só admin, motivo + ROI Archive "Re-aberto" | --- @@ -114,5 +140,8 @@ Lista **todos** os ficheiros do ciclo aberto: - `unfreeze_eow_report`: permitir operador quando não enviado; não limpar `closing_till_cut`; admin com motivo depois do envio. - `eod_report`: *Save EOD for Closing Till* gera before/after + aviso de 2.º clique. - Remittance Pack (frontend + API): aviso R6 e bloqueio de *Create Official Draft*. +- Auto-save (R1a): job `app/jobs/eod_autosave.py` + `send_email` (já existe em `modules/users/service.py`) + timer systemd 23:55 Europe/Dublin (VM em UTC). +- Card Drafts (R4a): estado Em uso / Não usado + apagar em massa (API protege drafts em uso). +- Reversão admin (R7): motivo, evento de auditoria, marca "Re-aberto" no ROI Archive. - Testes de regressão: reescrever `tests/test_eow_cycle_start_rules.py` para esta versão. - Ao implementar: actualizar `.cursor/rules/eow-cycle-start-rules.mdc` para apontar para esta spec.