// This is an exercise using sysquake and its interaction // to make an explication and camparaison between insurances // // by Francesco Mondada // saturation of participation by Skye Legon, THANKS! help {@ ECAM est une illustration intŽractive du fonctionnement et des tarifs des assurances maladie. ATTENTION: les tarifs mentionŽs sont valables seulement pour un adulte qui habite dans la banlieue de Lausanne pour l'annŽe 2002. Une gŽnŽralisation du calcul ˆ tous les cas dŽpendera des echos reu sur ce deuxime (le premier a ŽtŽ 2001) essai. Commentaire bienvenus par email ˆ francesco@mondada.net @} variable mode // display mode (1=one insurance, 2=comparaison) variable expenses // expenses in the graph variable franchise // matrix with all franchises of all insurances variable prime // matrix with all primes of all insurances variable assurance // insurance checked variable totassurances // number of insurances variable cmpfranchise // on which franchise insurances are compared variable asscompared // insurances in comparaison init (assurance, expenses,prime,franchise,mode,totassurances,cmpfranchise,asscompared) = initfn figure "Explication interactive des paramtres d'assurance maladie" draw drawPrices(expenses,prime,franchise,assurance,mode,totassurances,cmpfranchise,asscompared) mousedrag (expenses) = drag(expenses,_id,_x1,_y1) mouseover (_msg, _cursor) = over(_id) menu "comprendre GRAPHE" _checkmark(mode==3) (mode) = setMode3(mode) menu "comparer FRANCHISES" _checkmark(mode==1) (mode) = setMode1(mode) menu "comparer ASSURANCES" _checkmark(mode==2) (mode) = setMode2(mode) separator menu "ASSURA" _checkmark(checkassu(assurance,mode,asscompared,1)) (assurance,asscompared) = setAssura(assurance,mode,asscompared,1) menu "NATURA (by GM)" _checkmark(checkassu(assurance,mode,asscompared,2)) (assurance,asscompared) = setAssura(assurance,mode,asscompared,2) menu "…KK" _checkmark(checkassu(assurance,mode,asscompared,3)) (assurance,asscompared) = setAssura(assurance,mode,asscompared,3) menu "CONCORDIA" _checkmark(checkassu(assurance,mode,asscompared,4)) (assurance,asscompared) = setAssura(assurance,mode,asscompared,4) menu "PROGRES" _checkmark(checkassu(assurance,mode,asscompared,5)) (assurance,asscompared) = setAssura(assurance,mode,asscompared,5) menu "SANITAS" _checkmark(checkassu(assurance,mode,asscompared,6)) (assurance,asscompared) = setAssura(assurance,mode,asscompared,6) menu "CPT" _checkmark(checkassu(assurance,mode,asscompared,7)) (assurance,asscompared) = setAssura(assurance,mode,asscompared,7) menu "PHILOS" _checkmark(checkassu(assurance,mode,asscompared,8)) (assurance,asscompared) = setAssura(assurance,mode,asscompared,8) menu "CSS" _checkmark(checkassu(assurance,mode,asscompared,9)) (assurance,asscompared) = setAssura(assurance,mode,asscompared,9) menu "INTRAS" _checkmark(checkassu(assurance,mode,asscompared,10)) (assurance,asscompared) = setAssura(assurance,mode,asscompared,10) menu "HELSANA" _checkmark(checkassu(assurance,mode,asscompared,11)) (assurance,asscompared) = setAssura(assurance,mode,asscompared,11) menu "SWICA" _checkmark(checkassu(assurance,mode,asscompared,12)) (assurance,asscompared) = setAssura(assurance,mode,asscompared,12) menu "VISANA" _checkmark(checkassu(assurance,mode,asscompared,13)) (assurance,asscompared) = setAssura(assurance,mode,asscompared,13) menu "selectionner tout" (asscompared) = setAllAssura(mode,asscompared,totassurances) menu "selectionner une" (asscompared) = setOneAssura(mode,asscompared,assurance) separator menu "franchise 230fr/an" _checkmark(cmpfranchise==1) _enable(mode~=1) (cmpfranchise) = setF230(cmpfranchise) menu "franchise 400fr/an" _checkmark(cmpfranchise==2) _enable(mode~=1) (cmpfranchise) = setF400(cmpfranchise) menu "franchise 600fr/an" _checkmark(cmpfranchise==3) _enable(mode~=1) (cmpfranchise) = setF600(cmpfranchise) menu "franchise 1200fr/an" _checkmark(cmpfranchise==4) _enable(mode~=1) (cmpfranchise) = setF1200(cmpfranchise) menu "franchise 1500fr/an" _checkmark(cmpfranchise==5) _enable(mode~=1) (cmpfranchise) = setF1500(cmpfranchise) functions {@ function (assurance, expenses,prime,franchise,mode,totassurances,cmpfranchise,asscompared) = initfn asscompared = [2,3,4,6,8]; mode = 3; // understand graphic expenses = 200; cmpfranchise=3; // start with comparaison 600 //assura assurance = 1; // 'assura'; franchise(assurance, 1) = 230; prime(assurance,1) = 278; franchise(assurance,2)=400; prime(assurance,2)=264; franchise(assurance,3)=600; prime(assurance,3)=248; franchise(assurance,4)=1200; prime(assurance,4)=198; franchise(assurance,5)=1500; prime(assurance,5)=173; //Natura (by GM) assurance = 2; // 'Natura (by GM)'; franchise(assurance, 1) = 230; prime(assurance,1) = 264.8; franchise(assurance,2)=400; prime(assurance,2)=250.7; franchise(assurance,3)=600; prime(assurance,3)=234; franchise(assurance,4)=1200; prime(assurance,4)=185.4; franchise(assurance,5)=1500; prime(assurance,5)=159; //škk assurance = 3; // 'OKK'; franchise(assurance, 1) = 230; prime(assurance,1) = 280; franchise(assurance,2)=400; prime(assurance,2)=267.2; franchise(assurance,3)=600; prime(assurance,3)=252; franchise(assurance,4)=1200; prime(assurance,4)=206.6; franchise(assurance,5)=1500; prime(assurance,5)=183.8; //Concordia assurance = 4; // 'Concordia'; franchise(assurance, 1) = 230; prime(assurance,1) = 293.8; franchise(assurance,2)=400; prime(assurance,2)=279.7; franchise(assurance,3)=600; prime(assurance,3)=263; franchise(assurance,4)=1200; prime(assurance,4)=213; franchise(assurance,5)=1500; prime(assurance,5)=188; //Progres assurance = 5; // 'Progres'; franchise(assurance, 1) = 230; prime(assurance,1) = 266.9; franchise(assurance,2)=400; prime(assurance,2)=252.8; franchise(assurance,3)=600; prime(assurance,3)=236.1; franchise(assurance,4)=1200; prime(assurance,4)=186.9; franchise(assurance,5)=1500; prime(assurance,5)=161.1; //Sanitas assurance = 6; // 'Sanitas'; franchise(assurance, 1) = 230; prime(assurance,1) = 308.9; franchise(assurance,2)=400; prime(assurance,2)=294.8; franchise(assurance,3)=600; prime(assurance,3)=278.1; franchise(assurance,4)=1200; prime(assurance,4)=228.1; franchise(assurance,5)=1500; prime(assurance,5)=203.1; //CPT - KPT assurance = 7; // 'CPT'; franchise(assurance, 1) = 230; prime(assurance,1) = 260.9; franchise(assurance,2)=400; prime(assurance,2)=246.8; franchise(assurance,3)=600; prime(assurance,3)=230.1; franchise(assurance,4)=1200; prime(assurance,4)=182.7; franchise(assurance,5)=1500; prime(assurance,5)=156.6; // philos assurance = 8; // 'philos'; franchise(assurance, 1) = 230; prime(assurance,1) = 263.2; franchise(assurance,2)=400; prime(assurance,2)=249.8; franchise(assurance,3)=600; prime(assurance,3)=233.9; franchise(assurance,4)=1200; prime(assurance,4)=186.4; franchise(assurance,5)=1500; prime(assurance,5)=162.6; //CSS assurance = 9; // 'CSS'; franchise(assurance, 1) = 230; prime(assurance,1) = 316.2; franchise(assurance,2)=400; prime(assurance,2)=302.10; franchise(assurance,3)=600; prime(assurance,3)=285.4; franchise(assurance,4)=1200; prime(assurance,4)=235.4; franchise(assurance,5)=1500; prime(assurance,5)=210.4; //Intras assurance = 10; // 'Intras'; franchise(assurance, 1) = 230; prime(assurance,1) = 292; franchise(assurance,2)=400; prime(assurance,2)=279; franchise(assurance,3)=600; prime(assurance,3)=264; franchise(assurance,4)=1200; prime(assurance,4)=216; franchise(assurance,5)=1500; prime(assurance,5)=192; //helsana assurance = 11; // 'helsana'; franchise(assurance, 1) = 230; prime(assurance,1) = 282.2; franchise(assurance,2)=400; prime(assurance,2)=268.1; franchise(assurance,3)=600; prime(assurance,3)=251.4; franchise(assurance,4)=1200; prime(assurance,4)=201.4; franchise(assurance,5)=1500; prime(assurance,5)=176.4; //SWICA assurance = 12; // 'SWICA'; franchise(assurance, 1) = 230; prime(assurance,1) = 319.95; franchise(assurance,2)=400; prime(assurance,2)=306.8; franchise(assurance,3)=600; prime(assurance,3)=291.45; franchise(assurance,4)=1200; prime(assurance,4)=245.05; franchise(assurance,5)=1500; prime(assurance,5)=222.05; //Visana assurance = 13; // 'Visana'; franchise(assurance, 1) = 230; prime(assurance,1) = 303.4; franchise(assurance,2)=400; prime(assurance,2)=290; franchise(assurance,3)=600; prime(assurance,3)=274.1; franchise(assurance,4)=1200; prime(assurance,4)=226.5; franchise(assurance,5)=1500; prime(assurance,5)=202.7; totassurances = assurance; //default assura assurance = 1; // 'ASSURA'; function drawPrices(expenses,prime,franchise,assurance,mode,totassurances,cmpfranchise,asscompared) if mode==1 // compare franchises scale([0,8000,0.5,6.5]) // set the dimensions of graphics for i=1:5 if expenses 6000) cout(i)=prime(assurance,i)*12+franchise(assurance,i); cout10(i)=cout(i)+600; else cout(i)=prime(assurance,i)*12+franchise(assurance,i); cout10(i)=cout(i)+0.1*(expenses-franchise(assurance,i)); end end greenbar=[expenses]; try // compatibility problem between hbar and barh eval('barh(1:size(greenbar,2),greenbar,[0.8,0.8],''grouped'',''g'')'); catch eval('hbar(1:size(greenbar,2),greenbar,[0.8,0.8],''grouped'',''g'')'); end cyanbars=[0,cout10]; yellowbars=[0,cout]; bluebars=[0]; zerobars=[0]; for i=1:5 bluebars(i+1)=prime(assurance,i)*12; zerobars(i+1)=0; end cyanbars=[zerobars;0,cout10;zerobars]; try // compatibility problem between hbar and barh eval('barh(1:size(cyanbars,2),cyanbars,1,''grouped'',''c'')'); eval('barh(1:size(yellowbars,2),yellowbars,[0.8,0.8],''grouped'',''y'')'); eval('barh(1:size(bluebars,2),bluebars,[0.8,0.8],''grouped'',''b'')'); catch eval('hbar(1:size(cyanbars,2),cyanbars,1,''grouped'',''c'')'); eval('hbar(1:size(yellowbars,2),yellowbars,[0.8,0.8],''grouped'',''y'')'); eval('hbar(1:size(bluebars,2),bluebars,[0.8,0.8],''grouped'',''b'')'); end redbars=[0,cout10;zerobars;zerobars]; try // compatibility problem between hbar and barh eval('barh(1:size(redbars,2),redbars,1,''grouped'',''r'')'); catch eval('hbar(1:size(redbars,2),redbars,1,''grouped'',''r'')'); end line([1,0], expenses, 'G', 1); // plot the red point of manipulation of the sun text(expenses+120,1,sprintf('Frais mŽdicaux par an: %d fr', expenses),'l') text(expenses+120,0.75,sprintf('(comparaison pour une couverture chez %s)',nameofass(assurance)),'l') for i=1:5 text(prime(assurance,i)*12-20,i+1.25,sprintf('Prime pour franchise %d->', franchise(assurance,i)),'r') text(prime(assurance,i)*12-20,i+1.05,sprintf('(%d fr/mois, %d fr/an) ', prime(assurance,i), prime(assurance,i)*12),'r') end for i=1:5 text(cout(i)+20,i+1.25,sprintf('<- Frais dans franchise de %d (%d fr)', franchise(assurance,i),cout(i)-prime(assurance,i)*12),'l') end for i=1:5 if cout10(i)>cout(i) text(cout10(i)+20,i+1,sprintf('<- Participation de 10%% aux frais hors franchise (%d fr)',cout10(i)-cout(i)),'l') end end for i=1:5 text(cout10(i)+20,i+0.75,sprintf('<- Vous payez %d fr/an)',cout10(i)),'l') end elseif mode==2// compare assurances scale([0,7000,0.5,size(asscompared,2)+1+0.5]) // set the dimensions of graphics for i=1:size(asscompared,2) if expenses', nameofass(asscompared(i))),'r') text(prime(asscompared(i),cmpfranchise)*12-20,i+1,sprintf('(prime: %d/mois ou %d/an) ', prime(asscompared(i),cmpfranchise),prime(asscompared(i),cmpfranchise)*12),'r') end else for i=1:size(asscompared,2) text(prime(asscompared(i),cmpfranchise)*12-20,i+1.25,sprintf('Prime %s: %d/an ->', nameofass(asscompared(i)),prime(asscompared(i),cmpfranchise)*12),'r') end end if size(asscompared,2)<8 for i=1:size(asscompared,2) text(cout(i)+20,i+1.25,sprintf('<- Frais dans franchise de %d (%d fr)', franchise(asscompared(i),cmpfranchise),cout(i)-prime(asscompared(i),cmpfranchise)*12),'l') end end if size(asscompared,2)<8 for i=1:size(asscompared,2) if cout10(i)>cout(i) text(cout10(i)+20,i+1,sprintf('<- Participation de 10%% aux frais hors franchise (%d fr)',cout10(i)-cout(i)),'l') end end end for i=1:size(asscompared,2) text(cout10(i)+20,i+0.75,sprintf('<- Vous payez %d fr/an)',cout10(i)),'l') end else // mode 3: understanding the representation scale([0,7000,0.5,2.5]) // set the dimensions of graphics if expensescout(1) text(expenses+120,0.9,' Ces frais dŽpassent le montant de la franchise.','l') text(expenses+120,0.82,sprintf(' L''assurance vous rembourse %d fr',expenses-(cout10(1)-prime(assurance,cmpfranchise)*12)),'l') text(expenses+120,0.74,' (90% des frais en dessus de la franchise).','l') elseif cout(1)-prime(assurance,cmpfranchise)*12>0 text(expenses+120,0.9,' Ces frais sont en dessous du montant de la franchise.','l') text(expenses+120,0.82,' L''assurance ne vous rembourse rien.','l') end text(prime(assurance,cmpfranchise)*12-20,2.35,sprintf('Prime chez %s ->', nameofass(assurance)),'r') text(prime(assurance,cmpfranchise)*12-20,2.27,sprintf('(%d fr/mois, %d fr/an) ', prime(assurance,cmpfranchise), prime(assurance,cmpfranchise)*12),'r') text(prime(assurance,cmpfranchise)*12-20,2.19,sprintf('avec franchise de %d fr/an. ', franchise(assurance,cmpfranchise)),'r') text(prime(assurance,cmpfranchise)*12-20,2.11,'Vous payez toujours ce montant ','r') text(prime(assurance,cmpfranchise)*12-20,2.03,'de base indiquŽ en bleu ','r') if cout(1)-prime(assurance,cmpfranchise)*12>0 text(cout(1)+20,2.35,'<- Frais que vous devez payer car infŽrieurs','l') text(cout(1)+20,2.27,sprintf(' ˆ la franchise de %d fr/an. Vous payez donc', franchise(assurance,cmpfranchise)),'l') text(cout(1)+20,2.19,sprintf(' %d fr (ici en jaune) en plus de la prime.', cout(1)-prime(assurance,cmpfranchise)*12),'l') end if cout10(1)>cout(1) text(cout10(1)+20,2.1,sprintf('<- Participation de 10%% aux frais hors franchise (%d fr)',cout10(1)-cout(1)),'l') text(cout10(1)+20,2.02,' L''assurance rembourse les frais ayant dŽpassŽ le montant de','l') text(cout10(1)+20,1.94,' la franchise mais vous demande une participation de 10%.','l') end text(cout10(1)+20,1.75,sprintf('<- Vous payez %d fr/an)',cout10(1)),'l') end function (expenses) = drag(expenses,id, x1, y1) // manipulations: switch id case 1 // this is the manipulation of the expenses bar expenses = x1; if expenses < 0 expenses = 0; end end function (msg, cursor) = over(id) if ~isempty(id) cursor = true; switch id case 1 // this is the manipulation of the vertical bar msg = 'indiquez les frais couverts par l''assurance'; otherwise msg = ''; end else cursor = false; msg = ''; end // --- setting assurance ----- function (assurance,asscompared) = setAssura(assurance,mode,asscompared,assu) if mode==1 // compare franchises assurance = assu; elseif mode==2 if incompared(assu,asscompared) asscompared = removeassura(assu,asscompared); else asscompared = addassura(assu,asscompared); end elseif mode==3 assurance = assu; end function (asscompared) = setAllAssura(mode,asscompared,totassurances) if mode==2 // compare assurances asscompared = 1:totassurances; else dialog('Vous ne pouvez pas sŽlectionner toutes les assurances dans ce mode de visualisation'); end function (asscompared) = setOneAssura(mode,asscompared,assurance) if mode==2 // compare assurances asscompared = [assurance]; end //------- mode selection ----- function (mode) = setMode1(mode) mode = 1; function (mode) = setMode2(mode) mode = 2; function (mode) = setMode3(mode) mode = 3; //-------- set franchise ----- function (cmpfranchise) = setF230(cmpfranchise) cmpfranchise = 1; function (cmpfranchise) = setF400(cmpfranchise) cmpfranchise = 2; function (cmpfranchise) = setF600(cmpfranchise) cmpfranchise = 3; function (cmpfranchise) = setF1200(cmpfranchise) cmpfranchise = 4; function (cmpfranchise) = setF1500(cmpfranchise) cmpfranchise = 5; // ------ name of insurance function (name) = nameofass(ass) switch ass case 1 name = 'ASSURA'; case 2 name = 'NATURA (by GM)'; case 3 name = '…KK'; case 4 name = 'CONCORDIA'; case 5 name = 'PROGRES'; case 6 name = 'SANITAS'; case 7 name = 'CPT'; case 8 name = 'PHILOS'; case 9 name = 'CSS'; case 10 name = 'INTRAS'; case 11 name = 'HELSANA'; case 12 name = 'SWICA'; case 13 name = 'VISANA'; otherwise name = 'noname'; end //------- function (x) = incompared(assu,lasscompared) x= false; for i=1:size(lasscompared,2) if lasscompared(i)==assu x=true; end end function (lasscompared) = removeassura(assu,lasscompared) if size(lasscompared,2)<2 dialog('vous ne pouvez pas choisir moins que une assurance'); else for i=1:size(lasscompared,2) if lasscompared(i)==assu x=i; end end for i=x+1:size(lasscompared,2) lasscompared(i-1)=lasscompared(i); end lasscompared(size(lasscompared,2))=''; end function (lasscompared) = addassura(assu,lasscompared) lasscompared(size(lasscompared,2)+1)=assu; lasscompared = sort(lasscompared); function (x) = checkassu(assurance,mode,asscompared,assu) if mode==1 x = (assurance==assu); elseif mode ==2 x = incompared(assu,asscompared); elseif mode ==3 x = (assurance==assu); end @}