Files
2026-01-22 15:30:17 +07:00

200 lines
11 KiB
PHP

<?php
/*******************************************************************
App. Name : Inventory Advanced Systems
Module : /apps/php/xml/fp_jual.php
Desc. : PHP - Export XML Faktur Pajak Penjualan
Created By : Siau Pheng ([email protected]).
Created Date : April 2rd, 2011.
Last Modified : July 26th, 2025.
(c) 2011 - 2025, 3FONIA Software; WWW.3FONIA.COM.
*******************************************************************/
require_once(__DIR__."/../../../../../vendor/autoload.php");
require_once(__DIR__."/../func/ias.php");
use siaupheng\fonia3\DB\MySQL;
use siaupheng\fonia3\DB\SQL;
use siaupheng\fonia3\Web\Param;
use siaupheng\fonia3\Web\Table;
use siaupheng\fonia3\Web\Form;
$db = (is_resource($db)) ? $db : new MySQL();
$ajson = [];
$data = Param::Get("data");
$tgl_from = tgl_sql2str(Param::Get("Tgl_From"));
$tgl_to = tgl_sql2str(Param::Get("Tgl_To"));
$ppn = 0.11;
//$ppn = ($tgl_from >= $_SESSION['__APP_IAS']['PPN_TGL']) ? $_SESSION['__APP_IAS']['PPN'] : 0.11;
if ( $data == "download" ) {
$a_xml = '<?xml version="1.0" encoding="utf-8"?>
<TaxInvoiceBulk xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<TIN>'.$_SESSION['__WEB_APP']['REG_NPWP'].'</TIN>
<ListOfTaxInvoice>';
$a_tax = '
<TaxInvoice>
<TaxInvoiceDate>%s</TaxInvoiceDate>
<TaxInvoiceOpt>Normal</TaxInvoiceOpt>
<TrxCode>04</TrxCode>
<AddInfo/>
<CustomDoc/>
<RefDesc/>
<FacilityStamp/>
<SellerIDTKU>'.$_SESSION['__WEB_APP']['REG_NPWP'].$_SESSION['__WEB_APP']['REG_NITKU'].'</SellerIDTKU>
<BuyerTin>%s</BuyerTin>
<BuyerDocument>%s</BuyerDocument>
<BuyerCountry>IDN</BuyerCountry>
<BuyerDocumentNumber>%s</BuyerDocumentNumber>
<BuyerName>%s</BuyerName>
<BuyerAdress>%s</BuyerAdress>
<BuyerEmail>-</BuyerEmail>
<BuyerIDTKU>%s</BuyerIDTKU>
<ListOfGoodService>';
$x_item = '
<GoodService>
<Opt>A</Opt>
<Code>%s</Code>
<Name>%s</Name>
<Unit>%s</Unit>
<Price>%s</Price>
<Qty>%s</Qty>
<TotalDiscount>%s</TotalDiscount>
<TaxBase>%s</TaxBase>
<OtherTaxBase>%s</OtherTaxBase>
<VATRate>%s</VATRate>
<VAT>%s</VAT>
<STLGRate>0</STLGRate>
<STLG>0</STLG>
</GoodService>';
$z_tax = '
</ListOfGoodService>
</TaxInvoice>';
$z_xml = '
</ListOfTaxInvoice>
</TaxInvoiceBulk>';
}
if ( $data == "download" ) {
$xml = $a_xml;
$alist = Param::Get_ArrayCBOX();
foreach ($alist as $_key => $_val) {
if ($_val!=="Y") continue;
$no_pajak = str_replace("_",".",$_key);
$afp = [];
if ($no_pajak[0] == "J") {
//pajak per nota
$db->Query("SELECT * FROM (SELECT * FROM inv_jual WHERE No_Jual='".$no_pajak."' LIMIT 1) J LEFT JOIN para_outlet O ON (O.OutletID=J.OutletID)");
if ($db->Next()) $afp = $db->AllRow();
if ($afp['Total_Jual'] > 0) {
$db->Query("UPDATE inv_detail SET PPN='".$ppn."' WHERE No_Ref='".$no_pajak."'");
}
if (count($afp) > 0) {
$buy_id = "TIN"; $buy_doc = $afp['No_Jual']; $buy_name = "-"; $buy_addr = "-"; $buy_nitku = $afp['No_NPWP'].$afp['No_NITKU'];
if ($afp['No_NPWP']==0) {
if (($afp['No_NIK']?:0)==0) {
$buy_id = "Other ID";
$buy_nitku = "0";
} else {
$buy_id = "National ID";
$buy_doc = $afp['No_NIK'];
$buy_nitku = "000000";
}
$buy_name = $afp['Nama_NPWP'];
$buy_addr = $afp['Alamat_NPWP'];
}
$xml .= sprintf($a_tax, $afp['Tgl_Jual'], $afp['No_NPWP'], $buy_id, $buy_doc, $buy_name, $buy_addr, $buy_nitku);
$db->Query("SELECT P.*,R.Nama_Rasa,S.Pajak_Satuan,D.Qty,D.Harga,D.Total_Jual,D.Total_Diskon FROM (SELECT InvID,RasaID,SatuanID,SUM(-Qty) Qty,ROUND(Harga_Jual/(1+PPN),2) Harga,SUM(-Qty*ROUND(Harga_Jual/(1+PPN),2)) Total_Jual,SUM(IF(Total_Diskon=(-Qty*Harga_Jual),-Qty*ROUND(Harga_Jual/(1+PPN),2),ROUND(Total_Diskon/(1+PPN),2))) Total_Diskon FROM inv_detail WHERE No_Ref='".$no_pajak."' AND Qty<>0 GROUP BY InvID,RasaID,SatuanID ORDER BY InvID,RasaID,SatuanID) D LEFT JOIN inv_produk P ON (D.InvID=P.InvID) LEFT JOIN para_rasa R ON (D.RasaID=R.RasaID) LEFT JOIN para_satuan S ON (S.SatuanID=D.SatuanID) WHERE P.Pajak=1 ORDER BY P.Nama_Produk");
while ($db->Next()) {
$n_dpp = $db->Row("Total_Jual")-$db->Row("Total_Diskon");
$n_dpp_lain = $n_dpp * 11/12;
$n_ppn = $n_dpp_lain * 12/100;//ppn = 12%
$xml .= sprintf($x_item, $db->Row("Kode_FP"), $db->Row("Nama_Produk").data_rasafp($db->Row("Nama_Rasa")), $db->Row("Pajak_Satuan"), $db->RowFloat("Harga"), $db->RowFloat("Qty"), $db->RowFloat("Total_Diskon"), round($n_dpp,2), round($n_dpp_lain,2), 12, round($n_ppn,2));
}
$xml .= $z_tax;
$db->Query("UPDATE inv_jual SET XFP=XFP+1 WHERE No_Jual='".$no_pajak."' LIMIT 1");
}
} else {
//pajak gabungan
$db->Query("SELECT * FROM inv_jual_pajak WHERE No_Pajak='".$no_pajak."' LIMIT 1");
if ($db->Next()) $afp = $db->AllRow();
if ($afp['OutletID'] > 0) {
$db->Query("SELECT No_NIK FROM para_outlet WHERE OutletID='".$afp['OutletID']."' LIMIT 1");
if ($db->Next()) $afp = array_merge($afp, $db->AllRow());
}
if (count($afp) > 0) {
$buy_id = "TIN"; $buy_doc = $afp['No_Pajak']; $buy_name = "-"; $buy_addr = "-"; $buy_nitku = $afp['No_NPWP'].$afp['No_NITKU'];
if ($afp['No_NPWP']==0) {
if (($afp['No_NIK']?:0)==0) {
$buy_id = "Other ID";
$buy_nitku = "0";
} else {
$buy_id = "National ID";
$buy_doc = $afp['No_NIK'];
$buy_nitku = "000000";
}
$buy_name = $afp['Nama_NPWP'];
$buy_addr = $afp['Alamat_NPWP'];
}
$xml .= sprintf($a_tax, $afp['Tgl_Pajak'], $afp['No_NPWP'], $buy_id, $buy_doc, $buy_name, $buy_addr, $buy_nitku);
$db->Query("SELECT P.*,R.Nama_Rasa,S.Pajak_Satuan,D.Qty,D.Harga,D.Total_Jual,D.Total_Diskon FROM (SELECT InvID,RasaID,SatuanID,SUM(-Qty) Qty,ROUND(Harga_Jual/(1+PPN),2) Harga,SUM(-Qty*ROUND(Harga_Jual/(1+PPN),2)) Total_Jual,SUM(IF(Total_Diskon=(-Qty*Harga_Jual),-Qty*ROUND(Harga_Jual/(1+PPN),2),ROUND(Total_Diskon/(1+PPN),2))) Total_Diskon FROM inv_detail WHERE No_Ref IN (SELECT No_Jual FROM inv_jual WHERE No_Pajak='".$no_pajak."') AND Qty<>0 GROUP BY InvID,RasaID,SatuanID ORDER BY InvID,RasaID,SatuanID) D LEFT JOIN inv_produk P ON (D.InvID=P.InvID) LEFT JOIN para_rasa R ON (D.RasaID=R.RasaID) LEFT JOIN para_satuan S ON (S.SatuanID=D.SatuanID) WHERE P.Pajak=1 ORDER BY P.Nama_Produk");
while ($db->Next()) {
$n_dpp = $db->Row("Total_Jual")-$db->Row("Total_Diskon");
$n_dpp_lain = $n_dpp * 11/12;
$n_ppn = $n_dpp_lain * 12/100;//ppn = 12%
$xml .= sprintf($x_item, $db->Row("Kode_FP"), $db->Row("Nama_Produk").data_rasafp($db->Row("Nama_Rasa")), $db->Row("Pajak_Satuan"), $db->RowFloat("Harga"), $db->RowFloat("Qty"), $db->RowFloat("Total_Diskon"), round($n_dpp,2), round($n_dpp_lain,2), 12, round($n_ppn,2));
}
$xml .= $z_tax;
$db->Query("UPDATE inv_jual_pajak SET XFP=XFP+1 WHERE No_Pajak='".$no_pajak."' LIMIT 1");
}
}
}
$xml .= $z_xml;
header("Content-type: application/octet-stream");
header("Content-Disposition: attachment; filename=\"FPJ-".Param::Get("Tgl_From").".xml\"");
echo $xml;
} else if ( $data == "detail" ) {
$tcari = trim(Param::Get("Cari_FP"));
$tsql1 = ($tcari=="") ? "" : " AND CONCAT(No_Pajak,No_NPWP,Nama_NPWP,DATE_FORMAT(Tgl_Pajak,'%d-%m-%Y')) LIKE '%".$tcari."%'";
$tsql2 = ($tcari=="") ? "" : " WHERE CONCAT(J.No_Jual,O.No_NPWP,O.Nama_NPWP,DATE_FORMAT(J.Tgl_Jual,'%d-%m-%Y')) LIKE '%".$tcari."%'";
$tot_fp = 50;
$db->Query("SELECT COUNT(*) FP FROM ((SELECT No_Pajak FROM inv_jual_pajak WHERE Tgl_Pajak BETWEEN '".$tgl_from."' AND '".$tgl_to."'".$tsql1.") UNION ALL (SELECT J.No_Jual No_Pajak FROM (SELECT * FROM inv_jual WHERE Data_Jual=1 AND Rekap=1 AND Tgl_Jual BETWEEN '".$tgl_from."' AND '".$tgl_to."' AND OutletID NOT IN (SELECT OutletID FROM para_outlet WHERE GG=1)) J LEFT JOIN para_outlet O ON (O.OutletID=J.OutletID)".$tsql2.")) A");
if ($db->Next()) $tot_fp = $db->RowFloat("FP", 50);
$obj = new Table($db);
$obj->set_query("SELECT * FROM ((SELECT No_Pajak,Tgl_Pajak,No_NPWP,Nama_NPWP,Jumlah_DPP,Jumlah_PPN,XFP,1 GG,'N' Nota FROM inv_jual_pajak WHERE Tgl_Pajak BETWEEN '".$tgl_from."' AND '".$tgl_to."'".$tsql1.") UNION ALL (SELECT J.No_Jual No_Pajak,J.Tgl_Jual Tgl_Pajak,O.No_NPWP,O.Nama_NPWP,J.Jumlah_DPP,J.Jumlah_PPN,J.XFP,0 GG,'N' Nota FROM (SELECT *,ROUND((Total_Jual-Total_Diskon)/(1+".$ppn."),2) Jumlah_DPP, ROUND(ROUND((Total_Jual-Total_Diskon)/(1+".$ppn."),2)*".$ppn.") Jumlah_PPN FROM inv_jual WHERE Data_Jual=1 AND Rekap=1 AND Tgl_Jual BETWEEN '".$tgl_from."' AND '".$tgl_to."') J LEFT JOIN para_outlet O ON (O.OutletID=J.OutletID)".$tsql2." AND O.GG=0)) A");
$obj->add_field("No_Pajak", "No. TX", "c");
$obj->add_field("Tgl_Pajak", "Tgl. Pajak", "c", "sqltgl");
$obj->add_field("No_NPWP", "NPWP", "l");
$obj->add_field("Nama_NPWP", "Nama NPWP", "awr");
$obj->add_field("Jumlah_DPP", "Jumlah DPP", "r", "rupiah");
$obj->add_field("Jumlah_PPN", "Jumlah PPN", "r", "rupiah");
$obj->add_field("XFP", "XML", "c");
$obj->set_field_order("No_Pajak", "A");
$obj->add_row_checkbox("No_Pajak", "Nota", ["Y","N"]);
$obj->set_row_color("GG", 1, "rgg");
$obj->set_func_navi("XMLFPJJS.data_query('detail')");
$ajson[] = $obj->json_table("divDetail", $tot_fp);
} else if ( $data == "default") {
$form = new Form($db);
$tdari = $form->datebox("_", "Tgl_From", tgl_ymd(), true, false);
$tsamp = $form->datebox("_", "Tgl_To", tgl_ymd(), true, false);
echo '
<div class="card"><div class="card-header custom-style">Export Data FP XML Penjualan 2025</div><div class="card-body"><div class="row mb-1"><div class="col d-flex justify-content-between"><div class="d-flex">'.$tdari.'<div><input type="text" class="form-control-plaintext text-center px-2" value="S / D"></div>'.$tsamp.'</div><div class="ms-2 input-group"><input class="form-control" id="Cari_FP" placeholder="Kunci Pencarian" type="text"><button class="btn btn-info shadow-none" type="button" id="butSearch">Cari</button></div><button class="btn btn-info shadow-none ms-2 text-nowrap" id="butXML" type="button"><i class="bi-cloud-download me-2"></i>Export XML</button></div></div><div id="divDetail">&nbsp;</div></div></div>';
}
send_json($ajson);
?>