// ===== OF KIAMIS — Composition des PÔLES ===== // Construit 3 pôles à partir de DATA (formation-data.js) + MODDATA (tsmel-modules.js). // Pôles : logistique (TSMEL + Chaîne du Froid intégrée) · transport (GTLA + modules GOTRM dédupliqués) · fondamentaux (CléA). (function(){ function hrs(s){var m=(s||'').match(/(\d+)\s*h/);return m?parseInt(m[1]):0;} function isEval(t){return /valuation en cours|^Évaluation/i.test(t);} // ===== Tarif EN LIGNE au prorata horaire : base 500 € les 7 h (≈ 71,43 €/h) ===== // Présentiel / asynchrone / inter-intra = sur devis (price:null). // Prix module = heures réelles × taux horaire × coefficient de complexité, // arrondi au multiple de 5 € le plus proche. Le "Parcours complet" applique // un forfait dégressif volume (voir POLES[k].bundlePrice), pas la somme brute. var RATE=500/7; var COEF={fond:0.85,std:1.10,exp:1.80}; // Taux horaire de base par pôle, calibrés sur des repères marché réels : // TSMEL ≈ 8 €/h (Titre Pro comparable : 5 000-8 000 € / ~800h) · BTS GTLA ≈ 12 €/h (GRETA : 13 €/h TTC réel). var HRATE={tsmel:14,gtla:12}; function priceH(h,coef,poleKey){ if(!h) return 750; var r=HRATE[poleKey]||8; var floor=h>49?1500:(h>=14?1000:750); return Math.max(floor,Math.round(h*r*(coef||1)/5)*5); } window.KIAMIS_RATE=RATE; // ===== Moteur de tarification réel (piloté par le Simulateur de tarification /direction/) ===== // Prix module = ((coût formateur×coef + frais généraux) × (1+marge inter)) ÷ nb stagiaires conseillé, // avec un plancher de sécurité conservé (750 / 1000€ dès 14h / 1500€ dès 49h) pour ne jamais // publier un prix en dessous des seuils validés. var _priceEngineModules=[]; // {m, h, coef} — repère de tous les modules tarifés pour recalcul après fetch config function priceEngineCompute(h,coef,cfg){ if(!h) return 750; var cf=(h/7)*cfg.coutFormateurJour*(coef||1); var fg=cf*(cfg.fraisGeneraux/100); var raw=((cf+fg)*(1+cfg.margeInter/100))/(cfg.nbConseilleInter||9); var floor=h>49?1500:(h>=14?1000:750); return Math.max(floor,Math.round(raw/5)*5); } function trackPriced(m,h,coef){ if(m&&h) _priceEngineModules.push({m:m,h:h,coef:coef||1}); return m; } function applyRealPricingConfig(){ fetch('/wp-content/kiamis-html/kiamis-pricing-config-api.php?action=get_config',{credentials:'include'}) .then(function(r){return r.json();}) .then(function(res){ if(!res.ok||!res.config) return; var cfg=res.config; _priceEngineModules.forEach(function(e){ e.m.price=priceEngineCompute(e.h,e.coef,cfg); }); window.dispatchEvent(new CustomEvent('kiamis:pricing-updated')); }).catch(function(){}); } var CLEA_DUR=['10-21 h','10-21 h','7-14 h','3-7 h','3-7 h','3-7 h','3-7 h']; // Coefficients de complexité par module TSMEL, dans l'ordre du programme (2 activités). var TSMEL_COEF=[ [COEF.exp,COEF.fond,COEF.std,COEF.std,COEF.std,COEF.fond,COEF.fond,COEF.fond,COEF.exp,COEF.fond,COEF.std,COEF.exp,COEF.exp,COEF.std,COEF.exp,COEF.std,COEF.std], [COEF.exp,COEF.std,COEF.exp,COEF.std,COEF.std,COEF.std,COEF.fond,COEF.exp,COEF.std,COEF.fond,COEF.exp,COEF.std,COEF.std] ]; // ---- helpers : un module sélectionnable depuis une source ---- function tsmelMod(ai,mi){ var md=DATA.tsmel.programme[ai].modules[mi]; var h=hrs(md[1]); var coef=(TSMEL_COEF[ai]&&TSMEL_COEF[ai][mi])||1; var m={t:md[0],dur:md[1]||'',hours:h,eval:isEval(md[0]), price:isEval(md[0])?0:priceH(h,coef,'tsmel'), src:{k:'tsmel',ai:ai,mi:mi}}; if(!isEval(md[0])) trackPriced(m,h,coef); return m; } function blocMod(k,ai){ var b=DATA[k].programme[ai]; return {t:b.t,dur:b.duree||'7 h',hours:7,eval:false,price:500, src:{k:k,ai:ai,mi:null}}; } // ===== LOGISTIQUE ===== var logiActs=DATA.tsmel.programme.map(function(act,ai){ return {label:act.cat||('Activité '+(ai+1)), title:act.t, duree:act.duree||'', modules:act.modules.map(function(_,mi){return tsmelMod(ai,mi);})}; }); // Offre Chaîne du Froid (intégrée) — 2 formules var froidOffer={ kind:'offer', key:'froid', title:'Chaîne du Froid — Sécurité alimentaire', sub:DATA.froid.programme.length+' modules · attestation', desc:'Maîtrisez la chaîne du froid de bout en bout : contrôle des températures, traçabilité, gestion des ruptures. Deux formules au choix.', options:[ {id:'froid:online', label:'100 % en ligne', price:1500, note:'Classe virtuelle + étude de cas pratique', hours:35}, {id:'froid:terrain', label:'Accompagnement terrain', price:null, star:true, note:'Intervention sur site + mise en place des procédures HACCP', hours:35} ], modules:DATA.froid.programme.map(function(p,ai){ return {t:p.t, dur:'', hours:0, eval:false, included:true, src:{k:'froid',ai:ai,mi:null}}; }) }; // ===== TRANSPORT = BTS GTLA — modules réels par Bloc de Compétences ===== // Prix = heures × 500€/7h × coefficient de complexité (fond 0,85 · std 1,00 · exp 1,20) function gtlaMod(t,dur,h,coef,ai,mi){ var m={t:t,dur:dur,hours:h,eval:false,price:priceH(h,coef,'gtla'),src:{k:'gtla',ai:ai,mi:mi}}; trackPriced(m,h,coef); return m; } var transportActs=[ { label:'BC 1 — Mise en œuvre (217 h)', title:"Mise en œuvre d'opérations de transport et de prestations logistiques", duree:'4 modules · 217 h', modules:[ gtlaMod("AT 1.1 — Réalisation d'opérations de transport et de prestations logistiques",'84 h',84,COEF.std,0,0), gtlaMod("AT 1.2 — Réalisation d'une opération de sous-traitance",'63 h',63,COEF.exp,0,1), gtlaMod('AT 1.3 — Gestion des moyens matériels','35 h',35,COEF.fond,0,2), gtlaMod('AT 1.4 — Suivi du déroulement des opérations de transport et des prestations logistiques','28 h',28,COEF.std,0,3) ] }, { label:'BC 2 — Conception (280 h)', title:"Conception d'opérations de transport et de prestations logistiques", duree:'3 modules · 280 h', modules:[ gtlaMod("AT 2.1 — Analyse d'une demande de transport et de prestations logistiques",'56 h',56,COEF.std,1,0), gtlaMod("AT 2.2 — Elaboration d'une solution de transport et de prestations logistiques",'161 h',161,COEF.exp,1,1), gtlaMod("AT 2.3 — Proposition d'une solution de transport et de prestations logistiques",'56 h',56,COEF.exp,1,2) ] }, { label:'BC 3 — Analyse de la performance (210 h)', title:"Analyse de la performance d'une activité de transport et de prestations logistiques", duree:'6 modules · 210 h', modules:[ gtlaMod('AT 3.1 — Analyse de la performance organisationnelle','28 h',28,COEF.std,2,0), gtlaMod('AT 3.2 — Analyse de la performance commerciale','21 h',21,COEF.std,2,1), gtlaMod('AT 3.3 — Analyse des litiges','35 h',35,COEF.exp,2,2), gtlaMod('AT 3.4 — Analyse de la performance sociale','42 h',42,COEF.exp,2,3), gtlaMod('AT 3.5 — Analyse de la performance environnementale','14 h',14,COEF.fond,2,4), gtlaMod('AT 3.6 — Analyse de la performance financière','63 h',63,COEF.exp,2,5) ] }, { label:'BC 4 — Pérennisation et développement (91 h)', title:"Pérennisation et développement de l'activité de transport et de prestations logistiques", duree:'3 modules · 91 h', modules:[ gtlaMod("AT 4.1 — Elaboration et planification d'un projet",'7 h',7,COEF.fond,3,0), gtlaMod('AT 4.5 — Financement d\'un projet','14 h',14,COEF.exp,3,1), gtlaMod("AT 4.6 — Accompagnement au projet",'70 h',70,COEF.std,3,2) ] }, { label:'BC 8 — CEJM appliqué au transport (91 h)', title:'Culture économique, juridique et managériale appliquée au transport', duree:'6 thèmes · 91 h', modules:[ gtlaMod("Thème 1 — L'intégration de l'entreprise dans son environnement",'17,5 h',17,COEF.fond,4,0), gtlaMod("Thème 2 — La régulation de l'activité économique",'17,5 h',17,COEF.std,4,1), gtlaMod("Thème 3 — L'organisation de l'activité de l'entreprise",'21 h',21,COEF.std,4,2), gtlaMod("Thème 4 — L'impact du numérique sur la vie de l'entreprise",'7 h',7,COEF.fond,4,3), gtlaMod('Thème 5 — Les mutations du travail','14 h',14,COEF.fond,4,4), gtlaMod("Thème 6 — Les choix stratégiques de l'entreprise",'14 h',14,COEF.exp,4,5) ] } ]; // ===== Formations complémentaires Transport — Réglementaire & Accompagnement ===== // Chaque formation est une fiche indépendante (comme Chaîne du Froid), pas un module // groupé. Prestations sur-mesure, tarif sur devis après analyse du besoin. function offerSolo(key,title,desc,note){ return { kind:'offer', key:key, title:title, sub:'Sur devis', desc:desc, options:[{id:key+':devis', label:'Sur devis', price:null, note:note||'Format et durée adaptés à votre besoin', hours:0}], modules:[{t:title,dur:'',hours:0,eval:false,price:null,devis:true,included:true,src:{k:key,ai:0,mi:0}}] }; } var reglementaireOffers=[ offerSolo('rse','Réglementation sociale européenne',"Maîtrisez les règles de temps de conduite et de repos (règlement 561/2006) applicables aux conducteurs et à l'exploitation.",'Entreprise, exploitant ou conducteur'), offerSolo('contrattype','Contrat type de transport',"Comprendre et appliquer le contrat type de transport de marchandises : droits, obligations et limites de responsabilité des parties."), offerSolo('adr13','Réglementation ADR et formation ADR 1.3 — Conseil à la sécurité',"Formation au conseil à la sécurité pour le transport de marchandises dangereuses par route, classes 1, 2, 3, 4, 5, 6, 8 et 9. Dispensée par un conseiller à la sécurité diplômé.",'Conseiller à la sécurité diplômé — toutes classes concernées'), offerSolo('litiges','Gestion des aléas et des litiges',"Limites de responsabilité, recours et procédures au regard du Code du commerce en cas d'incident ou de litige transport."), offerSolo('soustraitance','Gestion de la sous-traitance',"Contrat type de sous-traitance et obligations légales du donneur d'ordre et du sous-traitant en transport de marchandises.") ]; var accompagnementOffers=[ offerSolo('attestations','Attestations de capacité VL, Lourd et commissionnaire',"Accompagnement et formation en vue de l'obtention des attestations de capacité de transport léger, lourd et commissionnaire de transport."), offerSolo('exploitants','Montée en compétences des exploitants et responsables transport',"Accompagnement sur le management, les achats et la gestion au quotidien de l'activité transport."), offerSolo('plansdetransport','Construction et mise en place de plans de transport',"Accompagnement dans la conception et le déploiement opérationnel de plans de transport."), offerSolo('indicateurs',"Mise en place d'indicateurs","Définition et déploiement d'indicateurs de pilotage et de suivi de l'activité transport.") ]; // ===== INFO blocs (réutilise les données source) ===== function info(srcKey,extra){ var f=DATA[srcKey]; var o={ presentation:f.presentation, objectifs:f.objectifs, prerequis:f.prerequis, public:f.public, modalites:f.modalites, tarif:f.tarif, tarifTxt:f.tarifTxt, certif:f.certif }; if(extra) for(var kk in extra) o[kk]=extra[kk]; return o; } window.POLES={ logistique:{ short:'Logistique', poleLabel:'Pôle Logistique · Exploitation, méthodes & chaîne du froid', title:'Logistique — composez votre parcours à la carte', tagline:"Du pilotage de site à la chaîne du froid : sélectionnez les modules utiles à votre métier, payez en ligne ou faites financer.", unitLabel:'module', unit:null, rate:RATE, priceNote:'Distanciel au tarif indiqué par module · Inter/intra entreprise : tarif majoré (déplacement, présentiel) — devis final après analyse du besoin. Accès en ligne valable 1 an à compter de l\'inscription ; passé ce délai, l\'accès au module est suspendu.', chips:[['30','modules logistiques'],['100%','en ligne'],['À la carte','1 500 € / module']], facts:[['Pôle','Logistique — exploitation & méthodes'],['Modules','30 (2 activités types)'],['Parcours','Logistique (niv. visé 5)'],['Format','Classe virtuelle + terrain (froid)'],['Durée d\'accès','1 an à compter de l\'inscription']], activities:logiActs, offers:[froidOffer], bundlePrice:6500, info:info('tsmel') }, transport:{ short:'Transport', poleLabel:'Pôle Transport · Parcours Transport de marchandises', title:'Transport — composez votre parcours Transport & Logistique', tagline:"Construisez votre parcours transport module par module : mise en œuvre, conception, performance, pérennisation, CEJM. Dès 750 € par module.", unitLabel:'module', unit:null, priceNote:'Financement possible via France Travail · OPCO selon votre situation. Inter/intra entreprise : tarif majoré (présentiel) — devis après analyse du besoin. Accès en ligne valable 1 an à compter de l\'inscription ; passé ce délai, l\'accès au module est suspendu.', chips:[['22','modules Transport & Logistique'],['Modulaire','à la carte'],['Dès 750€','/ module']], facts:[['Pôle','Transport — Transport de marchandises'],['Blocs','BC1 · BC2 · BC3 · BC4 · BC8 (22 modules)'],['Financement','France Travail · OPCO'],['Parcours visé','Transport de marchandises (niv. visé 5)'],['Format','En ligne · présentiel · inter/intra · individualisée'],['Durée d\'accès','1 an à compter de l\'inscription']], activities:transportActs, offers:reglementaireOffers.concat(accompagnementOffers), bundlePrice:11000, info:info('gtla',{certif:DATA.gtla.certif}) }, fondamentaux:{ short:'Réinsertion', poleLabel:"Réinsertion professionnelle · Socle de compétences", title:'Réinsertion professionnelle — composez votre parcours socle de compétences', tagline:"Revenez à l'emploi durablement : sécurisez les savoirs de base (français, calcul, numérique, posture pro). Choisissez les domaines dont vous avez besoin, sur devis après évaluation gratuite de votre niveau.", unitLabel:'module', unit:null, priceNote:'Tarif sur devis, après évaluation de niveau gratuite. Financement possible via France Travail · OPCO selon votre situation.', chips:[['7','domaines de compétences'],['Sur devis','après évaluation'],['Individualisé','à distance']], facts:[['Socle','7 compétences clés professionnelles'],['Domaines','7 compétences clés'],['Tarif','Sur devis, après évaluation de niveau'],['Financement','France Travail · OPCO'],['Format','À distance, individualisé']], activities:[{ label:'Socle de compétences — 7 domaines', title:'Compétences clés pour l\'emploi', duree:'7 modules', modules:(DATA.clea.programme[0].points||[]).map(function(pt,mi){ return {t:pt, dur:(CLEA_DUR[mi]||'')+' (selon évaluation)', hours:0, eval:false, price:null, devis:true, src:{k:'clea',ai:0,mi:mi}}; }) }], offers:[], info:info('clea') } }; // ===== Snapshot de base + surcharges admin (édition en ligne) ===== function clone(o){return JSON.parse(JSON.stringify(o));} window.POLES_BASE=clone(window.POLES); function applyAdminOverrides(ov){ if(!ov) return; Object.keys(ov||{}).forEach(function(k){ var p=window.POLES[k], o=ov[k]; if(!p||!o) return; if(o.title!=null) p.title=o.title; if(o.tagline!=null) p.tagline=o.tagline; if(o.unit!=null && o.unit!=='') p.unit=+o.unit; if(o.activities){ p.activities=o.activities.map(function(a){ return {label:a.label||'', title:a.title||'', duree:a.duree||'', modules:(a.modules||[]).map(function(m){ var pr=(m.price===''||m.price==null)?null:+m.price; return {t:m.t||'', dur:m.dur||'', hours:+m.hours||0, price:pr, eval:!!m.eval, included:(!!m.included)|| (pr==null && !m.eval), src:m.src||null, fiche:m.fiche||null}; })}; }); } if(o.offer && p.offers && p.offers[0]){ o.offer.forEach(function(opt,i){ var t=p.offers[0].options[i]; if(!t)return; if(opt.label!=null) t.label=opt.label; if(opt.price!=null&&opt.price!=='') t.price=+opt.price; if(opt.note!=null) t.note=opt.note; }); } }); } function assignIds(){ Object.keys(window.POLES).forEach(function(k){ (window.POLES[k].activities||[]).forEach(function(act,gi){ act.modules.forEach(function(m,mi){ m.id = m.src ? (m.src.k+':'+m.src.ai+(m.src.mi!=null?(':'+m.src.mi):'')) : (k+':cust:'+gi+':'+mi); }); }); }); } function restoreNonEditablePoles(){ // Transport & Réinsertion ne sont pas éditables depuis /gestion-formations/ : on repart toujours // du canonique pour éviter qu'une surcharge orpheline ne corrompe ces pôles. window.POLES.transport.activities = transportActs; window.POLES.fondamentaux.activities = [{ label:'Socle de compétences — 7 domaines', title:"Compétences clés pour l'emploi", duree:'7 modules', modules:(DATA.clea.programme[0].points||[]).map(function(pt,mi){ return {t:pt, dur:(CLEA_DUR[mi]||'')+' (selon évaluation)', hours:0, eval:false, price:null, devis:true, src:{k:'clea',ai:0,mi:mi}}; }) }]; } restoreNonEditablePoles(); assignIds(); applyRealPricingConfig(); // ===== Surcharges Direction réelles (prix/titres/modules édités depuis /gestion-formations/) ===== // Stockées côté serveur (kiamis-kv-api.php, clé 'poles_override') par la page de gestion — // remplace l'ancien mécanisme mort qui ne lisait que du localStorage local au poste du gérant. function applyRealOverrides(){ fetch('/wp-content/kiamis-html/kiamis-kv-api.php?action=get&key=poles_override') .then(function(r){return r.json();}) .then(function(res){ if(!res.ok||!res.value||!Object.keys(res.value).length) return; applyAdminOverrides(res.value); // Le pôle Logistique est le seul éditable ; Transport/Réinsertion restent canoniques. restoreNonEditablePoles(); assignIds(); applyRealModalites(); window.dispatchEvent(new CustomEvent('kiamis:pricing-updated')); }).catch(function(){}); } // ===== Disponibilité de vente par module (en ligne / présentiel / les deux) ===== // Défini par la Direction depuis /gestion-formations/, stocké réellement (kiamis-kv-api.php, clé 'modalites'). function applyRealModalites(){ fetch('/wp-content/kiamis-html/kiamis-kv-api.php?action=get&key=modalites') .then(function(r){return r.json();}) .then(function(res){ var map=(res.ok&&res.value)||{}; if(!map||!Object.keys(map).length) return; Object.keys(window.POLES).forEach(function(k){ (window.POLES[k].activities||[]).forEach(function(act){ act.modules.forEach(function(m){ if(!m.id||!map[m.id]) return; var v=map[m.id]; if(Array.isArray(v)){ m.modes=v; var hasLigne=v.indexOf('ligne')>=0, hasPres=v.indexOf('inter')>=0||v.indexOf('intra')>=0; m.modalite=(hasLigne&&hasPres)?'both':(hasPres?'presentiel':'ligne'); } else { m.modalite=v; } }); }); }); window.dispatchEvent(new CustomEvent('kiamis:pricing-updated')); }).catch(function(){}); } applyRealModalites(); applyRealOverrides(); })();