Thread View: pl.comp.lang.php
21 messages
21 total messages
Started by Dariusz Budyta
Sun, 12 Jul 2015 16:27
Problem z właściwym sumowaniem
Author: Dariusz Budyta
Date: Sun, 12 Jul 2015 16:27
Date: Sun, 12 Jul 2015 16:27
301 lines
10470 bytes
10470 bytes
Witam,
Suma na fakturze liczy dobrze jak jest jedna stawka VAT, jak jest ich więcej liczy mi z taką stawką jaka jest na pierwszej pozycji faktury, jestem jaszcze trochę cienki ale staram się doczytać - tyle że skończyły mi się pomysły?
Może ktoś mnie trochę wspomoże co robię źle?
<?php
require_once("dompdf/dompdf_config.inc.php");
require_once('database.php');
require_once('session.php');
require_once('common.php');
if(isset($_SESSION['idadministracja']))
$idadministracja = $_SESSION['idadministracja'];
else
$idadministracja = null;
$rodzaj_dokumentu = '';
$typ_dokumentu = '';
$md_nazwa = '';
$md_nip = '';
$md_ulica = '';
$md_miejscowosc = '';
$md_kod_pocztowy = '';
$md_telefon = '';
$kl_nazwa = '';
$kl_nip = '';
$kl_ulica = '';
$kl_miejscowosc = '';
$kl_kod_pocztowy = '';
$kl_telefon = '';
$data_wystawienia = '';
$data_sprzedazy = '';
$termin_zaplaty = '';
$zaplacono = '';
$slownie = '';
$waluta = '';
$platnosc = '';
$uwagi = '';
$pozycje = 1;
$numer_dokumentu = '';
$numer_konta = '';
$nazwa_banku = '';
$pozycje_buf = '';
$suma = '';
$sbrutto ='';
$pozostalo = '';
$miejsce_wystawienia = '';
$duplikat = '';
$dzis = '';
$print_file = 'faktura.html';
$rachunek = false;
if(isset($_GET['nf']))
{
$nf = $_GET['nf'];
$ret = $db->Query('select N_Kier from import_faktury where nf=\''.$nf.'\'');
$n_kier = $ret['N_Kier'];
$ret;
if($n_kier==null)
{
$ret = $db->Query('select *,
(select round(sum(netto)*(100+svat))/100 from import_pozycje where nf=import_faktury.nf) as suma,
DATE_FORMAT(DATE_ADD(dw, INTERVAL 7 DAY), \'%Y-%m-%d\') as tz
from import_faktury where nf=\''.$nf.'\'');
}
else
{
$ret = $db->Query('select *,
(select sum(netto) from import_pozycje where nf=import_faktury.nf) as suma,
DATE_FORMAT(DATE_ADD(dw, INTERVAL 7 DAY), \'%Y-%m-%d\') as tz
from import_faktury where nf=\''.$nf.'\'');
}
if($n_kier==null)
{
$md_nazwa = 'Zrzeszenie Transportu Prywatnego m.st. Warszawy';
$md_nip = $ret['wnip'];
$md_ulica = 'Al. Solidarności 104';
$md_miejscowosc = 'Warszawa';
$md_kod_pocztowy = '01-016';
$md_telefon = '';
$kl_nazwa = $ret['nazwa'];
$kl_nip = $ret['onip'];
$kl_ulica = $ret['fadres'];
$kl_miejscowosc = $ret['fmiasto'];
$kl_kod_pocztowy = $ret['fkod'];
$data_wystawienia = $ret['dw'];
$data_sprzedazy = $ret['ds'];
$termin_zaplaty = $ret['tz'];
$zaplacono = 0;
require_once('cslownie.php');
$s = new cSlownie($ret['suma']);
$slownie = $s->slownie;
$waluta = 'PLN';
$platnosc = $ret['sz'];
$uwagi = $ret['info'];
$numer_dokumentu = $ret['nf'];
$numer_konta = '52 1540 1157 2001 6614 0982 0001';
$suma = $ret['suma'];
$sbrutto = 0;
$pozostalo = 0;
$nazwa_banku = 'BOŚ S.A. II/O w Warszawie';
$miejsce_wystawienia = 'Warszawa';
}
else
{
$md = $db->Query('select * from user where nip=\''.$ret['onip'].'\'');
$print_file = 'fakturak.html';
$kl_nazwa = 'Zrzeszenie Transportu Prywatnego m.st. Warszawy';
$kl_nip = $ret['onip'];
$kl_ulica = 'Al. Solidarności 104';
$kl_miejscowosc = 'Warszawa';
$kl_kod_pocztowy = '01-016';
$kl_telefon = '';
$md_nazwa = $md['nazwa'];
$md_nip = $md['nip'];
$md_ulica = $md['ulica'];
$md_miejscowosc = $md['miejscowosc'];
$md_kod_pocztowy = $ret['fkod'];
$data_wystawienia = $ret['dw'];
$data_sprzedazy = $ret['ds'];
$termin_zaplaty = $ret['tz'];
$zaplacono = 0;
require_once('cslownie.php');
$s = new cSlownie($ret['suma']);
$slownie = $s->slownie;
$waluta = 'PLN';
//$platnosc = 'Przelew 7 dni';
$uwagi = $ret['info'];
$numer_dokumentu = $ret['nf'];
//$numer_konta = '52 1540 1157 2001 6614 0982 0001';
$suma = $ret['suma'];
$pozostalo = 0;
//$nazwa_banku = 'BOŚ S.A. II/O w Warszawie';
$miejsce_wystawienia = 'Warszawa';
}
$ret = $db->Query('select DATE_FORMAT(now(), \'%Y-%m-%d\') as dzis');
$dzis = $ret['dzis'];
$pozycje_buf = '';
$ret = $db->SQL('select *,
(round((netto)*100)/100) as n
from import_pozycje where nf=\''.$nf.'\'');
$numer = 0;
foreach($ret as $r)
{
$numer++;
$dzial = $r['dzial'];
$nazwa = $r['usl'];
$pkwiu = '';//$r['pkwiu'];
$ilosc = $r['ilosc'];
$jm = 'szt';//$r['jm'];
$_vat = $r['svat'];
$vat = (float)$_vat;
$wartosc_netto = $r['n'];
$kwota_vat = 0;
$wartosc_brutto = 0;
$sbrutto = sum($wartosc_brutto);
if($n_kier==null)
{
$kwota_vat = $wartosc_netto*($vat/100);
$wartosc_brutto = $wartosc_netto+$kwota_vat;
$_vat = $_vat.' %';
}
else
{
$kwota_vat = ($wartosc_netto/($vat+100))*$vat;
$wartosc_brutto = $wartosc_netto;
$wartosc_netto = ($wartosc_netto/($vat+100))*100;
$_vat = 'ZW';
}
if(($vat==0)&&($n_kier!=null))
{
$rachunek = true;
$pozycje_buf .= '<tr>
<td style="text-align: center">'.$numer.'</td>
<td>'.$dzial.'</td>
<td>'.$nazwa.'</td>
<td style="text-align: center">'.$ilosc.'</td>
<td style="text-align: center">'.$jm.'</td>
<td class="change_order_total_col">'.round00($wartosc_brutto).'</td>
</tr>';
}
else
{
$pozycje_buf .= '<tr>
<td style="text-align: center">'.$numer.'</td>
<td>'.$dzial.'</td>
<td>'.$nazwa.'</td>
<td style="text-align: center">'.$ilosc.'</td>
<td style="text-align: center">'.$jm.'</td>
<td style="text-align: right;">'.round00($wartosc_netto).'</td>
<td style="text-align: center;">'.$_vat.'</td>
<td style="text-align: right;">'.round00($kwota_vat).'</td>
<td class="change_order_total_col">'.round00($wartosc_brutto).'</td>
</tr>';
}
}
}
if($rachunek)
$print_file = 'rachunekk.html';
$buf = '';
$chunk = (1 << 21);
$fh = fopen($print_file, 'r+');
while(!feof($fh))
{
$buf = fread($fh, $chunk);
}
fclose($fh);
$buf = str_replace('[md_nazwa]', $md_nazwa, $buf);
$buf = str_replace('[md_nip]', $md_nip, $buf);
$buf = str_replace('[md_ulica]', $md_ulica, $buf);
$buf = str_replace('[md_miejscowosc]', $md_miejscowosc, $buf);
$buf = str_replace('[md_kod_pocztowy]', $md_kod_pocztowy, $buf);
$buf = str_replace('[md_telefon]', 'Telefon: '.$md_telefon, $buf);
$buf = str_replace('[kl_nazwa]', $kl_nazwa, $buf);
$buf = str_replace('[kl_nip]', $kl_nip, $buf);
$buf = str_replace('[kl_ulica]', $kl_ulica, $buf);
$buf = str_replace('[kl_miejscowosc]', $kl_miejscowosc, $buf);
$buf = str_replace('[kl_kod_pocztowy]', $kl_kod_pocztowy, $buf);
$buf = str_replace('[kl_telefon]', 'Telefon: '.$kl_telefon, $buf);
$buf = str_replace('[typ_dokumentu]', $typ_dokumentu, $buf);
$buf = str_replace('[numer_dokumentu]', $numer_dokumentu, $buf);
$buf = str_replace('[data_wystawienia]', $data_wystawienia, $buf);
$buf = str_replace('[data_sprzedazy]', $data_sprzedazy, $buf);
$buf = str_replace('[termin_zaplaty]', $termin_zaplaty, $buf);
$buf = str_replace('[platnosc]', $platnosc, $buf);
$buf = str_replace('[numer_konta]', $numer_konta, $buf);
$buf = str_replace('[zaplacono]', round00($zaplacono), $buf);
$buf = str_replace('[waluta]', $waluta, $buf);
$buf = str_replace('[slownie]', $slownie, $buf);
if($uwagi!='')
$buf = str_replace('[uwagi]', '<table style="padding: 10px; width: 100%;border: 1px solid rgb(0, 0, 0);font-size: 8pt;" class="header">
<tr>
<td>Uwagi: '.$uwagi.'</td>
</tr>
</table><br/>', $buf);
else
$buf = str_replace('[uwagi]', '', $buf);
$buf = str_replace('[pozycje]', $pozycje_buf, $buf);
$buf = str_replace('[suma]', round00($suma), $buf);
$buf = str_replace('[pozostalo]', $pozostalo, $buf);
$buf = str_replace('[nazwa_banku]', $nazwa_banku, $buf);
$buf = str_replace('[miejsce_wystawienia]', $miejsce_wystawienia, $buf);
if(isset($_GET['duplikat'])&&($_GET['duplikat']=='true'))
{
$buf = str_replace('[duplikat]', '<table style="width: 100%;" class="header">
<tr>
<td style="padding: 10px; border: 1px solid rgb(0, 0, 0);width: 33%;font-size: 8pt;">
Duplikat faktury z dnia: <b>'.$dzis.'</b>
</td>
</tr>
</table>', $buf);
}
else
$buf = str_replace('[duplikat]', '', $buf);
$dompdf = new DOMPDF();
$dompdf->load_html($buf, 'UTF-8');
$dompdf->render();
$a = false;
if(isset($_GET['save'])&&($_GET['save']=='true'))
$a = true;
$ret = $db->Query('select onip from import_faktury where nf=\''.$_GET['nf'].'\'');
$ret = $db->Query('select iduser from user where nip=\''.$ret['onip'].'\'');
$idu = $ret['iduser'];
if(isset($_GET['nf'])&&($iduser==$idu))
{
if(isset($_GET['save'])&&($_GET['save']=='true'))
{
$db->Exec('update import_faktury set data_pobrania=now(), pobrano=pobrano+1 where nf=\''.$_GET['nf'].'\'');
$db->Exec('update user set data_pobrania=now(), pobral=pobral+1 where iduser='.$iduser);
}
else
{
$db->Exec('update import_faktury set data_pobrania=now(), wydrukowano=wydrukowano+1 where nf=\''.$_GET['nf'].'\'');
$db->Exec('update user set data_pobrania=now(), wydrukowal=wydrukowal+1 where iduser='.$iduser);
}
}
if(($iduser==$idu)||(isset($idadministracja)&&($idadministracja!=null)))
$dompdf->stream("dompdf_out.pdf", array("Attachment" => $a));
?>
Re: Problem z właściwym sumowaniem
Author: Dariusz Budyta
Date: Sun, 12 Jul 2015 18:57
Date: Sun, 12 Jul 2015 18:57
306 lines
11383 bytes
11383 bytes
W dniu niedziela, 12 lipca 2015 18:27:21 UTC+2 użytkownik Dariusz Budyta napisał:
> Witam,
> Suma na fakturze liczy dobrze jak jest jedna stawka VAT, jak jest ich więcej liczy mi z taką stawką jaka jest na pierwszej pozycji faktury, jestem jaszcze trochę cienki ale staram się doczytać - tyle że skończyły mi się pomysły?
>
> Może ktoś mnie trochę wspomoże co robię źle?
>
> <?php
>
> require_once("dompdf/dompdf_config.inc.php");
>
> require_once('database.php');
> require_once('session.php');
> require_once('common.php');
>
> if(isset($_SESSION['idadministracja']))
> $idadministracja = $_SESSION['idadministracja'];
> else
> $idadministracja = null;
>
> $rodzaj_dokumentu = '';
> $typ_dokumentu = '';
> $md_nazwa = '';
> $md_nip = '';
> $md_ulica = '';
> $md_miejscowosc = '';
> $md_kod_pocztowy = '';
> $md_telefon = '';
> $kl_nazwa = '';
> $kl_nip = '';
> $kl_ulica = '';
> $kl_miejscowosc = '';
> $kl_kod_pocztowy = '';
> $kl_telefon = '';
> $data_wystawienia = '';
> $data_sprzedazy = '';
> $termin_zaplaty = '';
> $zaplacono = '';
> $slownie = '';
> $waluta = '';
> $platnosc = '';
> $uwagi = '';
> $pozycje = 1;
> $numer_dokumentu = '';
> $numer_konta = '';
> $nazwa_banku = '';
> $pozycje_buf = '';
> $suma = '';
> $sbrutto ='';
> $pozostalo = '';
> $miejsce_wystawienia = '';
> $duplikat = '';
> $dzis = '';
>
> $print_file = 'faktura.html';
> $rachunek = false;
>
> if(isset($_GET['nf']))
> {
> $nf = $_GET['nf'];
>
> $ret = $db->Query('select N_Kier from import_faktury where nf=\''.$nf.'\'');
>
> $n_kier = $ret['N_Kier'];
> $ret;
>
> if($n_kier==null)
> {
> $ret = $db->Query('select *,
> (select round(sum(netto)*(100+svat))/100 from import_pozycje where nf=import_faktury.nf) as suma,
> DATE_FORMAT(DATE_ADD(dw, INTERVAL 7 DAY), \'%Y-%m-%d\') as tz
> from import_faktury where nf=\''.$nf.'\'');
> }
> else
> {
> $ret = $db->Query('select *,
> (select sum(netto) from import_pozycje where nf=import_faktury.nf) as suma,
> DATE_FORMAT(DATE_ADD(dw, INTERVAL 7 DAY), \'%Y-%m-%d\') as tz
> from import_faktury where nf=\''.$nf.'\'');
> }
>
> if($n_kier==null)
> {
> $md_nazwa = 'Zrzeszenie Transportu Prywatnego m.st. Warszawy';
> $md_nip = $ret['wnip'];
> $md_ulica = 'Al. Solidarności 104';
> $md_miejscowosc = 'Warszawa';
> $md_kod_pocztowy = '01-016';
> $md_telefon = '';
> $kl_nazwa = $ret['nazwa'];
> $kl_nip = $ret['onip'];
> $kl_ulica = $ret['fadres'];
> $kl_miejscowosc = $ret['fmiasto'];
> $kl_kod_pocztowy = $ret['fkod'];
> $data_wystawienia = $ret['dw'];
> $data_sprzedazy = $ret['ds'];
> $termin_zaplaty = $ret['tz'];
> $zaplacono = 0;
> require_once('cslownie.php');
> $s = new cSlownie($ret['suma']);
> $slownie = $s->slownie;
> $waluta = 'PLN';
> $platnosc = $ret['sz'];
> $uwagi = $ret['info'];
> $numer_dokumentu = $ret['nf'];
> $numer_konta = '52 1540 1157 2001 6614 0982 0001';
> $suma = $ret['suma'];
> $sbrutto = 0;
> $pozostalo = 0;
> $nazwa_banku = 'BOŚ S.A. II/O w Warszawie';
> $miejsce_wystawienia = 'Warszawa';
> }
> else
> {
> $md = $db->Query('select * from user where nip=\''.$ret['onip'].'\'');
>
> $print_file = 'fakturak.html';
> $kl_nazwa = 'Zrzeszenie Transportu Prywatnego m.st. Warszawy';
> $kl_nip = $ret['onip'];
> $kl_ulica = 'Al. Solidarności 104';
> $kl_miejscowosc = 'Warszawa';
> $kl_kod_pocztowy = '01-016';
> $kl_telefon = '';
> $md_nazwa = $md['nazwa'];
> $md_nip = $md['nip'];
> $md_ulica = $md['ulica'];
> $md_miejscowosc = $md['miejscowosc'];
> $md_kod_pocztowy = $ret['fkod'];
> $data_wystawienia = $ret['dw'];
> $data_sprzedazy = $ret['ds'];
> $termin_zaplaty = $ret['tz'];
> $zaplacono = 0;
> require_once('cslownie.php');
> $s = new cSlownie($ret['suma']);
> $slownie = $s->slownie;
> $waluta = 'PLN';
> //$platnosc = 'Przelew 7 dni';
> $uwagi = $ret['info'];
> $numer_dokumentu = $ret['nf'];
> //$numer_konta = '52 1540 1157 2001 6614 0982 0001';
> $suma = $ret['suma'];
> $pozostalo = 0;
> //$nazwa_banku = 'BOŚ S.A. II/O w Warszawie';
> $miejsce_wystawienia = 'Warszawa';
> }
>
> $ret = $db->Query('select DATE_FORMAT(now(), \'%Y-%m-%d\') as dzis');
> $dzis = $ret['dzis'];
>
> $pozycje_buf = '';
>
> $ret = $db->SQL('select *,
> (round((netto)*100)/100) as n
> from import_pozycje where nf=\''.$nf.'\'');
> $numer = 0;
> foreach($ret as $r)
> {
> $numer++;
> $dzial = $r['dzial'];
> $nazwa = $r['usl'];
> $pkwiu = '';//$r['pkwiu'];
> $ilosc = $r['ilosc'];
> $jm = 'szt';//$r['jm'];
> $_vat = $r['svat'];
> $vat = (float)$_vat;
> $wartosc_netto = $r['n'];
> $kwota_vat = 0;
> $wartosc_brutto = 0;
> $sbrutto = sum($wartosc_brutto);
>
> if($n_kier==null)
> {
> $kwota_vat = $wartosc_netto*($vat/100);
> $wartosc_brutto = $wartosc_netto+$kwota_vat;
> $_vat = $_vat.' %';
> }
> else
> {
> $kwota_vat = ($wartosc_netto/($vat+100))*$vat;
> $wartosc_brutto = $wartosc_netto;
> $wartosc_netto = ($wartosc_netto/($vat+100))*100;
> $_vat = 'ZW';
> }
>
> if(($vat==0)&&($n_kier!=null))
> {
> $rachunek = true;
> $pozycje_buf .= '<tr>
> <td style="text-align: center">'.$numer.'</td>
> <td>'.$dzial.'</td>
> <td>'.$nazwa.'</td>
> <td style="text-align: center">'.$ilosc.'</td>
> <td style="text-align: center">'.$jm.'</td>
> <td class="change_order_total_col">'.round00($wartosc_brutto).'</td>
> </tr>';
> }
> else
> {
> $pozycje_buf .= '<tr>
> <td style="text-align: center">'.$numer.'</td>
> <td>'.$dzial.'</td>
> <td>'.$nazwa.'</td>
> <td style="text-align: center">'.$ilosc.'</td>
> <td style="text-align: center">'.$jm.'</td>
> <td style="text-align: right;">'.round00($wartosc_netto).'</td>
> <td style="text-align: center;">'.$_vat.'</td>
> <td style="text-align: right;">'.round00($kwota_vat).'</td>
> <td class="change_order_total_col">'.round00($wartosc_brutto).'</td>
> </tr>';
> }
> }
> }
>
> if($rachunek)
> $print_file = 'rachunekk.html';
>
> $buf = '';
> $chunk = (1 << 21);
> $fh = fopen($print_file, 'r+');
> while(!feof($fh))
> {
> $buf = fread($fh, $chunk);
> }
> fclose($fh);
>
> $buf = str_replace('[md_nazwa]', $md_nazwa, $buf);
> $buf = str_replace('[md_nip]', $md_nip, $buf);
> $buf = str_replace('[md_ulica]', $md_ulica, $buf);
> $buf = str_replace('[md_miejscowosc]', $md_miejscowosc, $buf);
> $buf = str_replace('[md_kod_pocztowy]', $md_kod_pocztowy, $buf);
> $buf = str_replace('[md_telefon]', 'Telefon: '.$md_telefon, $buf);
> $buf = str_replace('[kl_nazwa]', $kl_nazwa, $buf);
> $buf = str_replace('[kl_nip]', $kl_nip, $buf);
> $buf = str_replace('[kl_ulica]', $kl_ulica, $buf);
> $buf = str_replace('[kl_miejscowosc]', $kl_miejscowosc, $buf);
> $buf = str_replace('[kl_kod_pocztowy]', $kl_kod_pocztowy, $buf);
> $buf = str_replace('[kl_telefon]', 'Telefon: '.$kl_telefon, $buf);
> $buf = str_replace('[typ_dokumentu]', $typ_dokumentu, $buf);
> $buf = str_replace('[numer_dokumentu]', $numer_dokumentu, $buf);
> $buf = str_replace('[data_wystawienia]', $data_wystawienia, $buf);
> $buf = str_replace('[data_sprzedazy]', $data_sprzedazy, $buf);
> $buf = str_replace('[termin_zaplaty]', $termin_zaplaty, $buf);
> $buf = str_replace('[platnosc]', $platnosc, $buf);
> $buf = str_replace('[numer_konta]', $numer_konta, $buf);
> $buf = str_replace('[zaplacono]', round00($zaplacono), $buf);
> $buf = str_replace('[waluta]', $waluta, $buf);
> $buf = str_replace('[slownie]', $slownie, $buf);
> if($uwagi!='')
> $buf = str_replace('[uwagi]', '<table style="padding: 10px; width: 100%;border: 1px solid rgb(0, 0, 0);font-size: 8pt;" class="header">
> <tr>
> <td>Uwagi: '.$uwagi.'</td>
> </tr>
> </table><br/>', $buf);
> else
> $buf = str_replace('[uwagi]', '', $buf);
> $buf = str_replace('[pozycje]', $pozycje_buf, $buf);
> $buf = str_replace('[suma]', round00($suma), $buf);
> $buf = str_replace('[pozostalo]', $pozostalo, $buf);
> $buf = str_replace('[nazwa_banku]', $nazwa_banku, $buf);
> $buf = str_replace('[miejsce_wystawienia]', $miejsce_wystawienia, $buf);
> if(isset($_GET['duplikat'])&&($_GET['duplikat']=='true'))
> {
> $buf = str_replace('[duplikat]', '<table style="width: 100%;" class="header">
> <tr>
> <td style="padding: 10px; border: 1px solid rgb(0, 0, 0);width: 33%;font-size: 8pt;">
> Duplikat faktury z dnia: <b>'.$dzis.'</b>
> </td>
> </tr>
> </table>', $buf);
> }
> else
> $buf = str_replace('[duplikat]', '', $buf);
>
> $dompdf = new DOMPDF();
> $dompdf->load_html($buf, 'UTF-8');
> $dompdf->render();
>
> $a = false;
> if(isset($_GET['save'])&&($_GET['save']=='true'))
> $a = true;
>
> $ret = $db->Query('select onip from import_faktury where nf=\''.$_GET['nf'].'\'');
> $ret = $db->Query('select iduser from user where nip=\''.$ret['onip'].'\'');
> $idu = $ret['iduser'];
>
> if(isset($_GET['nf'])&&($iduser==$idu))
> {
> if(isset($_GET['save'])&&($_GET['save']=='true'))
> {
> $db->Exec('update import_faktury set data_pobrania=now(), pobrano=pobrano+1 where nf=\''.$_GET['nf'].'\'');
> $db->Exec('update user set data_pobrania=now(), pobral=pobral+1 where iduser='.$iduser);
> }
> else
> {
> $db->Exec('update import_faktury set data_pobrania=now(), wydrukowano=wydrukowano+1 where nf=\''.$_GET['nf'].'\'');
> $db->Exec('update user set data_pobrania=now(), wydrukowal=wydrukowal+1 where iduser='.$iduser);
> }
> }
>
> if(($iduser==$idu)||(isset($idadministracja)&&($idadministracja!=null)))
> $dompdf->stream("dompdf_out.pdf", array("Attachment" => $a));
>
> ?>
Zastosowanie:
$buf = str_replace('[suma]', round00($wartosc_brutto), $buf);
zwrociło mi ostatnią wartość brutto - zależy mi na tym aby zwracało sumę tych wartośći brutto
Re: Problem z właściwym sumowaniem
Author: Borys Pogoreło
Date: Sun, 12 Jul 2015 19:02
Date: Sun, 12 Jul 2015 19:02
51 lines
2849 bytes
2849 bytes
Dnia Sun, 12 Jul 2015 09:27:19 -0700 (PDT), Dariusz Budyta napisał(a):
> Suma na fakturze liczy dobrze jak jest jedna stawka VAT, jak jest ich
> więcej liczy mi z taką stawką jaka jest na pierwszej pozycji faktury,
> jestem jaszcze trochę cienki ale staram się doczytać - tyle że skończyły
> mi się pomysły?
Zacznijmy od tego, że ten przykład to jest jakaś masakra... Wymieszany kod
z prezentacją, nieczytelny układ i nazwy zmiennych. Gdybyś to sprowadził do
czytelniejszej postaci, to znacznie łatwiej by Ci było znaleźć błąd.
A tych błędów tu jest sporo:
> $ret = $db->Query('select N_Kier from import_faktury where nf=\''.$nf.'\'');
Książkowy przykład SQL injection. To akurat "tylko" select, ale w żaden
sposób nie zabezpieczasz zapytań przed groźną zawartością.
> $nf = $_GET['nf'];
> $n_kier = $ret['N_Kier'];
> $ret;
To jest przykład jak nie nazywać zmiennych. Jak ktoś ma pomóc, jeśli widzi
jakieś $n_kier? Co to jest n_kier? Co oznacza $nf? Żeby chociaż tam były
jakieś komentarze. Czy dobrze zgaduję, że n_kier to faktura wystawiana od
cen netto, a nf to numer faktury?
> $ret = $db->Query('select *,
> (select round(sum(netto)*(100+svat))/100 from import_pozycje where nf=import_faktury.nf) as suma,
Trzymasz kwoty jako float w bazie, że musisz kombinować z zaokrągleniami?
Od tego masz typ "decimal". Prędzej czy później zniknie Ci jakiś grosz i
będzie problem.
> $md_nazwa = 'Zrzeszenie Transportu Prywatnego m.st. Warszawy';
Nie wiem czy klient będzie zadowolony z takiej publikacji...
> $_vat = $r['svat'];
> $vat = (float)$_vat;
> $_vat = $_vat.' %';
Kolejny dobry przykład jak nie nazywać zmiennych. Jak osoba z zewnątrz ma
zgadnąć, co autor miał na myśli i czym się różnią te VAT-y?
I gdzie jest tabelka z sumą kwot VAT w rozbiciu na stawki? Bez tego
wystawiasz fakturę niezgodnie z ustawą.
--
Borys Pogoreło
borys(#)leszno,edu,pl
Re: Problem z właściwym sumowaniem
Author: Borys Pogoreło
Date: Sun, 12 Jul 2015 19:06
Date: Sun, 12 Jul 2015 19:06
21 lines
1578 bytes
1578 bytes
Dnia Sun, 12 Jul 2015 11:57:57 -0700 (PDT), Dariusz Budyta napisał(a):
> Zastosowanie:
> $buf = str_replace('[suma]', round00($wartosc_brutto), $buf);
> zwrociło mi ostatnią wartość brutto - zależy mi na tym aby zwracało sumę tych wartośći brutto
W pętli przetwarzającej pozycje faktury powinieneś po prostu zwiększać
jakąś zmienną, typu:
$wartosc_brutto += $brutto;
Ale ten podział powinieneś prowadzić w rozbiciu na stawki VAT, czyli
raczej:
$podsumowanie_vat[$stawka_vat]['netto'] += $netto;
$podsumowanie_vat[$stawka_vat]['brutto'] += $brutto;
$podsumowanie_vat[$stawka_vat]['vat'] += $vat;
--
Borys Pogoreło
borys(#)leszno,edu,pl
Re: Problem z właściwym sumowaniem
Author: Dariusz Budyta
Date: Sun, 12 Jul 2015 19:32
Date: Sun, 12 Jul 2015 19:32
65 lines
3837 bytes
3837 bytes
W dniu niedziela, 12 lipca 2015 21:02:15 UTC+2 użytkownik Borys Pogoreło napisał: > Zacznijmy od tego, że ten przykład to jest jakaś masakra... Wymieszany kod > z prezentacją, nieczytelny układ i nazwy zmiennych. Gdybyś to sprowadził do > czytelniejszej postaci, to znacznie łatwiej by Ci było znaleźć błąd. > > A tych błędów tu jest sporo: Dotarło to do mnie i to jeszcze jak. > To jest przykład jak nie nazywać zmiennych. Jak ktoś ma pomóc, jeśli widzi > jakieś $n_kier? Co to jest n_kier? Co oznacza $nf? Żeby chociaż tam były > jakieś komentarze. Czy dobrze zgaduję, że n_kier to faktura wystawiana od > cen netto, a nf to numer faktury? CREATE TABLE `import_pozycje` ( `nf` VARCHAR(250) NULL DEFAULT NULL, `N_Kier` INT(11) NULL DEFAULT NULL, `ilosc` FLOAT NULL DEFAULT NULL, `svat` VARCHAR(250) NULL DEFAULT NULL, `liczba` FLOAT NULL DEFAULT NULL, `usl` VARCHAR(250) NULL DEFAULT NULL, `sww` FLOAT NULL DEFAULT NULL, `netto` FLOAT NULL DEFAULT NULL, `dzial` VARCHAR(250) NULL DEFAULT NULL, `ID` INT(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`ID`), INDEX `nf` (`nf`(191)) CREATE TABLE `import_faktury` ( `nf` VARCHAR(90) NOT NULL DEFAULT '', `dw` DATE NULL DEFAULT NULL, `ds` DATE NULL DEFAULT NULL, `sz` INT(11) NULL DEFAULT NULL, `onip` VARCHAR(250) NULL DEFAULT NULL, `wnip` VARCHAR(250) NULL DEFAULT NULL, `N_Kier` INT(11) NULL DEFAULT NULL, `kf` VARCHAR(250) NULL DEFAULT NULL, `nazwa` VARCHAR(250) NULL DEFAULT NULL, `info` VARCHAR(250) NULL DEFAULT NULL, `idz` VARCHAR(250) NULL DEFAULT NULL, `fadres` VARCHAR(250) NULL DEFAULT NULL, `fkod` VARCHAR(250) NULL DEFAULT NULL, `fmiasto` VARCHAR(250) NULL DEFAULT NULL, `pobrano` INT(11) NULL DEFAULT '0', `wydrukowano` INT(11) NULL DEFAULT '0', `data_pobrania` DATE NULL DEFAULT NULL, PRIMARY KEY (`nf`) ) CREATE TABLE `user` ( `login` VARCHAR(90) NOT NULL, `haslo` VARCHAR(250) NOT NULL, `iduser` INT(11) NULL DEFAULT NULL, `nip` VARCHAR(90) NULL DEFAULT NULL, `nazwa` VARCHAR(250) NULL DEFAULT NULL, `ulica` VARCHAR(250) NULL DEFAULT NULL, `kod_pocztowy` VARCHAR(250) NULL DEFAULT NULL, `miejscowosc` VARCHAR(250) NULL DEFAULT NULL, `N_Kier` INT(11) NULL DEFAULT NULL, `pobral` INT(11) NULL DEFAULT '0', `wydrukowal` INT(11) NULL DEFAULT '0', `data_pobrania` DATE NULL DEFAULT NULL, `mail` VARCHAR(250) NULL DEFAULT NULL, PRIMARY KEY (`login`), UNIQUE INDEX `nip` (`nip`) ) zrzuciłem tabele z Mysql-a
Re: Problem z właściwym sumowaniem
Author: Borys Pogoreło
Date: Sun, 12 Jul 2015 19:44
Date: Sun, 12 Jul 2015 19:44
54 lines
2232 bytes
2232 bytes
Dnia Sun, 12 Jul 2015 12:32:36 -0700 (PDT), Dariusz Budyta napisał(a): To teraz się będziemy pastwić nad bazą: > CREATE TABLE `import_pozycje` ( > `N_Kier` INT(11) NULL DEFAULT NULL, Co to jest? > `ilosc` FLOAT NULL DEFAULT NULL, > `svat` VARCHAR(250) NULL DEFAULT NULL, > `liczba` FLOAT NULL DEFAULT NULL, Decimal > `usl` VARCHAR(250) NULL DEFAULT NULL, Czy to jest nazwa usługi? Towar to nie usługa. > `sww` FLOAT NULL DEFAULT NULL, Kompletnie nie rozumiem > `netto` FLOAT NULL DEFAULT NULL, > `dzial` VARCHAR(250) NULL DEFAULT NULL, To jakieś wewnętrzne oznaczenie? > CREATE TABLE `import_faktury` ( > `nf` VARCHAR(90) NOT NULL DEFAULT '', > PRIMARY KEY (`nf`) Tworzysz indeks główny na polu, którego wartość może się zmienić, a to bardzo zły nawyk. Tym gorszy, że później jeszcze tworzysz relacje na podstawie tego pola. Nazywanie kolumn "ds", "sz", "idz" też nie poprawia sytuacji. > CREATE TABLE `user` ( > `nip` VARCHAR(90) NULL DEFAULT NULL, > `kod_pocztowy` VARCHAR(250) NULL DEFAULT NULL, Na bogato ;) > PRIMARY KEY (`login`), Uwaga jak wcześniej > UNIQUE INDEX `nip` (`nip`) A co w przypadku faktury dla osoby fizycznej bez NIP, ale z PESEL? -- Borys Pogoreło borys(#)leszno,edu,pl
Re: Problem z właściwym sumowaniem
Author: Dariusz Budyta
Date: Sun, 12 Jul 2015 19:50
Date: Sun, 12 Jul 2015 19:50
54 lines
3573 bytes
3573 bytes
W dniu niedziela, 12 lipca 2015 21:02:15 UTC+2 użytkownik Borys Pogoreło napisał:
> Dnia Sun, 12 Jul 2015 09:27:19 -0700 (PDT), Dariusz Budyta napisał(a):
>
> > Suma na fakturze liczy dobrze jak jest jedna stawka VAT, jak jest ich
> > więcej liczy mi z taką stawką jaka jest na pierwszej pozycji faktury,
> > jestem jaszcze trochę cienki ale staram się doczytać - tyle że skończyły
> > mi się pomysły?
>
> Zacznijmy od tego, że ten przykład to jest jakaś masakra... Wymieszany kod
> z prezentacją, nieczytelny układ i nazwy zmiennych. Gdybyś to sprowadził do
> czytelniejszej postaci, to znacznie łatwiej by Ci było znaleźć błąd.
>
> A tych błędów tu jest sporo:
>
> > $ret = $db->Query('select N_Kier from import_faktury where nf=\''.$nf.'\'');
>
> Książkowy przykład SQL injection. To akurat "tylko" select, ale w żaden
> sposób nie zabezpieczasz zapytań przed groźną zawartością.
>
> > $nf = $_GET['nf'];
> > $n_kier = $ret['N_Kier'];
> > $ret;
>
> To jest przykład jak nie nazywać zmiennych. Jak ktoś ma pomóc, jeśli widzi
> jakieś $n_kier? Co to jest n_kier? Co oznacza $nf? Żeby chociaż tam były
> jakieś komentarze. Czy dobrze zgaduję, że n_kier to faktura wystawiana od
> cen netto, a nf to numer faktury?
>
> > $ret = $db->Query('select *,
> > (select round(sum(netto)*(100+svat))/100 from import_pozycje where nf=import_faktury.nf) as suma,
>
> Trzymasz kwoty jako float w bazie, że musisz kombinować z zaokrągleniami?
> Od tego masz typ "decimal". Prędzej czy później zniknie Ci jakiś grosz i
> będzie problem.
>
> > $md_nazwa = 'Zrzeszenie Transportu Prywatnego m.st. Warszawy';
>
> Nie wiem czy klient będzie zadowolony z takiej publikacji...
>
> > $_vat = $r['svat'];
> > $vat = (float)$_vat;
> > $_vat = $_vat.' %';
>
> Kolejny dobry przykład jak nie nazywać zmiennych. Jak osoba z zewnątrz ma
> zgadnąć, co autor miał na myśli i czym się różnią te VAT-y?
>
> I gdzie jest tabelka z sumą kwot VAT w rozbiciu na stawki? Bez tego
> wystawiasz fakturę niezgodnie z ustawą.
>
> --
> Borys Pogoreło
> borys(#)leszno,edu,pl
Co powinienem podać - żeby dało się to uratować?
Re: Problem z właściwym sumowaniem
Author: Dariusz Budyta
Date: Sun, 12 Jul 2015 20:00
Date: Sun, 12 Jul 2015 20:00
68 lines
3407 bytes
3407 bytes
W dniu niedziela, 12 lipca 2015 21:44:17 UTC+2 użytkownik Borys Pogoreło napisał: > Dnia Sun, 12 Jul 2015 12:32:36 -0700 (PDT), Dariusz Budyta napisał(a): > > To teraz się będziemy pastwić nad bazą: > > > CREATE TABLE `import_pozycje` ( > > `N_Kier` INT(11) NULL DEFAULT NULL, > > Co to jest? > Nr kierowcy - w bazie są przechowywane m innymi faktury, które kierowcy wystawiają dla ZTP > > `ilosc` FLOAT NULL DEFAULT NULL, Ilość przejazdów > > `svat` VARCHAR(250) NULL DEFAULT NULL, stawka Vat > > `liczba` FLOAT NULL DEFAULT NULL, > > Decimal > > > `usl` VARCHAR(250) NULL DEFAULT NULL, > > Czy to jest nazwa usługi? Towar to nie usługa. Usługa - np przejazd Taxi > > > `sww` FLOAT NULL DEFAULT NULL, kiedyś stosowany na fakturach Nr klasyfikacji usługi > > Kompletnie nie rozumiem > > > `netto` FLOAT NULL DEFAULT NULL, > > `dzial` VARCHAR(250) NULL DEFAULT NULL, > usługa transportowa może być wykonana dla określonego działu w firmie > To jakieś wewnętrzne oznaczenie? > > > CREATE TABLE `import_faktury` ( > > `nf` VARCHAR(90) NOT NULL DEFAULT '', > > PRIMARY KEY (`nf`) > > Tworzysz indeks główny na polu, którego wartość może się zmienić, a to > bardzo zły nawyk. Tym gorszy, że później jeszcze tworzysz relacje na > podstawie tego pola. Nazywanie kolumn "ds", "sz", "idz" też nie poprawia > sytuacji. > > > CREATE TABLE `user` ( > > `nip` VARCHAR(90) NULL DEFAULT NULL, > > `kod_pocztowy` VARCHAR(250) NULL DEFAULT NULL, > > Na bogato ;) > > > PRIMARY KEY (`login`), > > Uwaga jak wcześniej > > > UNIQUE INDEX `nip` (`nip`) > > A co w przypadku faktury dla osoby fizycznej bez NIP, ale z PESEL? > Tego nie przewidywano, ponieważ aplikacja ma służyć do eksportowania faktur do PDF-u z firmami które podpiszą umowy lub dla kierowców - więc NIP- jest zawsze > -- > Borys Pogoreło > borys(#)leszno,edu,pl
Re: Problem z właściwym sumowaniem
Author: tomek
Date: Mon, 13 Jul 2015 10:11
Date: Mon, 13 Jul 2015 10:11
32 lines
2102 bytes
2102 bytes
Użytkownik "Dariusz Budyta" <dariusz.budyta@gmail.com> napisał w wiadomości news:9ecf2928-3e4b-4d12-8383-9217f3a32d17@googlegroups.com... > Witam, >Suma na fakturze liczy dobrze jak jest jedna stawka VAT, > jak jest ich więcej liczy mi z taką stawką jaka jest na pierwszej pozycji > faktury, > jestem jaszcze trochę cienki ale staram się doczytać - tyle że skończyły > mi się pomysły? Witam. Moje 3 grosze do tematu liczenia kwot To, że kwoty powinny być przechowywane jako DECIMAL(X,2) to oczywiste - już inni o tym pisali. Ale jak ostatnio bujałem się z zaokrągleniami (np przypadek tzw zera ujemnego albo 20gr + 60gr != 80 gr itp) to zacząłem już na poziomie bazy danych wyciągać kwoty w groszach jako liczby całkowite SELECT [...] CAST(100 * kwota_w_zl AS SIGNED) AS kwota_w_gr, [...] Wszystkie operacje wykonuję na groszach. Dopiero na samym końcu gdy wynik idzie do wyświetlania zaminiany jest na stringa i taki string (a nie liczba typu double) jest formatowana na złotówki Pozdrawiam Tomek
Re: Problem z w�a�ciwym sumowaniem
Author: Dariusz Budyta
Date: Mon, 13 Jul 2015 11:38
Date: Mon, 13 Jul 2015 11:38
36 lines
2612 bytes
2612 bytes
W dniu poniedziałek, 13 lipca 2015 12:11:49 UTC+2 użytkownik tomek napisał: > Użytkownik "Dariusz Budyta" <dariusz.budyta@gmail.com> napisał w wiadomości > news:9ecf2928-3e4b-4d12-8383-9217f3a32d17@googlegroups.com... > > Witam, > >Suma na fakturze liczy dobrze jak jest jedna stawka VAT, > > jak jest ich więcej liczy mi z taką stawką jaka jest na pierwszej pozycji > > faktury, > > jestem jaszcze trochę cienki ale staram się doczytać - tyle że skończyły > > mi się pomysły? > > Witam. > > Moje 3 grosze do tematu liczenia kwot > To, że kwoty powinny być przechowywane jako DECIMAL(X,2) to oczywiste - już > inni o tym pisali. > > Ale jak ostatnio bujałem się z zaokrągleniami (np przypadek tzw zera > ujemnego albo 20gr + 60gr != 80 gr itp) > to zacząłem już na poziomie bazy danych wyciągać kwoty w groszach jako > liczby całkowite > > SELECT [...] > CAST(100 * kwota_w_zl AS SIGNED) AS kwota_w_gr, > [...] > > Wszystkie operacje wykonuję na groszach. > Dopiero na samym końcu gdy wynik idzie do wyświetlania zaminiany jest na > stringa > i taki string (a nie liczba typu double) jest formatowana na złotówki > > Pozdrawiam > Tomek Witam Ponownie poszukuje kogoś kto pomoże mi naprawić przynajmniej najważniejsze elementy
Re: Problem z właściwym sumowaniem
Author: Borys Pogoreło
Date: Mon, 13 Jul 2015 22:51
Date: Mon, 13 Jul 2015 22:51
20 lines
1577 bytes
1577 bytes
Dnia Mon, 13 Jul 2015 12:11:53 +0200, tomek napisał(a): > SELECT [...] > CAST(100 * kwota_w_zl AS SIGNED) AS kwota_w_gr, > [...] > > Wszystkie operacje wykonuję na groszach. > Dopiero na samym końcu gdy wynik idzie do wyświetlania zaminiany jest na > stringa A jak sobie radzisz z mnożeniem? Bo na 32-bitowych maszynach PHP_INT_MAX wcale taki duży nie jest. A wynik mnożenia większych liczb może dość łatwo przekroczyć 2147483647, jeśli oba czynniki masz pomnożone przez 100. Dopiero niedawno z wielką łaską dodali przeciążanie operatorów GMP... Tam faktycznie można działać na groszach bez ryzyka. -- Borys Pogoreło borys(#)leszno,edu,pl
Re: Problem z właściwym sumowaniem
Author: Kviat
Date: Tue, 14 Jul 2015 00:19
Date: Tue, 14 Jul 2015 00:19
55 lines
3045 bytes
3045 bytes
W dniu 2015-07-14 o 00:51, Borys Pogoreło pisze: > Dnia Mon, 13 Jul 2015 12:11:53 +0200, tomek napisał(a): > >> SELECT [...] >> CAST(100 * kwota_w_zl AS SIGNED) AS kwota_w_gr, >> [...] >> >> Wszystkie operacje wykonuję na groszach. >> Dopiero na samym końcu gdy wynik idzie do wyświetlania zaminiany jest na >> stringa > > A jak sobie radzisz z mnożeniem? Bo na 32-bitowych maszynach PHP_INT_MAX > wcale taki duży nie jest. A wynik mnożenia większych liczb może dość łatwo > przekroczyć 2147483647, jeśli oba czynniki masz pomnożone przez 100. Hmmmm.... 46340,95 x 46340,95 = 2147483647 46340 (463,40 zł?) x 46340 (np.kg?) = 2147395600 (21473956,00 zł) Załóżmy, że to węgiel... 1 t = ok 600 zł 600 zł x 100 = 60000 1 t x 100 = 100 2147483647/60000 = ok. 35791 35791/100 = 357,91 ton Wagon to ok 60 ton, czyli to ok. 6 wagonów węgla Jeżeli przez 100 mnożymy tylko cenę, to w ten sposób możemy mieć ok. 600 wagonów węgla Nie to żebym się czepiał (węgiel wybrałem żeby "przerysować"), ale ktoś kto wystawia takie faktury (albo robi obroty na poziomie 2147483647/100 = 21474836,47 zł - 21,5 mln zł) to raczej php nie używa do wystawiania faktur czy ewidencjonowania sprzedaży (no chyba, że się mylę...) Czy mógłbyś podać jakiś przykład (taki z życia), przy którym można się obawiać przekroczenia zakresu? Pralka, ok. 1000 zł 1000 zł x 100 = 100000 2147483647/100000 = ok.21474 pralek Nawet jeżeli to podzielimy przez 100, to = ok. 215 pralek... Czyli 215 (albo 21500 jeżeli mnożymy tylko cenę) pozycji na fakturze po 1000 zł... Nie wiem... ale wydaje mi się, że jest mało prawdopodobne, że przeciętny użytkownik takiego programu w php przekroczyłby zakres... (Rozważam czysto teoretycznie, sam nie mnożę cen przez 100 jak mam coś do policzenia kwotowo, ale też nie jest to program do fakturowania ;)) Pozdrawiam Piotr
Re: Problem z właściwym sumowaniem
Author: tomek
Date: Tue, 14 Jul 2015 07:56
Date: Tue, 14 Jul 2015 07:56
45 lines
2503 bytes
2503 bytes
Użytkownik "Borys Pogoreło" <borys@pl.edu.leszno> napisał w wiadomości
news:12ptonkwkgs46.11ond3800czpd$.dlg@40tude.net...
> Dnia Mon, 13 Jul 2015 12:11:53 +0200, tomek napisał(a):
>
>> SELECT [...]
>> CAST(100 * kwota_w_zl AS SIGNED) AS kwota_w_gr,
>> [...]
>>
>> Wszystkie operacje wykonuję na groszach.
>> Dopiero na samym końcu gdy wynik idzie do wyświetlania zaminiany jest na
>> stringa
> A jak sobie radzisz z mnożeniem? Bo na 32-bitowych maszynach PHP_INT_MAX
> wcale taki duży nie jest. A wynik mnożenia większych liczb może dość łatwo
> przekroczyć 2147483647, jeśli oba czynniki masz pomnożone przez 100.
PHP to nie C czy inny język.
Jak się pomnoży np
$x = 0.23 * $kwota_w_groszach
to i tak to będzie FLOAT a nie INTEGER.
Funkcja "round" też zwraca float.
Chodzi mi oto aby nie było takich numerów jak poniżej
---------------------------------------------------------------
$NL = "\n";
$x1 = 0.2;
$x2 = 0.12;
$x3 = 0.08;
// teoretycznie to samo ale daje inne wyniki
$x = $x1 - $x2 - $x3;
echo $x.$NL;
$x = -$x2 - $x3 + $x1;
echo $x.$NL;
--------------------------------------------------------------------
1.3877787807814E-17
0
Pozdrawiam
Tomek
Re: Problem z właściwym sumowaniem
Author: artiun
Date: Tue, 14 Jul 2015 14:01
Date: Tue, 14 Jul 2015 14:01
85 lines
3727 bytes
3727 bytes
W dniu 2015-07-14 o 09:56, tomek pisze: > Użytkownik "Borys Pogoreło" <borys@pl.edu.leszno> napisał w wiadomości > news:12ptonkwkgs46.11ond3800czpd$.dlg@40tude.net... >> Dnia Mon, 13 Jul 2015 12:11:53 +0200, tomek napisał(a): >> >>> SELECT [...] >>> CAST(100 * kwota_w_zl AS SIGNED) AS kwota_w_gr, >>> [...] >>> >>> Wszystkie operacje wykonuję na groszach. >>> Dopiero na samym końcu gdy wynik idzie do wyświetlania zaminiany jest na >>> stringa > >> A jak sobie radzisz z mnożeniem? Bo na 32-bitowych maszynach PHP_INT_MAX >> wcale taki duży nie jest. A wynik mnożenia większych liczb może dość łatwo >> przekroczyć 2147483647, jeśli oba czynniki masz pomnożone przez 100. > > PHP to nie C czy inny język. > Jak się pomnoży np > $x = 0.23 * $kwota_w_groszach > to i tak to będzie FLOAT a nie INTEGER. > > Funkcja "round" też zwraca float. > > Chodzi mi oto aby nie było takich numerów jak poniżej > --------------------------------------------------------------- > $NL = "\n"; > > $x1 = 0.2; > $x2 = 0.12; > $x3 = 0.08; > > // teoretycznie to samo ale daje inne wyniki > $x = $x1 - $x2 - $x3; > echo $x.$NL; > $x = -$x2 - $x3 + $x1; > echo $x.$NL; > > -------------------------------------------------------------------- > 1.3877787807814E-17 > 0 > Może język inny, ale rzutowanie jest (on pisał o operacjach na int): <?php $NL = "\n"; $x1 = 0.2; $x2 = 0.12; $x3 = 0.08; $x = (int)($x1*100) - (int)($x2*100) - (int)($x3*100); echo $x.$NL; $x = -$x2 - $x3 + $x1; echo $x.$NL; ?> WYNIK TEN SAM. Przykład wcześniejszy: $x = 0.23 * $kwota_w_groszach <?php $NL = "\n"; $kwota_w_groszach = 177777; $x = 0.23 * $kwota_w_groszach; echo gettype( $x ).$NL; // Takie liczenie było by złe echo gettype( (int)$x ).$NL; // To nie jest float, nie ma to znaczenia bo po przecinku są same zera echo gettype( round( $x.$NL, 0 ) ).$NL; ?> -- Artur
Re: Problem z właściwym sumowaniem
Author: Borys Pogoreło
Date: Tue, 14 Jul 2015 15:01
Date: Tue, 14 Jul 2015 15:01
23 lines
2075 bytes
2075 bytes
Dnia Tue, 14 Jul 2015 02:19:28 +0200, Kviat napisał(a): > Nie to żebym się czepiał (węgiel wybrałem żeby "przerysować"), ale ktoś > kto wystawia takie faktury (albo robi obroty na poziomie 2147483647/100 > = 21474836,47 zł - 21,5 mln zł) to raczej php nie używa do wystawiania > faktur czy ewidencjonowania sprzedaży (no chyba, że się mylę...) Mnie to akurat by zupełnie nie zdziwiło. Przykład z trochę innego podwórka: ilu ludzi powierzyło swoje pieniądze giełdom bitcoinowym napisanym w PHP i jak to się skończyło... http://falkvinge.net/2014/03/11/just-how-abysmal-was-gox-security-anyway/ > Czy mógłbyś podać jakiś przykład (taki z życia), przy którym można się > obawiać przekroczenia zakresu? Przy pojedynczej sprzedaży faktycznie trudno przekroczyć granicę 32 bitów przesuwając przecinek tylko o dwa miejsca, ale jak operujesz na jakichś zestawieniach z większych zakresów, to zaczyna sie robić ciasno. A tych pralek 215 można sprzedać w jednym miesiącu bez problemu :) -- Borys Pogoreło borys(#)leszno,edu,pl
Re: Problem z właściwym sumowaniem
Author: artiun
Date: Tue, 14 Jul 2015 15:43
Date: Tue, 14 Jul 2015 15:43
33 lines
3625 bytes
3625 bytes
W dniu 2015-07-14 o 17:01, Borys Pogoreło pisze: > Dnia Tue, 14 Jul 2015 02:19:28 +0200, Kviat napisał(a): > >> Nie to żebym się czepiał (węgiel wybrałem żeby "przerysować"), ale ktoś >> kto wystawia takie faktury (albo robi obroty na poziomie 2147483647/100 >> = 21474836,47 zł - 21,5 mln zł) to raczej php nie używa do wystawiania >> faktur czy ewidencjonowania sprzedaży (no chyba, że się mylę...) > > Mnie to akurat by zupełnie nie zdziwiło. Przykład z trochę innego podwórka: > ilu ludzi powierzyło swoje pieniądze giełdom bitcoinowym napisanym w PHP i > jak to się skończyło... > http://falkvinge.net/2014/03/11/just-how-abysmal-was-gox-security-anyway/ > >> Czy mógłbyś podać jakiś przykład (taki z życia), przy którym można się >> obawiać przekroczenia zakresu? > > Przy pojedynczej sprzedaży faktycznie trudno przekroczyć granicę 32 bitów > przesuwając przecinek tylko o dwa miejsca, ale jak operujesz na jakichś > zestawieniach z większych zakresów, to zaczyna sie robić ciasno. A tych > pralek 215 można sprzedać w jednym miesiącu bez problemu :) > Zwracasz uwagę na to co nie ma nic wspólnego ze sprzedażą. Przykład prosty. Jest sobie fabryka wkrętów do blachy, huta produkująca słoiki. Tego nie da się sprzedawać na sztuki, a w paczkach lub paletach. Koszt produkcji liczony jest do 6 miejsca po przecinku dla pojedynczej sztuki. Po to księgowość ma konta zaokrągleń. To są szczególne przypadki, ale są. I o ile sprzedaż (oprogramowanie) może bazować na intach, to kosztów produkcji się tak nie liczy (a przynajmniej nie co do sztuki :) ). Takie wkręty - pracownik wystukał (pilnując maszyny w ciągu 8h 10kg - ile to jest wkrętów? Podpowiem +-ileś) -- Artur
Re: Problem z właściwym sumowaniem
Author: Borys Pogoreło
Date: Tue, 14 Jul 2015 16:02
Date: Tue, 14 Jul 2015 16:02
20 lines
2046 bytes
2046 bytes
Dnia Tue, 14 Jul 2015 17:43:43 +0200, artiun napisał(a): > Zwracasz uwagę na to co nie ma nic wspólnego ze sprzedażą. Przykład prosty. > Jest sobie fabryka wkrętów do blachy, huta produkująca słoiki. Tego nie da > się sprzedawać na sztuki, a w paczkach lub paletach. Koszt produkcji liczony > jest do 6 miejsca po przecinku dla pojedynczej sztuki. Po to księgowość ma > konta zaokrągleń. To są szczególne przypadki, ale są. Wiem, dlatego liczenie na groszach to tylko półśrodek. Tak naprawdę to powinno się liczyć tak ze cztery miejsca po przecinku dla PLN, by mieć w miarę pewność, że nie będzie problemów z zaokrągleniami. A Twój przykład pokazuje to jeszcze dobitniej. Niestety w PHP zostają tylko podobne półśrodki, bo goście z internalsów to niereformowalny beton i raczej nie dożyjemy przeładowywania operatorów, żeby móc sobie stworzyć sensowny typ decimal. -- Borys Pogoreło borys(#)leszno,edu,pl
Re: Problem z właściwym sumowaniem
Author: Pit
Date: Tue, 14 Jul 2015 16:06
Date: Tue, 14 Jul 2015 16:06
18 lines
2171 bytes
2171 bytes
Dnia 14.07.2015 Borys Pogoreło <borys@pl.edu.leszno> napisał/a: >> Czy mógłbyś podać jakiś przykład (taki z życia), przy którym można się >> obawiać przekroczenia zakresu? > > Przy pojedynczej sprzedaży faktycznie trudno przekroczyć granicę 32 bitów > przesuwając przecinek tylko o dwa miejsca, ale jak operujesz na jakichś > zestawieniach z większych zakresów, to zaczyna sie robić ciasno. A tych > pralek 215 można sprzedać w jednym miesiącu bez problemu :) Na przykład systemy apteczne (na przykład te w szpitalach) liczą z dokładnością do czterech lub pięciu miejsc po przecinku (kwoty, nie stan towaru), bo rozchód leków jest często robiony w innych ilościach niż zakup (na przykład kupowane jest opakowanie 100 sztuk opatrunku za 49.99PLN, a rozchodowane są na sztuki po 0.4999PLN). Oczywiście przy wystawianiu faktur w typowym sklepie taki problem nie występuje, ale ogólnie w księgowości spotyka się różne dziwne sytuacje, gdzie 32-bitowy int nie wystarcza. Przykład tych aptek, jeśli mamy 5 miejsc po przecinku, to już maksymalna kwota kończy się na około 21000PLN, a to strasznie malutko :D
Re: Problem z właściwym sumowaniem
Author: Kviat
Date: Tue, 14 Jul 2015 21:58
Date: Tue, 14 Jul 2015 21:58
26 lines
2702 bytes
2702 bytes
W dniu 2015-07-14 o 18:02, Borys Pogoreło pisze: > Dnia Tue, 14 Jul 2015 17:43:43 +0200, artiun napisał(a): > >> Zwracasz uwagę na to co nie ma nic wspólnego ze sprzedażą. Przykład prosty. >> Jest sobie fabryka wkrętów do blachy, huta produkująca słoiki. Tego nie da >> się sprzedawać na sztuki, a w paczkach lub paletach. Koszt produkcji liczony >> jest do 6 miejsca po przecinku dla pojedynczej sztuki. Po to księgowość ma >> konta zaokrągleń. To są szczególne przypadki, ale są. > > Wiem, dlatego liczenie na groszach to tylko półśrodek. Tak naprawdę to > powinno się liczyć tak ze cztery miejsca po przecinku dla PLN, by mieć w > miarę pewność, że nie będzie problemów z zaokrągleniami. A Twój przykład > pokazuje to jeszcze dobitniej. > > Niestety w PHP zostają tylko podobne półśrodki, bo goście z internalsów to > niereformowalny beton i raczej nie dożyjemy przeładowywania operatorów, > żeby móc sobie stworzyć sensowny typ decimal. Nie, no panowie... :) Fabryka wkrętów... huta...? Systemy sprzedażowe... rozliczenia kosztów produkcji... ...w PHP!? Coś mocno mi się wydaje, że to przykłady raczej teoretyczne... Pozdrawiam Piotr
Re: Problem z właściwym sumowaniem
Author: Borys Pogoreło
Date: Tue, 14 Jul 2015 22:44
Date: Tue, 14 Jul 2015 22:44
14 lines
1584 bytes
1584 bytes
Dnia Tue, 14 Jul 2015 23:58:48 +0200, Kviat napisał(a): > Nie, no panowie... :) > Fabryka wkrętów... huta...? Systemy sprzedażowe... rozliczenia kosztów > produkcji... > ...w PHP!? Systemy wewnętrzne to wiadomo, że nie, ale ktoś może wpaść na pomysł wystawienia tego do świata albo pobrania tych danych przez aplikację w PHP. I zaczyna robić się wesoło ;) -- Borys Pogoreło borys(#)leszno,edu,pl
Re: Problem z właściwym sumowaniem
Author: Kviat
Date: Wed, 15 Jul 2015 15:08
Date: Wed, 15 Jul 2015 15:08
24 lines
2378 bytes
2378 bytes
W dniu 2015-07-15 o 00:44, Borys Pogoreło pisze: > Dnia Tue, 14 Jul 2015 23:58:48 +0200, Kviat napisał(a): > >> Nie, no panowie... :) >> Fabryka wkrętów... huta...? Systemy sprzedażowe... rozliczenia kosztów >> produkcji... >> ...w PHP!? > > Systemy wewnętrzne to wiadomo, że nie, ale ktoś może wpaść na pomysł > wystawienia tego do świata albo pobrania tych danych przez aplikację w PHP. > I zaczyna robić się wesoło ;) Trochę racji masz... ja też mam bujną wyobraźnię i potrafię wyobrazić sobie najdziwniejsze pomysły. W zasadzie to się trochę czepiłem "A wynik mnożenia większych liczb może dość łatwo przekroczyć 2147483647", bo w/g mnie, w typopwych zastosowaniach wcale nie tak łatwo i przeciętny (w sensie: większość) programista php nie musi się stresować. Jeżeli kwoty zaczynają przekraczać taki zakres, to (optymistycznie) zakładam, że taką firmę stać na opłacenie kogoś, kto wie co robi... Pozdrawiam Piotr
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads