feat(api): add BNPL, ERP, WhatsApp Cloud, Supplier Portal stubs

- bnpl_bp.py: APLAZO/Kueski/Clip application workflow (mock)
- erp_bp.py: Aspel/CONTPAQi/SAP/Odoo sync jobs (mock)
- whatsapp_cloud_bp.py: Meta Cloud API webhook, messages, templates
- supplier_portal_bp.py: demand by zone/branch and top-parts analytics
- app.py: register all new blueprints
This commit is contained in:
2026-04-29 06:31:03 +00:00
parent 12989e30be
commit 2cfe4b3913
5 changed files with 375 additions and 0 deletions

View File

@@ -0,0 +1,86 @@
"""WhatsApp Business API (Meta Cloud) Blueprint.
Replaces Baileys webhook for scalable production messaging.
Stubs ready for Meta Cloud API credentials.
"""
from flask import Blueprint, request, jsonify, g
from functools import wraps
import uuid
from datetime import datetime
whatsapp_cloud_bp = Blueprint('whatsapp_cloud', __name__, url_prefix='/pos/api/whatsapp-cloud')
from middleware import require_auth
_mock_messages = {}
@whatsapp_cloud_bp.route('/webhook', methods=['GET', 'POST'])
def webhook():
"""Meta Cloud API webhook verification and message reception."""
if request.method == 'GET':
# Verification challenge
mode = request.args.get('hub.mode')
token = request.args.get('hub.verify_token')
challenge = request.args.get('hub.challenge')
# In production: verify token against configured VERIFY_TOKEN
if mode == 'subscribe' and challenge:
return challenge, 200
return jsonify({'error': 'Verification failed'}), 403
# POST — incoming messages
data = request.get_json() or {}
# In production: process entries, messages, statuses
return jsonify({'received': True, 'entries': len(data.get('entry', []))}), 200
@whatsapp_cloud_bp.route('/messages', methods=['POST'])
@require_auth()
def send_message():
"""Send a message via Meta Cloud API."""
data = request.get_json() or {}
to = data.get('to')
body = data.get('body')
template = data.get('template')
if not to or (not body and not template):
return jsonify({'error': 'to and body/template are required'}), 400
msg_id = str(uuid.uuid4())
_mock_messages[msg_id] = {
'id': msg_id,
'to': to,
'body': body,
'template': template,
'status': 'sent',
'sent_at': datetime.utcnow().isoformat(),
}
return jsonify(_mock_messages[msg_id]), 201
@whatsapp_cloud_bp.route('/templates', methods=['GET'])
@require_auth()
def list_templates():
"""List approved message templates."""
return jsonify({
'templates': [
{'name': 'order_ready', 'language': 'es_MX', 'category': 'UTILITY', 'status': 'APPROVED'},
{'name': 'payment_reminder', 'language': 'es_MX', 'category': 'UTILITY', 'status': 'APPROVED'},
{'name': 'welcome_message', 'language': 'es_MX', 'category': 'MARKETING', 'status': 'PENDING'},
]
})
@whatsapp_cloud_bp.route('/status', methods=['GET'])
@require_auth()
def get_status():
"""Check Meta Cloud API connection status."""
return jsonify({
'connected': False,
'phone_number_id': None,
'business_account_id': None,
'message_limit': None,
'note': 'Configure WHATSAPP_CLOUD_ACCESS_TOKEN and PHONE_NUMBER_ID to connect',
})