Hintojen pyöristys

Started by Rutja76, 14.08.13 - klo:10:20

Previous topic - Next topic

Rutja76

Hei!

Semmoinen huomautus: kun lasketan hinnat (alvittomat ja alvit), ohjelma käyttää (ainakin tulostusta varten) function calculateRowSum, joka sijaitsee tiedostossa miscfuncs.php. Hinnat lasketaan seuraavaksi:

if ($VATIncluded)
  {
    $rowSumVAT = $count * $price;
    $rowSum = $rowSumVAT / (1 + $VAT / 100);
    $rowVAT = $rowSumVAT - $rowSum;
  }
  else
  {
    $rowSum = $count * $price;
    $rowVAT = $rowSum * ($VAT / 100);
    $rowSumVAT = $rowSum + $rowVAT;
  }


Mielestäni tämä ei ole oikea tapa laskea hintoja, sillä pelkästään kertolasku ei pyöristä hintoja kahdella desimaalilla. Tämä on ongelma esim. jos yksikköhinnalla on enemmän desimaaleja (esim. 0,123 euroa/yksikkö), tämä voi tapahtua esim. käännösalalla kun laskutetaan sanamäärällä. Kun pyöristys per rivi ei tapahdu, voi olla että lopullinen hinta ei täsmää, eli

Arvonlisäveroton hinta yhteensä + Arvonlisävero yhteensä ei ole yhtä kuin Arvonlisäverollinen hinta yhteensä   

vaan siinä on esim. senttiero.

Olen itse muuttanut yllä olevat rivit seuraavaksi:

  if ($VATIncluded)
  {
    $rowSumVAT = round($count * $price, 2);
    $rowSum = round(($rowSumVAT / (1 + $VAT / 100)), 2);
    $rowVAT = $rowSumVAT - $rowSum;
  }
  else
  {
    $rowSum = round($count * $price, 2);
    $rowVAT = round(($rowSum * ($VAT / 100)), 2);
    $rowSumVAT = $rowSum + $rowVAT;
  }


Eli jokainen rivihinta pyöristetään kahdella desimaalilla eikä oteta huomioon lisädesimaaleista. Siinä tapauksessa lopullinen hinta täsmää jos lasketaan yhteen alviton hinta ja alv-määrä.

Yllä olevalla muokkauksella luvut ovat ok tulostetussa laskussa (siis pdf-lasku), mutta se ei muuta laskelmia laskun formissa, ilmeisesti nuo luvut lasketaan erikseen ohjelmassa ja pdf-tiedostossa? En itse löytänyt muita paikkoja missä nuo luvut lasketaan.

Voi kokeilla esim. käyttämällä seuraavat luvut:

yksikköhinta (alviton): 0,026 eur
määrä: 868 kpl

Tässä tapauksessa ohjelma antaa:

Alviton hinta: 22,57 eur
Alv 24%: 5,42 eur
Alvillinen hinta: 27,98 eur

Eli yhteenlasku ei täsmää, kun pitäisi olla 27,99 eur. Pyöristämällä laskelmat round-functionilla, hinta täsmää eli se tekee 27,99 eur.

Voisitteko tarkistaa asian?

R.

UPDATE KLO 23:40

