Va quedando más claro, pero aún así estoy liado. Es un problema complejo que hay que tener bien entendido para llevar a cabo una programación lo más inteligente y eficiente posible.
Corrígeme si me equivoco:
Tenemos las Áreas.
En cada Área puede haber muchas materias. Cada área tiene disponible un cupo de horas semanales y un cupo de horas totales (que son independientes las unas de las otras).
Tenemos las Materias.
Cada materia pertenece a un área. Cada materia tiene un número de horas semanales, y un número de horas totales (que son independientes las unas de las otras).
Teniendo este planteamiento, lo que pretendemos es editar una Materia diciendo: Si materia4 pertenece a areaB, quiero que materia4 pertenezca a areaC. Con lo cual tengo que restarle a areaB de su cantidad de horasSemanales y de su cantidad de horasTotales las correspondientes a materia4, y esas mismas cantidades de hora sumarselas a areaC.
Y el problema de todo esto es que no tengo por ningún sitio las horas totales areaB ni del areaC; que tengo las horas que me quedan disponibles del areaB, ¿no es asi?
--------------
En ese caso lo que yo haría sería casi casi descargarme en javascript en el documento el total de las horas disponibles de cada área, las horas que ocupa una materia, y a qué área pertenece cada materia.
Luego con javascript calculamos ya los movimientos, restas de allí, sumas aquí... lo que sea. Pero veo que por un lado o por otro vamos a necesitar todos esos datos disponibles en javascript. Para ello podrías usar la estructura de "clases-objetos" que tiene javascript. Te hago un esbozo que podrías utilizar:
Código PHP:
function area(nombre,horasTotales,horasSemanales) {
this.nombre = nombre;
this.horasTotales = horasTotales;
this.horasSemanales = horasSemanales;
this.susMaterias = new Array();
this.getHorasTotalesDisponibles = function() {
//sumamos todas las horasTotales de las materias que tiene este área, y el resultado se lo restamos a this.horasTotales
}
this.getHorasSemanalesDisponibles = function() {
//sumamos todas las horasSemanales de las materias que tiene este área, y el resultado se lo restamos a this.horasSemanales
}
this.cabeMateria = function( objMateria ) {
// devuelve true si la materia cabe según las horasTotalesDisponibes y las horasSemanalesDisponibles
}
this.anyadirMateria = function( objMateria ) {
this.susMaterias[ this.susMaterias.length ] = objMateria;
}
this.eliminarMateria = function( objMateria ) {
//contrar objMateria en this.susMaterias y eliminarla del array
}
}
function materia(nombre,horasTotales,horasSemanales) {
this.nombre = nombre;
this.horasTotales = horasTotales;
this.horasSemanales = horasSemanales;
}
var area1 = new area("Área sociolingüística", 100, 10);
var area2 = new area("Área Matemáticas", 200, 20);
var area3 = new area("Área taller", 500, 50);
//...
var materia1 = new materia("Materia Lengua PGS", 40, 4);
var materia2 = new materia("Matemáticas", 50, 10);
//...
// añado materia1 a area1
if( area1.cabeMateria(materia1) )
area1.anyadirMateria(materia1);
//...
//...
No sé si estás familiarizado con este tipo de sintaxis, yo creo que es la más legible.
Pero sí, definitivamente creo que tendrás que volcar todas las áreas, asignaturas y sus respectivas características al código javascript, para después poder operar...
O eso.. o hacer las comprobaciones mediante AJAX, pero no se me da tan bien, tendrías que preguntar en su foro.
Un saludo y corrígeme si me equivoco.