Autor Zpráva
silverman
Profil
Dobrý den všem,
hned na začátek uvedu, že jsem absolutní JavaScript lama a kód se kterým bych potřeboval pomoci lepím jak vlaštovka hnízdo. Prosím tedy o shovívavost a co nejméně šutrů na mojí hlavu :-).
Dělám script na výpočet čisté mzdy, výsledky půjdou do MySQL databáze, ale s tím problém nemám. Problém je v tom, že bych to celé potřeboval "zautomatizovat" na jedno tlačítko a ne jak to mám zatím zpatlané já. Přidávám testovací funkční kód, který mám zatím hotový a chtěl bych poprosit někoho zkušeného jestli by mi s tím pomohl.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1250" />
<title>Výpočet mzdy</title>
<script language="JavaScript">
<!--
function hodmzda_times_odphod(form) {
hodmzda=eval(form.hodmzda.value)
odphod=eval(form.odphod.value)
hmzda=hodmzda*odphod 
form.hmzda.value=hmzda
zzp=hmzda*0.045 
form.zzp.value=zzp
zsp=hmzda*0.065 
form.zsp.value=zsp
zmzp=hmzda*0.25 
form.zmzp.value=zmzp
zmsp=hmzda*0.09 
form.zmsp.value=zmsp
zvd=hmzda+zmzp+zmsp 
form.zvd.value=zvd
dp=hmzda+zmzp+zmsp
form.dp.value=dp
}
-->
</script>                  
</head>
<center>
<form name="formx">
<table width="800px" cellspacing="0" cellpadding="0" style="border: 1px solid #00006A;">
<tr>
<td height="20" align="center" colspan="6" bgcolor="#006EB0">
<font color="#DEDEEF"><b>Výpočet mzdy</b></font>
</td>
</tr>
<tr>
<td><br>&nbsp;Hodinová mzda Kč:<input type=text size=10 name="hodmzda"></td>
<td><br>Odpracované hodiny:<input type="text" size=10 name="odphod"></td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td align="center"><br><input type="button" value=" Vypočítej " onClick="hodmzda_times_odphod(this.form)"></td>
<td align="right"><br>Hrubá mzda v Kč:<input type="text" name="hmzda" size=10 value="0">&nbsp;</td>
</tr>
<tr>
<td colspan="6"><hr></td>
</tr>
<tr>
<td></td>
<td>Zdravotní pojištění zaměstnanec:</td>
<td></td>
<td><input type="hidden" name="zzp" size=10></td>
<td align="center"><input type="button" value=" Vypočítej " onclick="formx.zp.value = Math.ceil(formx.zzp.value)"></td>
<td align="right"><input type="text" name="zp" size=10 value="0">&nbsp;</td>
</tr>
<tr>
</tr>
<tr>
<td></td>
<td>Sociální pojištění zaměstnanec:</td>
<td></td>    
<td><input type="hidden" name="zsp" size=10></td>
<td align="center"><input type="button" value=" Vypočítej " onclick="formx.sp.value = Math.ceil(formx.zsp.value)"></td>
<td align="right"><input type="text" name="sp" size=10 value="0">&nbsp;</td>
</tr>
<td colspan="6"><hr></td>
<tr>
<td></td>
<td>Zdravotní pojištění zaměstnavatel:</td>
<td></td>
<td><input type="hidden" name="zmzp" size=10></td>
<td align="center"><input type="button" value=" Vypočítej " onclick="formx.zpz.value = Math.ceil(formx.zmzp.value)"></td>
<td align="right"><input type="text" name="zpz" size=10 value="0">&nbsp;</td>
</tr>
<tr>
</tr>
<tr>
<td></td>
<td>Sociální pojištění zaměstnavatel:</td>
<td></td>    
<td><input type="hidden" name="zmsp" size=10></td>
<td align="center"><input type="button" value=" Vypočítej " onclick="formx.spz.value = Math.ceil(formx.zmsp.value)"></td>
<td align="right"><input type="text" name="spz" size=10 value="0">&nbsp;</td>
</tr>
<td colspan="6"><hr></td>
<tr>
<td></td>
<td>Základ pro výpočet daně:</td>
<td></td>    
<td><input type="hidden" name="zvd" size=10></td>
<td align="center"><input type="button" value=" Vypočítej " onclick="formx.vd.value = Math.ceil(formx.zvd.value/100)*100"></td>
<td align="right"><input type="text" name="vd" size=10 value="0">&nbsp;</td>
</tr>
<td colspan="6"><hr></td>
<tr>
<td></td>
<td>Daň z příjmů:</td>
<td></td>    
<td><input type="hidden" name="dp" size=10></td>
<td align="center"><input type="button" value=" Vypočítej " onclick="formx.dzp.value = Math.ceil(formx.dp.value/100)*100*0.15"></td>
<td align="right"><input type="text" name="dzp" size=10 value="0">&nbsp;</td>
</tr>
</table>
</form>

