Commit Graph

5 Commits

Author SHA1 Message Date
95036ed285 Добавлен настраиваемый экспорт клиентов с выбором полей и форматов
Реализован полностью новый функционал экспорта клиентов с возможностью
выбора полей, формата файла (CSV/XLSX) и сохранением предпочтений.

Ключевые изменения:

1. CustomerExporter (import_export.py):
   - Полностью переписан класс с поддержкой динамического выбора полей
   - Добавлена конфигурация AVAILABLE_FIELDS с метаданными полей
   - Реализован метод get_available_fields() для фильтрации по ролям
   - Новый метод export_to_xlsx() с автоподстройкой ширины столбцов
   - Форматирование ContactChannel с переводами строк
   - Поддержка фильтрации queryset

2. CustomerExportForm (forms.py):
   - Динамическое создание checkbox полей на основе роли пользователя
   - Выбор формата файла (CSV/XLSX) через radio buttons
   - Валидация выбора хотя бы одного поля

3. View customer_export (views.py):
   - КРИТИЧНО: Изменён декоратор с @manager_or_owner_required на @owner_required
   - Обработка GET (редирект) и POST запросов
   - Применение фильтров CustomerFilter из списка клиентов
   - Оптимизация с prefetch_related('contact_channels')
   - Сохранение настроек экспорта в session

4. UI изменения:
   - Создан шаблон customer_export_modal.html с модальным окном
   - Обновлён customer_list.html: кнопка экспорта с проверкой роли
   - JavaScript для восстановления сохранённых настроек из session
   - Отображение количества экспортируемых клиентов
   - Бейдж "Только для владельца" на поле баланса кошелька

Безопасность:
- Экспорт доступен ТОЛЬКО владельцу тенанта (OWNER) и superuser
- Поле "Баланс кошелька" скрыто от менеджеров на уровне формы
- Двойная проверка роли при экспорте баланса
- Кнопка экспорта скрыта в UI для всех кроме owner/superuser

Функциональность:
- Выбор полей: ID, имя, email, телефон, заметки, каналы связи, баланс, дата создания
- Форматы: CSV (с BOM для Excel) и XLSX
- Учёт текущих фильтров и поиска из списка клиентов
- Сохранение предпочтений между экспортами в session
- Исключение системного клиента из экспорта

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-03 21:12:08 +03:00
b201c71311 Улучшение импорта клиентов: предобработка данных, умное слияние, прогресс-бар
- Добавлена предобработка email перед валидацией:
  * Исправление типичных опечаток (mail ru -> mail.ru, .ry -> .ru)
  * Удаление пробелов и двойных @@
  * Умное добавление @ для популярных доменов
  * Исправление доменов без точки (gmail -> gmail.com)

- Улучшена нормализация телефонов:
  * Умное добавление кода страны (+375, +7, +380)
  * Конверсия старого формата 8XXXXXXXXXX -> +7XXXXXXXXXX
  * Проверка длины номера (10-15 символов)
  * Поддержка локальных белорусских номеров (9 цифр)

- Реализована идемпотентность импорта:
  * Notes не раздуваются при повторных импортах (метод _append_unique_note)
  * ContactChannel не дублируется для одного клиента
  * Проверка существования альтернативных контактов по customer+type+value

- Добавлен прогресс-бар и защита от закрытия:
  * Визуальный прогресс-бар с анимацией и динамическим текстом
  * Блокировка формы во время импорта
  * Предупреждение браузера при попытке закрыть страницу

- Создана команда clear_anatol_customers для тестирования

- Добавлен тестовый файл test_customer_preprocess.csv с примерами исправляемых ошибок
2026-01-03 14:30:18 +03:00
3248fadffa Dobavlen funkcional importa i eksporta klientov s validaciey i umnym sliyaniem kontaktov 2026-01-03 13:33:34 +03:00
56725e8092 Добавлена система фильтрации клиентов с универсальным поиском
- Реализован универсальный поиск по имени, email и телефону в одной строке
- Добавлен счетчик общего количества клиентов
- Поиск работает по нажатию Enter или кнопке 'Поиск'
- Удалены неиспользуемые фильтры django-filter
- Упрощен интерфейс списка клиентов
- Добавлена кнопка 'Очистить' для сброса поиска
2025-12-14 22:39:32 +03:00
089ccfa8ae Рефакторинг: вынесена логика импорта/экспорта клиентов в отдельный сервис
- Создан модуль customers/services/import_export.py согласно best practices
- Класс CustomerExporter: содержит логику экспорта в CSV (ранее была в views)
- Класс CustomerImporter: заглушка для будущей реализации импорта
- Views стали тонкими: customer_export и customer_import делегируют работу сервисам
- Улучшена организация кода: соблюдён принцип Single Responsibility
- Уменьшен размер views.py на 30 строк
- Добавлена подробная документация в docstrings классов и методов
- Логику теперь легко тестировать и переиспользовать (например, в Celery tasks)

Преимущества:
- Чистое разделение ответственности
- Упрощённое тестирование
- Возможность переиспользования в асинхронных задачах
- Соответствие Django best practices
2025-12-14 20:55:21 +03:00