Отправка в НРД с подтверждением доставки: ERROR от ИШ — заявка «Не отправлена», без BJ_SENT; «Отправить повторно» тем же GUID; сторож связи ИШ↔НРД по журналу ИШ
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014FsEKyJrYF69Cj9ZXzFLRi
This commit is contained in:
@@ -300,7 +300,7 @@ var (
|
||||
_ Repository = (*PostgresRepository)(nil)
|
||||
)
|
||||
|
||||
// DeleteDraft удаляет сделку в состоянии draft вместе с её событиями (одной транзакцией; состояние
|
||||
// DeleteDraft удаляет сделку в состоянии draft/validated вместе с её событиями (одной транзакцией; состояние
|
||||
// проверяется в самом запросе — заявку, успевшую уйти в НРД, не удалить).
|
||||
func (r *PostgresRepository) DeleteDraft(ctx context.Context, id string) error {
|
||||
tx, err := r.pool.Begin(ctx)
|
||||
@@ -312,13 +312,13 @@ func (r *PostgresRepository) DeleteDraft(ctx context.Context, id string) error {
|
||||
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) {
|
||||
if !IsUnsent(State(state)) {
|
||||
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 {
|
||||
if _, err := tx.Exec(ctx, `DELETE FROM m2m_core.deals WHERE id=$1::uuid AND state IN ($2,$3)`, id, string(StateDraft), string(StateValidated)); err != nil {
|
||||
return fmt.Errorf("PostgresRepository.DeleteDraft: %w", err)
|
||||
}
|
||||
return tx.Commit(ctx)
|
||||
|
||||
@@ -162,7 +162,7 @@ type DraftDeleter interface {
|
||||
DeleteDraft(ctx context.Context, id string) error
|
||||
}
|
||||
|
||||
// DeleteDraft удаляет сделку, если она в состоянии draft.
|
||||
// DeleteDraft удаляет сделку, если она ещё не ушла в НРД (draft или validated).
|
||||
func (r *MemoryRepository) DeleteDraft(_ context.Context, id string) error {
|
||||
r.mu.Lock()
|
||||
defer r.mu.Unlock()
|
||||
@@ -170,7 +170,7 @@ func (r *MemoryRepository) DeleteDraft(_ context.Context, id string) error {
|
||||
if !ok {
|
||||
return ErrNotFound
|
||||
}
|
||||
if d.State != StateDraft {
|
||||
if !IsUnsent(d.State) {
|
||||
return ErrNotDraft
|
||||
}
|
||||
delete(r.byID, id)
|
||||
@@ -178,3 +178,6 @@ func (r *MemoryRepository) DeleteDraft(_ context.Context, id string) error {
|
||||
delete(r.events, id)
|
||||
return nil
|
||||
}
|
||||
|
||||
// IsUnsent — заявка ещё не ушла в НРД: черновик или «Не отправлена» (НРД не принял пакет).
|
||||
func IsUnsent(s State) bool { return s == StateDraft || s == StateValidated }
|
||||
|
||||
Reference in New Issue
Block a user