refactor: organize code by domain-driven design

Refactoriza la estructura del proyecto siguiendo principios de Domain-Driven Design,
organizando serializers, API views y servicios por dominios de negocio.

Cambios principales:

## Serializers (serializers/)
- Dividido serializers.py en módulos por dominio:
  * products.py: ProductSerializer, ListProductSerializer
  * customers.py: CustomerSerializer, ListCustomerSerializer
  * sales.py: SaleSerializer, SaleLineSerializer, CatalogSaleSerializer, etc.
  * payments.py: ReconciliationJarSerializer, PaymentMethodSerializer
  * __init__.py: Exporta todos los serializers para mantener compatibilidad

## API Views (api/)
- Dividido api_views.py en módulos por dominio:
  * products.py: ProductView, ProductsFromTrytonView
  * customers.py: CustomerView, CustomersFromTrytonView
  * sales.py: SaleView, CatalogSaleView, SaleSummary, SalesForTrytonView, SalesToTrytonView
  * payments.py: ReconciliateJarView, ReconciliateJarModelView, PaymentMethodView, SalesForReconciliationView
  * admin.py: AdminCodeValidateView
  * __init__.py: Exporta todas las vistas para facilitar importaciones

## Services Layer (services/tryton/)
- Nueva capa de servicios para lógica de negocio Tryton:
  * client.py: get_tryton_client(), TrytonSale, TrytonLineSale, configuración
  * products.py: ProductTrytonService - sincronización de productos
  * customers.py: CustomerTrytonService - sincronización de clientes
  * sales.py: SaleTrytonService - sincronización de ventas
  * __init__.py: Exporta servicios y utilidades

## Actualización de URLs
- Actualizado urls.py para importar desde nuevos módulos
- Mantiene todas las rutas existentes sin cambios

## Eliminación de archivos antiguos
- Eliminado serializers.py (refactorizado a serializers/)
- Eliminado api_views.py (refactorizado a api/)

## Beneficios
 Cohesión: Código organizado por dominio de negocio
 Separación de responsabilidades: API, Serializers y Services separados
 Mantenibilidad: Archivos más pequeños y enfocados
 Escalabilidad: Fácil agregar nuevos dominios
 Testabilidad: Mejor organización para pruebas por dominio
 Reutilización: Servicios Tryton pueden usarse desde cualquier vista

## Estructura final:
- models/ (ya existía organizado por dominio)
- serializers/ (nuevo, organizado por dominio)
- api/ (nuevo, organizado por dominio)
- services/tryton/ (nuevo, capa de servicios)

Tests: 46 tests pasando ✓
This commit is contained in:
2026-05-29 00:16:18 -05:00
parent f526330f9e
commit 47e87e4204
19 changed files with 824 additions and 629 deletions

View File

@@ -2,20 +2,38 @@ from django.urls import path, include
from rest_framework.routers import DefaultRouter
from . import views
from . import api_views
from .api import (
# Products
ProductView,
ProductsFromTrytonView,
# Customers
CustomerView,
CustomersFromTrytonView,
# Sales
SaleView,
CatalogSaleView,
SaleSummary,
SalesForTrytonView,
SalesToTrytonView,
# Payments
ReconciliateJarView,
ReconciliateJarModelView,
PaymentMethodView,
SalesForReconciliationView,
# Admin
AdminCodeValidateView,
)
app_name = "don_confiao"
router = DefaultRouter()
router.register(r"sales", api_views.SaleView, basename="sale")
router.register(
r"catalog_sales", api_views.CatalogSaleView, basename="catalog_sale"
)
router.register(r"customers", api_views.CustomerView, basename="customer")
router.register(r"products", api_views.ProductView, basename="product")
router.register(r"sales", SaleView, basename="sale")
router.register(r"catalog_sales", CatalogSaleView, basename="catalog_sale")
router.register(r"customers", CustomerView, basename="customer")
router.register(r"products", ProductView, basename="product")
router.register(
r"reconciliate_jar",
api_views.ReconciliateJarModelView,
ReconciliateJarModelView,
basename="reconciliate_jar",
)
@@ -23,39 +41,39 @@ urlpatterns = [
path("productos", views.products, name="products"),
path(
"resumen_compra_json/<int:id>",
api_views.SaleSummary.as_view(),
SaleSummary.as_view(),
name="purchase_json_summary",
),
path(
"payment_methods/all/select_format",
api_views.PaymentMethodView.as_view(),
PaymentMethodView.as_view(),
name="payment_methods_to_select",
),
path(
"purchases/for_reconciliation",
api_views.SalesForReconciliationView.as_view(),
SalesForReconciliationView.as_view(),
name="sales_for_reconciliation",
),
path("reconciliate_jar", api_views.ReconciliateJarView.as_view()),
path("reconciliate_jar", ReconciliateJarView.as_view()),
path("api/", include(router.urls)),
path(
"api/importar_productos_de_tryton",
api_views.ProductsFromTrytonView.as_view(),
ProductsFromTrytonView.as_view(),
name="products_from_tryton",
),
path(
"api/importar_clientes_de_tryton",
api_views.CustomersFromTrytonView.as_view(),
CustomersFromTrytonView.as_view(),
name="customers_from_tryton",
),
path(
"api/enviar_ventas_a_tryton",
api_views.SalesToTrytonView.as_view(),
SalesToTrytonView.as_view(),
name="send_tryton",
),
path(
"api/admin_code/validate/<code>",
api_views.AdminCodeValidateView.as_view(),
AdminCodeValidateView.as_view(),
),
path("api/sales/for_tryton", api_views.SalesForTrytonView.as_view()),
path("api/sales/for_tryton", SalesForTrytonView.as_view()),
]