Исходящие: удаление черновика (кнопка в карточке и в журнале) — только в статусе draft, с снятием поручения QUIK МНП, если бумаги заблокированы

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014FsEKyJrYF69Cj9ZXzFLRi
This commit is contained in:
zuevav
2026-09-25 15:22:08 +03:00
parent 4b81862a90
commit 16bfedb85f
6 changed files with 140 additions and 3 deletions
+24
View File
@@ -299,3 +299,27 @@ func marshalXMLIfPresent(v any) ([]byte, error) {
var (
_ Repository = (*PostgresRepository)(nil)
)
// DeleteDraft удаляет сделку в состоянии draft вместе с её событиями (одной транзакцией; состояние
// проверяется в самом запросе — заявку, успевшую уйти в НРД, не удалить).
func (r *PostgresRepository) DeleteDraft(ctx context.Context, id string) error {
tx, err := r.pool.Begin(ctx)
if err != nil {
return fmt.Errorf("PostgresRepository.DeleteDraft: %w", err)
}
defer func() { _ = tx.Rollback(ctx) }()
var state string
if err := tx.QueryRow(ctx, `SELECT state FROM m2m_core.deals WHERE id=$1::uuid FOR UPDATE`, id).Scan(&state); err != nil {
return ErrNotFound
}
if state != string(StateDraft) {
return ErrNotDraft
}
if _, err := tx.Exec(ctx, `DELETE FROM m2m_core.deal_events WHERE deal_id=$1::uuid`, id); err != nil {
return fmt.Errorf("PostgresRepository.DeleteDraft events: %w", err)
}
if _, err := tx.Exec(ctx, `DELETE FROM m2m_core.deals WHERE id=$1::uuid AND state=$2`, id, string(StateDraft)); err != nil {
return fmt.Errorf("PostgresRepository.DeleteDraft: %w", err)
}
return tx.Commit(ctx)
}