Skip to content

[IMP] academic, academic_sale_subscription: re-enrollment flow - #466

Closed
fw-bot-adhoc wants to merge 1 commit into
ingadhoc:19.0from
adhoc-dev:19.0-18.0-t-76302-lef2-9764-fw
Closed

fw-bot-adhoc wants to merge 1 commit into
ingadhoc:19.0from
adhoc-dev:19.0-18.0-t-76302-lef2-9764-fw

Conversation

@fw-bot-adhoc

Copy link
Copy Markdown
Contributor

Tarea: https://www.adhoc.inc/odoo/project.task/76302

Backport a 18.0 del circuito de reinscripción: #439 y #454 de 19.0.

Reemplaza a #455, que quedó con el bundle de runbot agarrado a un commit que ya
no existe (24948fd, barrido por un force push de esa rama): cada batch moría
en dos segundos sin escribir un solo log. Misma rama base, mismo contenido,
commits nuevos.

Qué cambia

El plan de estudio pasa a tener orden. academic.section.level guarda los niveles
del plan como líneas ordenables; level_ids sigue sirviendo como m2m plano a través de
un par compute/inverse, para data files, importaciones y las vistas que ya lo usaban. Un
post-migration mueve las filas del m2m viejo (academic_section_level_ids_rel) al modelo
nuevo. _is_last_level y _get_next_level leen esa secuencia; un plan sin secuencia
cargada no sugiere salto de nivel, propone el mismo.

create_next_year_groups busca el grupo del año siguiente por los mismos campos que
tiene la restricción de unicidad: faltaban section_id y subject_id, así que un grupo
de materia podía reusar silenciosamente el grupo comercial. También mira los archivados,
porque la unicidad no mira active y uno archivado que no se encontraba hacía fallar la
copia. Ahora devuelve una notificación con el recuento de creados y existentes, encadenada
a la lista de esos grupos.

academic.reenrollment.wizard, atado a la lista de academic.group, muestra por grupo
el nivel siguiente, el grupo del año que viene, los alumnos que entran y los que quedan
afuera (sin responsable de pago activo, o ya inscriptos), y crea los presupuestos a través
de academic.order.wizard o inscribe directo cuando el grupo no maneja flujo de ventas.
Los parámetros de venta que comparten los dos asistentes pasan al modelo abstracto
academic.order.params.

El asistente pasa los alumnos al plan de estudio siguiente cuando terminan el suyo
(7° de Primario a 1° de Secundaria), que es la tarea
76069:

  • correlative_ids pasa a llamarse "Planes siguientes" y alimenta la sugerencia: el
    primer nivel del único plan que sigue. Con más de uno, el destino lo elige la persona.
  • La división solo se conserva si el plan de destino ya la usa, para no inventar un "A"
    en un Secundario sin divisiones.
  • Un grupo que cierra un plan sin continuación figura como "Egresan (N)" y no bloquea el
    resto de la corrida; uno con alumnos y sin destino figura como "Sin destino (N)", en
    rojo, y frena la confirmación hasta que se le indique uno.
  • En la vista previa se pueden sacar alumnos y mandar alumnos puntuales a otro grupo.
  • El control de "ya inscripto" mira todos los grupos del año siguiente de la compañía con
    la misma materia, así volver a correr el asistente no genera una segunda cotización.
  • Aparece un aviso cuando una misma corrida mezcla destinos de planes distintos con flujo
    de ventas, porque la plantilla y la lista de precios son una sola para toda la corrida.

Notas del backport (19.0 → 18.0)

  • models.Constraint no existe en 18.0: las restricciones se declaran con _sql_constraints.
  • ir.actions.act_window.group_ids es groups_id en 18.0.
  • La unicidad de academic.group suma section_id, que la 19.0 ya tenía desde [IMP] academic: update uniqueness constraint for academic groups #379 y de lo
    que depende _get_next_year_group. Agregar una columna a un UNIQUE lo vuelve menos
    restrictivo, así que no hay datos que limpiar.
  • _create_mass_subscription acepta valores a sobreescribir, que es lo que necesita el
    asistente nuevo para forzar la compañía del grupo. La 19.0 ya lo tenía.
  • La API de precios de suscripción de la 19.0 (_get_recurring_pricing) no es parte de este
    cambio: 18.0 conserva _get_first_suitable_recurring_pricing.
  • Los es.po quedan afuera: los catálogos de 18.0 y 19.0 difieren, y los términos los
    levanta el export de esta rama.

