Налаштування базової автоматизації
Базова автоматизація дозволяє автоматичну синхронізацію API, що запускається конкретними подіями в Odoo. Цей посібник пояснює, як налаштувати автоматизовані робочі процеси для безперебійної синхронізації даних.
Огляд
Базова автоматизація дозволяє вам:
- Запускати API виклики при створенні, оновленні або видаленні записів
- Планувати періодичну синхронізацію для пакетної обробки
- Реагувати на зміни полів з негайними оновленнями API
- Ланцюжити кілька автоматизацій для складних робочих процесів
Налаштування базової автоматизації
Передумови
- Конфігурація API має бути завершена
- Зіставлення полів мають бути визначені
- Користувач повинен мати увімкнені Технічні функції
- Модуль Базова автоматизація має бути встановлений
Покрокове налаштування
1. Доступ до правил автоматизації
Перейдіть до: Налаштування → Технічні → Автоматизація → Правила автоматизації
Інтерфейс налаштування базової автоматизації
2. Створення нового правила
Натисніть Створити та налаштуйте:
Name: Синхронізувати клієнта з зовнішнім API
Model: Контакт (res.partner)
Trigger: При створенні та оновленні
Active: Так
3. Налаштування умов тригера
Визначте, коли має запускатися автоматизація:
# Умови тригера
Trigger: При створенні та оновленні
Before Update Domain: [('is_company', '=', True)]
Apply on: [('customer_rank', '>', 0)]
Watch Fields: name, email, phone, vat
Типи тригерів
При створенні
Синхронізувати нові записи негайно:
# Правило автоматизації
Name: Синхронізувати нових клієнтів
Model: res.partner
Trigger: При створенні
Action: Виконати код Python
# Код Python
# config_index - замініть на свій індекс конфігурації API
env['bj.api.sync.config']._make_outbound_http_request(record_ids=records, config_id_ref=config_index)
При оновленні
Синхронізувати при зміні конкретних полів:
# Правило автоматизації
Name: Оновити зміни клієнта
Model: res.partner
Trigger: При оновленні
Watch Fields: ['name', 'email', 'phone', 'street']
# Код Python
# config_index - замініть на свій індекс конфігурації API
env['bj.api.sync.config']._make_outbound_http_request(record_ids=records, config_id_ref=config_index)
При видаленні
Повідомити зовнішню систему про видалення:
# Правило автоматизації
Name: Синхронізувати видалення клієнта
Model: res.partner
Trigger: При видаленні
# Код Python
# config_index - замініть на свій індекс конфігурації API
env['bj.api.sync.config']._make_outbound_http_request(record_ids=records, config_id_ref=config_index)
Заплановані дії
Налаштувати періодичну синхронізацію:
# Запланована дія
Name: Щоденна синхронізація клієнтів
Model: ir.cron
Active: Так
Interval: 1 День
Next Execution: 2024-01-01 02:00:00
# Код Python
def run_daily_sync():
"""Синхронізувати всіх змінених клієнтів щодня"""
yesterday = datetime.now() - timedelta(days=1)
customers = env['res.partner'].search([
('write_date', '>=', yesterday),
('customer_rank', '>', 0)
])
# config_index - замініть на свій індекс конфігурації API
env['bj.api.sync.config']._make_outbound_http_request(record_ids=customers, config_id_ref=config_index)
Розширені шаблони автоматизації
Умовна синхронізація
Синхронізація на основі складних умов:
def should_sync_customer(record):
"""Визначити, чи повинен клієнт бути синхронізований"""
# Перевірити кілька умов
conditions = [
record.customer_rank > 0,
record.email and '@' in record.email,
record.country_id.code in ['US', 'CA', 'MX'],
not record.is_blacklisted
]
return all(conditions)
# У правилі автоматизації
if should_sync_customer(record):
# config_index - замініть на свій індекс конфігурації API
env['bj.api.sync.config']._make_outbound_http_request(record_ids=record, config_id_ref=config_index)
Пакетна обробка
Ефективна обробка кількох записів:
def batch_sync_customers():
"""Синхронізувати клієнтів пакетами"""
batch_size = 100
customers = env['res.partner'].search([
('sync_status', '=', 'pending'),
('customer_rank', '>', 0)
], limit=batch_size)
if customers:
# config_index - замініть на свій індекс конфігурації API
response = env['bj.api.sync.config']._make_outbound_http_request(record_ids=customers, config_id_ref=config_index)
# Оновити статус синхронізації
if response.get('success'):
customers.write({'sync_status': 'synced'})
Обробка помилок
Впровадити надійну обробку помилок:
def sync_with_retry(record, max_retries=3):
"""Синхронізація з автоматичною повторною спробою при збої"""
for attempt in range(max_retries):
try:
# config_index - замініть на свій індекс конфігурації API
result = env['bj.api.sync.config']._make_outbound_http_request(record_ids=record, config_id_ref=config_index)
if result.get('success'):
record.write({
'sync_status': 'success',
'last_sync': fields.Datetime.now()
})
return True
except Exception as e:
if attempt == max_retries - 1:
record.write({
'sync_status': 'failed',
'sync_error': str(e)
})
# Надіслати сповіщення
record.message_post(
body=f"Синхронізація API не вдалася: {str(e)}"
)
else:
time.sleep(2 ** attempt) # Експоненційна затримка
return False
Інтеграція робочого процесу
Багатокрокові робочі процеси
Ланцюжити автоматизації для складних процесів:
# Крок 1: Перевірити дані клієнта
def validate_customer_data(record):
"""Перший крок: Перевірити повноту даних"""
required_fields = ['name', 'email', 'phone']
missing = [f for f in required_fields if not getattr(record, f)]
if missing:
record.message_post(
body=f"Відсутні обов'язкові поля: {', '.join(missing)}"
)
return False
record.write({'validation_status': 'validated'})
return True
# Крок 2: Збагатити дані клієнта
def enrich_customer_data(record):
"""Другий крок: Збагатити зовнішніми даними"""
if record.validation_status != 'validated':
return False
# Викликати API збагачення
enrichment_data = call_enrichment_api(record.email)
record.write({
'industry': enrichment_data.get('industry'),
'company_size': enrichment_data.get('size'),
'enrichment_status': 'enriched'
})
return True
# Крок 3: Синхронізувати з зовнішньою системою
def sync_enriched_customer(record):
"""Фінальний крок: Синхронізувати збагачені дані"""
if record.enrichment_status != 'enriched':
return False
# config_index - замініть на свій індекс конфігурації API
env['bj.api.sync.config']._make_outbound_http_request(record_ids=record, config_id_ref=config_index)
record.write({'workflow_status': 'completed'})
Автоматизація на основі стану
Тригер на основі змін стану:
# Правило автоматизації для змін стану
Name: Синхронізація при зміні стану
Model: sale.order
Trigger: При оновленні
Watch Fields: ['state']
# Код Python
if record.state == 'sale' and old_values.get('state') != 'sale':
# config_index - замініть на свій індекс конфігурації API
env['bj.api.sync.config']._make_outbound_http_request(record_ids=record.order_line, config_id_ref=config_index)