Löysin sen: form.php -tiedostossa suoritetaan sama laskelma ohjelman formia varten (yllä oleva koodi on pdf-tiedostoa varten). Tässä tapauksessa asia on pikkusen monimutkaisempi, koska laskelma tehdään javascriptillä ja pyöristys ei ole niin helppo homma (kts. esim. http://stackoverflow.com/questions/2221167/javascript-formatting-a-rounded-number-to-n-decimals). Eli pakko lisätä function joka pyöristää ne luvut. Eli form.php:ssä laskelma alkaa riviltä 656 (minulla on käytössä  MLInvoice 1.6.1). Siihen olen ensin lisännyt


function round_number(num, dec) {
      return Math.round(num * Math.pow(10, dec)) / Math.pow(10, dec);
}


joka pyöristää numeron "num" dec:llä desimaalilla. Ja sitten laskelmat on muutettu seuraavaksi:

     
if (VATIncluded == 1)
      {
        sumVAT = items * price;
sumVAT = round_number(sumVAT, 2); // RIVI LISÄTTY
        sum = sumVAT / (1 + VATPercent / 100);
sum = round_number(sum, 2);  // RIVI LISÄTTY
        VAT = sumVAT - sum;
      }
      else
      {
        sum = items * price;
sum = round_number(sum, 2);  // RIVI LISÄTTY
        VAT = sum * (VATPercent / 100);
VAT = round_number(VAT, 2);  // RIVI LISÄTTY
        sumVAT = sum + VAT;
      }


Huom: yllä oleva koodi toistuu kaksi kertaa form.php:ssä.

Tällä tavalla luvut ovat samanlaiset sekä formissa että pdf-tiedostossa.

R.

Ere Maijala

Hyvä huomio ja ihan totta, pielessähän tämä on. Korjataan täälläkin päässä. Kiitoksia!

--Ere

kzmx

itsekin olen ihmetellyt hiukan noita alv summia... ja onneksi nyt joku huomasi ongelman ja korjasi sen.. mutta sitten omaan ongelmaani..


Missä kohtaa form.php tiedostossa ko. koodin pätkä on ja pitää muuttaa?
en löydä koko form.php tiedostosta edes hakusanalla number tekstiä?

paitsi nyt sitten huomasin että "samantapainen" koodinpätkä on...
mutta onko oikea?
      if (VATIncluded == 1)
      {
        sumVAT = items * price;
        sum = sumVAT / (1 + VATPercent / 100);
        VAT = sumVAT - sum;
      }
      else
      {
        sum = items * price;
        VAT = sum * (VATPercent / 100);
        sumVAT = sum + VAT;
      }


Ja tuo toistuu 2 kertaa

käytänn MLInvoice versiota 1.8.0


Rutja76

Quote from: kzmx on 06.01.14 - klo:16:20Missä kohtaa form.php tiedostossa ko. koodin pätkä on ja pitää muuttaa?
en löydä koko form.php tiedostosta edes hakusanalla number tekstiä?
Et löydä, koska nuo "sum = round_number..." ovat lisäämäni rivit, eli eivät ole aluperäisessä koodissa.

Quote from: kzmx on 06.01.14 - klo:16:20paitsi nyt sitten huomasin että "samantapainen" koodinpätkä on...
mutta onko oikea?
      if (VATIncluded == 1)
      {
        sumVAT = items * price;
        sum = sumVAT / (1 + VATPercent / 100);
        VAT = sumVAT - sum;
      }
      else
      {
        sum = items * price;
        VAT = sum * (VATPercent / 100);
        sumVAT = sum + VAT;
      }


Ja tuo toistuu 2 kertaa
Jep, juuri niihin (katso yllä oleva viestini).

kzmx

eli onko ensimmäinen koodin pätkäsi ensimmäisessä postauksessasi if ($VATIncluded)
  {
    $rowSumVAT = $count * $price;
    $rowSum = $rowSumVAT / (1 + $VAT / 100);
    $rowVAT = $rowSumVAT - $rowSum;
  }
  else
  {
    $rowSum = $count * $price;
    $rowVAT = $rowSum * ($VAT / 100);
    $rowSumVAT = $rowSum + $rowVAT;
  }


myös jo muutettu?

Rutja76

#5
Quote from: kzmx on 13.01.14 - klo:17:33
eli onko ensimmäinen koodin pätkäsi ensimmäisessä postauksessasi if ($VATIncluded)
  {
    $rowSumVAT = $count * $price;
    $rowSum = $rowSumVAT / (1 + $VAT / 100);
    $rowVAT = $rowSumVAT - $rowSum;
  }
  else
  {
    $rowSum = $count * $price;
    $rowVAT = $rowSum * ($VAT / 100);
    $rowSumVAT = $rowSum + $rowVAT;
  }


myös jo muutettu?

Kyllä se on muutettu kuten lukee ensimmäisessä postauksessani, eli näin:

  if ($VATIncluded)
  {
    $rowSumVAT = round($count * $price, 2);
    $rowSum = round(($rowSumVAT / (1 + $VAT / 100)), 2);
    $rowVAT = $rowSumVAT - $rowSum;
  }
  else
  {
    $rowSum = round($count * $price, 2);
    $rowVAT = round(($rowSum * ($VAT / 100)), 2);
    $rowSumVAT = $rowSum + $rowVAT;
  }

Rutja76

Quote from: kzmx on 13.01.14 - klo:17:33
eli onko ensimmäinen koodin pätkäsi ensimmäisessä postauksessasi if ($VATIncluded)
  {
    $rowSumVAT = $count * $price;
    $rowSum = $rowSumVAT / (1 + $VAT / 100);
    $rowVAT = $rowSumVAT - $rowSum;
  }
  else
  {
    $rowSum = $count * $price;
    $rowVAT = $rowSum * ($VAT / 100);
    $rowSumVAT = $rowSum + $rowVAT;
  }


myös jo muutettu?

Ja niin jos tarkoitat sitä, että se olisi muutettu suoraan MLInvoicen viralliseen lähdekoodiin, niin vastaus on ei. Olen siis laittanut nuo muutokset vaan omaan käyttämääni versioon.

Ere Maijala

Commitin https://github.com/emaijala/MLInvoice/commit/22f5666a1ecda888e5aa668763b68c46e7b295cb pitäisi korjata ongelma myös virallisessa versiossa. Kertokaahan, jos siitä uupuu jotain.

t. Ere

kzmx

Quote from: Rutja76 on 24.01.14 - klo:16:45


Ja niin jos tarkoitat sitä, että se olisi muutettu suoraan MLInvoicen viralliseen lähdekoodiin, niin vastaus on ei. Olen siis laittanut nuo muutokset vaan omaan käyttämääni versioon.

Tarkoitin, että postasit vissiin suoraan korjauksen tänne, etkä myös alkuperäistä form.php tiedostossa olevaa koodin pätkää, kun en kerran sitä löytänyt?


kzmx

Quote from: Ere Maijala on 25.01.14 - klo:11:10
Commitin https://github.com/emaijala/MLInvoice/commit/22f5666a1ecda888e5aa668763b68c46e7b295cb pitäisi korjata ongelma myös virallisessa versiossa. Kertokaahan, jos siitä uupuu jotain.

t. Ere

mikä versio githubissa on menossa tällähetkellä? vai käykö noi tiedostot githubista suoraan  version päälle joka on käytössäni tällä hetkellä 1.8.0?

Rutja76

#10
Quote from: kzmx on 27.01.14 - klo:10:54Tarkoitin, että postasit vissiin suoraan korjauksen tänne, etkä myös alkuperäistä form.php tiedostossa olevaa koodin pätkää, kun en kerran sitä löytänyt?
Ilmeisesti puhutaan eri tiedostoista. Alkuperäisessä postaukseni puhutaan alussa (postaukseni kolmas rivi) tiedostosta miscfuncs.php, josta kyllä löytyy tuo koodi, mistä nyt puhutaan.

Alkuperäisen postaukseni loppupäässä ("UPDATE KLO 23:40" -rivin jälkeen) puhutaan sitten form.php -tiedostosta, ja kyseessä on eri koodipätkä kuin se, minkä postasit.

Molemmat pätkät löytyy myös versiosta 1.8.0.

kzmx

Quote from: Rutja76 on 14.08.13 - klo:10:20

UPDATE KLO 23:40

Löysin sen: form.php -tiedostossa suoritetaan sama laskelma ohjelman formia varten (yllä oleva koodi on pdf-tiedostoa varten). Tässä tapauksessa asia on pikkusen monimutkaisempi, koska laskelma tehdään javascriptillä ja pyöristys ei ole niin helppo homma (kts. esim. http://stackoverflow.com/questions/2221167/javascript-formatting-a-rounded-number-to-n-decimals). Eli pakko lisätä function joka pyöristää ne luvut. Eli form.php:ssä laskelma alkaa riviltä 656 (minulla on käytössä  MLInvoice 1.6.1). Siihen olen ensin lisännyt


function round_number(num, dec) {
      return Math.round(num * Math.pow(10, dec)) / Math.pow(10, dec);
}


joka pyöristää numeron "num" dec:llä desimaalilla. Ja sitten laskelmat on muutettu seuraavaksi:

     
if (VATIncluded == 1)
      {
        sumVAT = items * price;
sumVAT = round_number(sumVAT, 2); // RIVI LISÄTTY
        sum = sumVAT / (1 + VATPercent / 100);
sum = round_number(sum, 2);  // RIVI LISÄTTY
        VAT = sumVAT - sum;
      }
      else
      {
        sum = items * price;
sum = round_number(sum, 2);  // RIVI LISÄTTY
        VAT = sum * (VATPercent / 100);
VAT = round_number(VAT, 2);  // RIVI LISÄTTY
        sumVAT = sum + VAT;
      }


Huom: yllä oleva koodi toistuu kaksi kertaa form.php:ssä.

Tällä tavalla luvut ovat samanlaiset sekä formissa että pdf-tiedostossa.

R.

form.php tiedostossa ei ole tekstin pätkää round_number.

vai onko tuo sinun lisäämäsi sinne?

Rutja76

Quote from: kzmx on 27.01.14 - klo:18:06
form.php tiedostossa ei ole tekstin pätkää round_number.

vai onko tuo sinun lisäämäsi sinne?
On minun lisäämäni:

Quote from: Rutja76 on 14.08.13 - klo:10:20
Eli form.php:ssä laskelma alkaa riviltä 656 (minulla on käytössä  MLInvoice 1.6.1). Siihen olen ensin lisännyt


function round_number(num, dec) {
      return Math.round(num * Math.pow(10, dec)) / Math.pow(10, dec);
}


joka pyöristää numeron "num" dec:llä desimaalilla.

ja sitten nuo rivit, joissa lukee RIVI LISÄTTY, ovat minun lisäämät:

Quote from: Rutja76 on 14.08.13 - klo:10:20
Ja sitten laskelmat on muutettu seuraavaksi:

     
if (VATIncluded == 1)
      {
        sumVAT = items * price;
sumVAT = round_number(sumVAT, 2); // RIVI LISÄTTY
        sum = sumVAT / (1 + VATPercent / 100);
sum = round_number(sum, 2);  // RIVI LISÄTTY
        VAT = sumVAT - sum;
      }
      else
      {
        sum = items * price;
sum = round_number(sum, 2);  // RIVI LISÄTTY
        VAT = sum * (VATPercent / 100);
VAT = round_number(VAT, 2);  // RIVI LISÄTTY
        sumVAT = sum + VAT;
      }


Huom: yllä oleva koodi toistuu kaksi kertaa form.php:ssä.

Kaikki muut rivit löytyy alkuperäisestä koodista.

kzmx

okei.. :D

pitää koittaa säätää tai odottaa päivitystä, kun kerran pdf laskussa se nyt lasketaan omassa versiossa oikein..