</center>
Ještě jednou díky moc !!!
peta
Profil
radek 31 - width="800px" width nema hodnotu v px
radek 9+10 - misto eval se pouziva * 1 nebo parseFloat, kdyz chces prevest typ string na float
radek 29 - schazi body
radke 6 - zbytecny language, schazejici type="text/javascript"
radek 30 - podle XHTML 1.0 Transitional//EN tam nemas action
radek 38 - podle XHTML 1.0 Transitional//EN se pise lomitko v br <br/> (podobne na dalsich radcich i pro hr)
radek 38 - podle XHTML 1.0 Transitional//EN se pisi uvozovky type="text" size="10" (podobne na dalsich radcich)
radek 38 - podle XHTML 1.0 Transitional//EN se pisi uvozovky type="text" size="10" (podobne na dalsich radcich)
radek 42 - podle XHTML 1.0 Transitional//EN se pise onclick s malym c
atd
Mam tu editor, ktery mi to obarvuje a mam tu cervene more.

na jedno tlačítko
Proc si tedy neudelas funkci treba onclickVse() {} a do ni nepresunes kod ze vsech onclick oddeleny strednikem?
Jedina zmena bude hodmzda_times_odphod(formx); misto this.form.
function onclickVse() {
hodmzda_times_odphod(formx);
formx.zp.value = Math.ceil(formx.zzp.value);
formx.sp.value = Math.ceil(formx.zsp.value);
...
}
silverman
Profil
Díky moc za připomínky a radu - odpoledne vyzkouším.
_es
Profil
silverman:
Viď: Časté potíže, zajímavosti a poučné debaty » Používejte var.
Nemá to slúžiť ako formulár pre serverový skript, no je to tak spravené ( Formuláře » form) - stlačenie enter spôsobí jeho odoslanie - formulárové prvky nemusia byť vo formulári.
Chamurappi
Profil
Reaguji na peta:
To je zase snůška blbostí namixovaná s přijatelnými radami…

radek 29 - schazi body
<body> nemá v HTML povinnou počáteční ani ukončovací značku. On používá HTML. Kdyby používal XHTML, tak se mu stránka ani nenalistuje.

radke 6 - zbytecny language, schazejici type="text/javascript"
Atribut type je také zbytečný.

radek 30 - podle XHTML 1.0 Transitional//EN tam nemas action
<!doctype> o pravidlech HTML nerozhoduje, v HTML 5 je action nepovinný. (Uvedený <!doctype> je v HTML 5 explicitně dovolený.)

radek 38 - podle XHTML 1.0 Transitional//EN se pise lomitko v br <br/>“ + další tři takzvané chyby.
A o syntaxi už <!doctype> nerozhoduje vůbec. Lomítko budou prohlížeče ignorovat.


Reaguji na _es:
formulárové prvky nemusia byť vo formulári
Ale jejich hledání v DOMu je trochu pohodlnější, když v něm jsou. Na jeho místě bych možná spíš přidal formuláři onsubmit="return false".
_es
Profil
Chamurappi:
Na jeho místě bych možná spíš přidal formuláři onsubmit="return false".
Čo zase spôsobí na strane užívateľa nepochopenie, ak je JS vypnutý (Prečo sa stránka stále znovu načíta?). Formulárové prvky mimo formulára to nespôsobia, len ten výpočet „nefunguje“.
peta
Profil
Chamurappi:
Muj validator i editor tam hlasi chyby a je to zpusobeno doctypem. Prijd, ukazi, ze kdyz zmenim doctype, tak spousta tech veci to zkousne. nerikam, ze to vadi prohlizeci.
A pak je tu dost dobry argument, jednotnost. Jednou si vybral 1.0, ta ma jakasi pravidla a kdyz je pro meta dodrzet muze, tak je muze dodrzet i pro ostatni kod. At to nevypada, jako kdyby to psal chamurapi.
Chamurappi
Profil
Reaguji na peta:
Muj validator i editor tam hlasi chyby
A tvůj rozum je příliš slabý na to, aby sám vyhodnotil, zda dávají smysl.

Prijd, ukazi, ze kdyz zmenim doctype, tak spousta tech veci to zkousne.
To je jeho chyba, ne autora stránky. Až se někdy vrátím k mému validátoru, jedna z prvních úprav bude, že zruším detekci DTD z <!doctype> deklarace. Všechno, co se posílá s MIME typem text/html, je v jurisdikci HTML 5.

nerikam, ze to vadi prohlizeci.
Já říkám, že mu to ani vadit nesmí, takže jsou to zcela zbytečná pravidla. Doporučuji ti vlastní soukromou pověrčivost praktikovat mimo diskusi.


