🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

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
#231093
Author: Dariusz Budyta
Date: Sun, 12 Jul 2015 16:27
301 lines
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
#231094
Author: Dariusz Budyta
Date: Sun, 12 Jul 2015 18:57
306 lines
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
#231096
Author: Borys Pogoreło
Date: Sun, 12 Jul 2015 19:02
51 lines
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
#231095
Author: Borys Pogoreło
Date: Sun, 12 Jul 2015 19:06
21 lines
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
#231097
Author: Dariusz Budyta
Date: Sun, 12 Jul 2015 19:32
65 lines
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
#231098
Author: Borys Pogoreło
Date: Sun, 12 Jul 2015 19:44
54 lines
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
#231100
Author: Dariusz Budyta
Date: Sun, 12 Jul 2015 19:50
54 lines
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
#231099
Author: Dariusz Budyta
Date: Sun, 12 Jul 2015 20:00
68 lines
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
#231101
Author: tomek
Date: Mon, 13 Jul 2015 10:11
32 lines
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
#231102
Author: Dariusz Budyta
Date: Mon, 13 Jul 2015 11:38
36 lines
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
#231103
Author: Borys Pogoreło
Date: Mon, 13 Jul 2015 22:51
20 lines
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
#231104
Author: Kviat
Date: Tue, 14 Jul 2015 00:19
55 lines
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
#231112
Author: tomek
Date: Tue, 14 Jul 2015 07:56
45 lines
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
#231113
Author: artiun
Date: Tue, 14 Jul 2015 14:01
85 lines
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
#231105
Author: Borys Pogoreło
Date: Tue, 14 Jul 2015 15:01
23 lines
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
#231106
Author: artiun
Date: Tue, 14 Jul 2015 15:43
33 lines
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
#231107
Author: Borys Pogoreło
Date: Tue, 14 Jul 2015 16:02
20 lines
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
#231111
Author: Pit
Date: Tue, 14 Jul 2015 16:06
18 lines
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
#231108
Author: Kviat
Date: Tue, 14 Jul 2015 21:58
26 lines
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
#231109
Author: Borys Pogoreło
Date: Tue, 14 Jul 2015 22:44
14 lines
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
#231110
Author: Kviat
Date: Wed, 15 Jul 2015 15:08
24 lines
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