Cómo se validó

Base 18 local con demo data.

Tests: base nueva, los dos módulos instalados de cero.

odoo --test-enable --test-tags=/academic,/academic_sale_subscription
academic: 12 tests 0.14s 197 queries
academic_sale_subscription: 16 tests 0.42s 759 queries
0 failed, 0 error(s) of 24 tests

Instalación completa del repo, sin tests: los diez módulos (academic,
academic_account_interests, academic_hr, academic_partner_code,
academic_payment_portal, academic_retry_payment, academic_sale_subscription,
academic_split_name, demo_academic, spreadsheet_dashboard_academic) sobre una base
nueva con demo data: registry cargado en 143s, sin un solo ERROR, CRITICAL ni WARNING.

Migración: la base se instaló primero con el código de 18.0 sin estos cambios, para que
cargara los niveles con el m2m viejo y las correlativas en el sentido viejo, y recién
después se actualizó. El post-migration de 1.29.0 movió las 41 filas de niveles al
modelo nuevo con secuencia 10, 20, 30, …, y el de 1.30.0 invirtió las 7 correlativas,
que quedaron apuntando hacia adelante (Nivel Inicial -> Primario 1 a 7,
Primario 1 a 7 -> Secundario 1 a 5, …).

Recorrido sobre la base de demo: un grupo en el último nivel propone el primer nivel del
plan siguiente, descarta la división porque el plan de destino no la usa, crea el grupo
del año que viene y la cotización; la segunda corrida reutiliza el grupo y el alumno
figura como ya inscripto, sin cotización de más; un plan con dos planes siguientes queda
"Sin destino" y frena la confirmación hasta elegirlo a mano; un plan sin continuación
figura como "Egresan" y no frena al resto.

pre-commit run --files sobre los archivos tocados: limpio.

Fuera de alcance

Pase entre compañías y ordenar estructuras mal cargadas: el orden inicial que deja la
migración sigue el orden en que los niveles se cargaron, no el año real, y se corrige
arrastrándolos una vez en el plan.

Observación

Crear los presupuestos falla con un AccessError de lectura sobre res.users cuando la
sesión tiene habilitada una sola compañía (la regla multicompañía bloquea los usuarios de
portal plantilla, que viven en la compañía principal). No lo introduce este cambio: el
asistente de ventas masivas que ya existía falla igual en el mismo contexto, probado sobre
la misma base. No verificado en 19.0.

Forward-Port-Of: #462

stdout:
Auto-merging academic/__manifest__.py
CONFLICT (content): Merge conflict in academic/__manifest__.py
Auto-merging academic/models/academic_group.py
CONFLICT (content): Merge conflict in academic/models/academic_group.py
Auto-merging academic/models/academic_section.py
CONFLICT (content): Merge conflict in academic/models/academic_section.py
Auto-merging academic/models/academic_section_level.py
CONFLICT (add/add): Merge conflict in academic/models/academic_section_level.py
Auto-merging academic/models/res_partner.py
Auto-merging academic/security/ir.model.access.csv
Auto-merging academic/tests/__init__.py
CONFLICT (add/add): Merge conflict in academic/tests/__init__.py
Auto-merging academic/tests/test_next_year_groups.py
CONFLICT (add/add): Merge conflict in academic/tests/test_next_year_groups.py
Auto-merging academic/views/academic_section_views.xml
CONFLICT (content): Merge conflict in academic/views/academic_section_views.xml
Auto-merging academic_sale_subscription/__manifest__.py
CONFLICT (content): Merge conflict in academic_sale_subscription/__manifest__.py
Auto-merging academic_sale_subscription/security/ir.model.access.csv
CONFLICT (content): Merge conflict in academic_sale_subscription/security/ir.model.access.csv
Auto-merging academic_sale_subscription/tests/__init__.py
CONFLICT (add/add): Merge conflict in academic_sale_subscription/tests/__init__.py
Auto-merging academic_sale_subscription/tests/test_reenrollment_wizard.py
CONFLICT (add/add): Merge conflict in academic_sale_subscription/tests/test_reenrollment_wizard.py
Auto-merging academic_sale_subscription/wizard/academic_order_wizard.py
Auto-merging academic_sale_subscription/wizard/academic_reenrollment_wizard.py
CONFLICT (add/add): Merge conflict in academic_sale_subscription/wizard/academic_reenrollment_wizard.py
Auto-merging academic_sale_subscription/wizard/academic_reenrollment_wizard_views.xml
CONFLICT (add/add): Merge conflict in academic_sale_subscription/wizard/academic_reenrollment_wizard_views.xml