Reaguji na _es:
nepochopenie, ak je JS vypnutý
To je fakt, ale nepochopení způsobují obě možnosti a v důsledku člověk bez JS tak jako tak nebude spokojen. Varianta s <form>em má blíž k tomu, že někdo někdy třeba dodělá serverové počítání.
silverman
Profil
Koukám, že jsem ač nerad rozpoutal vášnivou debatu. Abych to alespoň částečně uvedl na správnou míru, musím podotknout, že HaTMatiLka jako taková je pouze testovací - abych viděl v nějaké formě jak to funguje a neměl to rozházené po stránce. Že se <br> a <hr> má psát s lomítky vím, že je chybou chybějící type="text/javascript" také vím, ale mě jde hlavně o ten JavaScript ostatní zatím neřeším protože ten výpočet mzdy bude modul do účtovací aplikace kterou jsem si spáchal a je celá v PHP a data jdou do MySQL. Zkoušel jsem radu od peta, ale asi jsem tupej a nějak mi to nefachá. Vypadá to takto:
function vypocitej() {
hodmzda_times_odphod(formx);
formx.zp.value = Math.ceil(formx.zzp.value);
formx.sp.value = Math.ceil(formx.zsp.value);
formx.zpz.value = Math.ceil(formx.zmzp.value;
formx.spz.value = Math.ceil(formx.zmsp.value;
formx.vd.value = Math.ceil(formx.zvd.value/100)*100;
formx.dzp.value = Math.ceil(formx.dp.value/100)*100*0.15;
}

<input type="button" value=" Vypočítej " onclick="vypocitej()">

ale nic se neděje. Tipuju, že dělám chybu v tom tlačítku, ale nejsem si jistej :-( .
peta
Profil
radk 5, 6nemas na konci zavorku ).
silverman
Profil
Opět chyba mezi židlí a klávesnicí - bylo to tím. Funguje to - DÍKY MOC !!!
Chamurappi
Profil
Reaguji na silvermana:
Že se <br> a <hr> má psát s lomítky vím
Ta lomítka tam budou úplně zbytečně, prohlížeč je bude ignorovat jako každou jinou syntaktickou chybu.

vím, že je chybou chybějící type="text/javascript"
Jen podle starodávných nesmyslných pravidel.

výpočet mzdy bude modul do účtovací aplikace kterou jsem si spáchal a je celá v PHP
Proč jsi i ten výpočet mzdy neudělal také v PHP?
silverman
Profil
No nerad bych opět rozpoutal vášnivou debatu tak se budu snažit odpovídat "opatrně".
K prvním dvěma připomínkám - na správnost psaní HTML jsem četl tolik názorů, že nevím co si vlastně vybrat. Validátory z preventivních důvodů už nepoužívám, protože jsem po jejich výsledcích zralej na antidepresiva :-).
Na poslední otázku je (alespoň pro mě) jednoduchá odpověď: v účetnictví se zaokrouhluje prakticky pokaždé jinak a já našel víc postupů na vhodné zaokrouhlování v JavaScriptu než v PHP. No a abych byl upřímný tak si myslím, že na matematiku a grafiku je prostě JavaScript lepší.
_es
Profil
silverman:
já našel víc postupů na vhodné zaokrouhlování v JavaScriptu než v PHP.
Čo je na zaokrúhľovaní také zložité, že majú byť „rôzne postupy“? V kóde v [#1] je postup aký? „Postup“ predsa nezávisí od programovacieho jazyka. Prečo by sa rovnaký „postup“ ako v JS nedal použiť aj v PHP?

na matematiku a grafiku je prostě JavaScript lepší.
Viď vlákno JavaScript nebo PHP.
silverman
Profil
Já to věděl :-)
Nepsal jsem, že jsou v zaokrouhlování "rôzne postupy", ale že se zaokrouhluje pokaždé jinak a v tom je rozdíl.
Nevim jak se vyznáš v účetnictví, ale já ho dělám už pěknejch pár let.
Tak,že v ukázce, která je pouhý začátek celého kódu je zaokrouhlování třeba tady:
formx.vd.value = Math.ceil(formx.zvd.value/100)*100;
což znamená zaokrouhlit superhrubou mzdu neboli Základ pro výpočet daně směrem nahoru na celé stovky.
Tohle: formx.dzp.value = Math.ceil(formx.dp.value/100)*100*0.15; zase vypočítá a zaokrouhlí Zálohu na daň před uplatněním slev.
Jen pro zajímavost - Sociální a zdravotní pojištění se pro změnu zaokrouhluje pouze na koruny nahoru. Kdo si sám dělá účetnictví a daňové přiznání tak dobře ví jakej je v zaokrouhlování hokej.
No a bych to tedy jo rozvířil tak položím otázku: Když je tedy PHP a JS stejně vhodný na podobné aplikace proč prakticky každá online kalkulačka mzdy využívá JS.
Např: http://www.mesec.cz/kalkulacky/vypocet-ciste-mzdy/ to na 100% neni PHP.
Až to bude celé hotové klidně to sem hodim ať sám vidíš, že vypočítat výplatu kterou ti dělaj v účtárně neni žádná pr...
Jinak berte vlákno za uzavřené a problém vyřešený - DÍKY TĚM CO MI POMOHLI !!! a nechtěli jen diskutovat.
_es
Profil
silverman:
proč prakticky každá online kalkulačka mzdy využívá JS.
1) Pretože má návštevník výsledok výpočtu k dispozícii ihneď a nemusí čakať na odpoveď servera.
2) Pretože je server menej zaťažovaný.

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0