stderr:
@roboadhoc

Copy link
Copy Markdown
Contributor

Pull request status dashboard

@fw-bot-adhoc

Copy link
Copy Markdown
Contributor Author

@lef-adhoc @gal-adhoc cherrypicking of pull request #462 failed.

stdout:

Auto-merging academic/__manifest__.py
CONFLICT (content): Merge conflict in academic/__manifest__.py
Auto-merging academic/models/academic_group.py
CONFLICT (content): Merge conflict in academic/models/academic_group.py
Auto-merging academic/models/academic_section.py
CONFLICT (content): Merge conflict in academic/models/academic_section.py
Auto-merging academic/models/academic_section_level.py
CONFLICT (add/add): Merge conflict in academic/models/academic_section_level.py
Auto-merging academic/models/res_partner.py
Auto-merging academic/security/ir.model.access.csv
Auto-merging academic/tests/__init__.py
CONFLICT (add/add): Merge conflict in academic/tests/__init__.py
Auto-merging academic/tests/test_next_year_groups.py
CONFLICT (add/add): Merge conflict in academic/tests/test_next_year_groups.py
Auto-merging academic/views/academic_section_views.xml
CONFLICT (content): Merge conflict in academic/views/academic_section_views.xml
Auto-merging academic_sale_subscription/__manifest__.py
CONFLICT (content): Merge conflict in academic_sale_subscription/__manifest__.py
Auto-merging academic_sale_subscription/security/ir.model.access.csv
CONFLICT (content): Merge conflict in academic_sale_subscription/security/ir.model.access.csv
Auto-merging academic_sale_subscription/tests/__init__.py
CONFLICT (add/add): Merge conflict in academic_sale_subscription/tests/__init__.py
Auto-merging academic_sale_subscription/tests/test_reenrollment_wizard.py
CONFLICT (add/add): Merge conflict in academic_sale_subscription/tests/test_reenrollment_wizard.py
Auto-merging academic_sale_subscription/wizard/academic_order_wizard.py
Auto-merging academic_sale_subscription/wizard/academic_reenrollment_wizard.py
CONFLICT (add/add): Merge conflict in academic_sale_subscription/wizard/academic_reenrollment_wizard.py
Auto-merging academic_sale_subscription/wizard/academic_reenrollment_wizard_views.xml
CONFLICT (add/add): Merge conflict in academic_sale_subscription/wizard/academic_reenrollment_wizard_views.xml

Either perform the forward-port manually (and push to this branch, proceeding as usual) or close this PR (maybe?).

:shipit: you can use git-fw to re-do the forward-port for you locally.

⚠️ after resolving this conflict, you will need to merge it via @roboadhoc.

More info at https://github.com/odoo/odoo/wiki/Mergebot#forward-port

@lef-adhoc

Copy link
Copy Markdown
Contributor

Ya esta en v19 esto, cierro

@lef-adhoc lef-adhoc closed this Oct 22, 2026
@lef-adhoc
lef-adhoc deleted the 19.0-18.0-t-76302-lef2-9764-fw branch October 22, 2026 13:53
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants