From 45e4595c57d0bbd02eef23736cd027b08b652ef5 Mon Sep 17 00:00:00 2001 From: Siau Pheng Date: Thu, 29 Oct 2026 13:34:31 +0700 Subject: [PATCH] first commit --- .env.example | 14 + .gitignore | 6 + .runway-config.json | 4 + README.md | 110 +++ app/Controller/AuthController.php | 147 +++ app/Controller/Display/ConfigController.php | 171 ++++ app/Controller/Display/IklanController.php | 175 ++++ app/Controller/Display/PromoController.php | 182 ++++ app/Controller/Gel/GajiController.php | 492 +++++++++++ app/Controller/Gel/HutangController.php | 315 +++++++ app/Controller/Gel/KaryaController.php | 252 ++++++ app/Controller/Gel/KeluarController.php | 302 +++++++ app/Controller/Gel/PiutangController.php | 329 +++++++ app/Controller/Gel/TerimaController.php | 304 +++++++ app/Controller/Gel/UmumController.php | 306 +++++++ app/Controller/IndexController.php | 169 ++++ app/Controller/Inv/BeliController.php | 581 ++++++++++++ app/Controller/Inv/BelireturController.php | 392 ++++++++ app/Controller/Inv/CekhargaController.php | 137 +++ app/Controller/Inv/JualController.php | 567 ++++++++++++ app/Controller/Inv/MutasiController.php | 373 ++++++++ app/Controller/Inv/OpnameController.php | 376 ++++++++ app/Controller/Inv/OpnamebarangController.php | 206 +++++ app/Controller/Inv/PosController.php | 645 ++++++++++++++ app/Controller/Member/BaruController.php | 112 +++ app/Controller/Member/PointController.php | 136 +++ app/Controller/Member/TukarController.php | 281 ++++++ app/Controller/MonitorController.php | 184 ++++ app/Controller/Ppob/PpobtxController.php | 208 +++++ app/Controller/Ppob/PrabayarController.php | 381 ++++++++ app/Controller/Ppob/TopupController.php | 125 +++ app/Controller/Promo/BarangController.php | 222 +++++ app/Controller/Promo/BelidiscController.php | 331 +++++++ app/Controller/Promo/TotalController.php | 220 +++++ app/Controller/QZController.php | 45 + .../Report/Beli/AnalisaController.php | 257 ++++++ app/Controller/Report/Beli/BeliController.php | 226 +++++ .../Report/Beli/MutasiController.php | 160 ++++ .../Report/Beli/ReturController.php | 201 +++++ .../Report/Dana/KeluarController.php | 181 ++++ .../Report/Dana/MasukController.php | 181 ++++ app/Controller/Report/Dana/PosController.php | 280 ++++++ .../Report/Gel/BulanneracaController.php | 192 ++++ .../Report/Gel/BulanrlcabController.php | 169 ++++ .../Report/Gel/BulansaldoController.php | 142 +++ .../Report/Gel/BulanshuController.php | 198 +++++ .../Report/Gel/HarianbantuController.php | 208 +++++ .../Report/Gel/HarianbesarController.php | 230 +++++ .../Report/Gel/HariandetailController.php | 123 +++ .../Report/Gel/HarianjurnalController.php | 149 ++++ .../Report/Gel/HariansaldoController.php | 131 +++ .../Report/Inv/BarcodeController.php | 201 +++++ .../Report/Inv/HutangController.php | 211 +++++ app/Controller/Report/Inv/LabelController.php | 188 ++++ .../Report/Inv/PiutangController.php | 245 +++++ .../Report/Jual/AnalisaController.php | 371 ++++++++ app/Controller/Report/Jual/JualController.php | 223 +++++ .../Report/Jual/MarginController.php | 261 ++++++ .../Report/Jual/MarginposController.php | 200 +++++ .../Report/Jual/MutasiController.php | 195 ++++ .../Report/Jual/RekapController.php | 242 +++++ .../Report/Member/HistoriController.php | 203 +++++ .../Report/Member/PointController.php | 176 ++++ .../Report/Member/TukarController.php | 157 ++++ app/Controller/Report/NotaController.php | 523 +++++++++++ app/Controller/Report/Ppob/JualController.php | 195 ++++ .../Report/Ppob/MarginController.php | 211 +++++ .../Report/Rekap/MarginController.php | 190 ++++ .../Report/Rekap/ModalController.php | 143 +++ .../Report/Stok/AkhirController.php | 229 +++++ .../Report/Stok/CabangController.php | 162 ++++ .../Report/Stok/MutasiController.php | 218 +++++ .../Report/Stok/OpnameController.php | 161 ++++ app/Controller/System/AboutController.php | 142 +++ app/Controller/System/ChpasswdController.php | 70 ++ app/Controller/System/ConfigController.php | 82 ++ app/Controller/System/MenugrupController.php | 165 ++++ app/Controller/System/OperatorController.php | 237 +++++ app/Controller/System/PrinterController.php | 128 +++ app/Controller/System/ProfileController.php | 114 +++ app/Controller/System/SuperController.php | 61 ++ app/Controller/Table/Gel/GajiController.php | 83 ++ app/Controller/Table/Gel/GrupController.php | 105 +++ .../Table/Gel/KaryawanController.php | 126 +++ app/Controller/Table/Gel/RekController.php | 210 +++++ .../Table/Member/MemberController.php | 215 +++++ .../Table/Member/MembergrupController.php | 115 +++ .../Table/Member/PointbarangController.php | 135 +++ .../Table/Member/PointskemaController.php | 223 +++++ .../Table/Member/PointtipeController.php | 120 +++ .../Table/Ppob/KategoriController.php | 93 ++ .../Table/Ppob/OperatorController.php | 98 ++ .../Table/Ppob/ProdukController.php | 221 +++++ app/Controller/Table/ProdukController.php | 835 ++++++++++++++++++ app/Controller/Table/ProdukgrupController.php | 121 +++ app/Controller/Table/RekposController.php | 121 +++ app/Controller/Table/SatuanController.php | 114 +++ app/Controller/Table/SupplierController.php | 135 +++ app/Controller/Table/VarianController.php | 107 +++ app/Middleware/SecurityHeaders.php | 69 ++ app/Scripts/display/config.js | 87 ++ app/Scripts/display/iklan.js | 114 +++ app/Scripts/display/promo.js | 114 +++ app/Scripts/gel/gaji.js | 311 +++++++ app/Scripts/gel/hutang.js | 162 ++++ app/Scripts/gel/karya.js | 105 +++ app/Scripts/gel/keluar.js | 261 ++++++ app/Scripts/gel/piutang.js | 162 ++++ app/Scripts/gel/terima.js | 261 ++++++ app/Scripts/gel/umum.js | 264 ++++++ app/Scripts/index.js | 148 ++++ app/Scripts/inv/beli.js | 444 ++++++++++ app/Scripts/inv/beli_retur.js | 287 ++++++ app/Scripts/inv/cekharga.js | 100 +++ app/Scripts/inv/jual.js | 402 +++++++++ app/Scripts/inv/mutasi.js | 291 ++++++ app/Scripts/inv/opname.js | 266 ++++++ app/Scripts/inv/opname_barang.js | 130 +++ app/Scripts/inv/pos.js | 496 +++++++++++ app/Scripts/locale/datepicker.id.js | 40 + app/Scripts/locale/fonia.id.js | 31 + app/Scripts/locale/moment.id.js | 83 ++ app/Scripts/login.js | 84 ++ app/Scripts/member/baru.js | 60 ++ app/Scripts/member/point.js | 95 ++ app/Scripts/member/tukar.js | 286 ++++++ app/Scripts/monitor.js | 151 ++++ app/Scripts/ppob/ppobtx.js | 97 ++ app/Scripts/ppob/prabayar.js | 306 +++++++ app/Scripts/ppob/topup.js | 71 ++ app/Scripts/promo/barang.js | 170 ++++ app/Scripts/promo/beli_disc.js | 238 +++++ app/Scripts/promo/total.js | 182 ++++ app/Scripts/report/beli/analisa.js | 45 + app/Scripts/report/beli/beli.js | 45 + app/Scripts/report/beli/mutasi.js | 51 ++ app/Scripts/report/beli/retur.js | 43 + app/Scripts/report/dana/keluar.js | 41 + app/Scripts/report/dana/masuk.js | 41 + app/Scripts/report/dana/pos.js | 59 ++ app/Scripts/report/gel/bulan_neraca.js | 41 + app/Scripts/report/gel/bulan_rlcab.js | 41 + app/Scripts/report/gel/bulan_saldo.js | 39 + app/Scripts/report/gel/bulan_shu.js | 41 + app/Scripts/report/gel/harian_bantu.js | 39 + app/Scripts/report/gel/harian_besar.js | 91 ++ app/Scripts/report/gel/harian_detail.js | 67 ++ app/Scripts/report/gel/harian_jurnal.js | 39 + app/Scripts/report/gel/harian_saldo.js | 37 + app/Scripts/report/inv/barcode.js | 101 +++ app/Scripts/report/inv/hutang.js | 43 + app/Scripts/report/inv/label.js | 142 +++ app/Scripts/report/inv/piutang.js | 82 ++ app/Scripts/report/jual/analisa.js | 90 ++ app/Scripts/report/jual/jual.js | 43 + app/Scripts/report/jual/margin.js | 84 ++ app/Scripts/report/jual/marginpos.js | 41 + app/Scripts/report/jual/mutasi.js | 91 ++ app/Scripts/report/jual/rekap.js | 138 +++ app/Scripts/report/member/histori.js | 100 +++ app/Scripts/report/member/point.js | 53 ++ app/Scripts/report/member/tukar.js | 51 ++ app/Scripts/report/ppob/jual.js | 41 + app/Scripts/report/ppob/margin.js | 41 + app/Scripts/report/rekap/margin.js | 39 + app/Scripts/report/rekap/modal.js | 39 + app/Scripts/report/stok/akhir.js | 72 ++ app/Scripts/report/stok/cabang.js | 41 + app/Scripts/report/stok/mutasi.js | 92 ++ app/Scripts/report/stok/opname.js | 41 + app/Scripts/system/about.js | 104 +++ app/Scripts/system/chpasswd.js | 55 ++ app/Scripts/system/config.js | 59 ++ app/Scripts/system/menu_grup.js | 129 +++ app/Scripts/system/operator.js | 187 ++++ app/Scripts/system/printer.js | 73 ++ app/Scripts/system/profile.js | 65 ++ app/Scripts/system/super.js | 35 + app/Scripts/table/gel/gaji.js | 60 ++ app/Scripts/table/gel/grup.js | 83 ++ app/Scripts/table/gel/karyawan.js | 79 ++ app/Scripts/table/gel/rek.js | 102 +++ app/Scripts/table/member/member.js | 102 +++ app/Scripts/table/member/member_grup.js | 83 ++ app/Scripts/table/member/point_barang.js | 83 ++ app/Scripts/table/member/point_skema.js | 153 ++++ app/Scripts/table/member/point_tipe.js | 83 ++ app/Scripts/table/ppob/kategori.js | 54 ++ app/Scripts/table/ppob/operator.js | 54 ++ app/Scripts/table/ppob/produk.js | 115 +++ app/Scripts/table/produk.js | 519 +++++++++++ app/Scripts/table/produk_grup.js | 81 ++ app/Scripts/table/rekpos.js | 81 ++ app/Scripts/table/satuan.js | 83 ++ app/Scripts/table/supplier.js | 85 ++ app/Scripts/table/varian.js | 81 ++ app/Styles/monitor.css | 78 ++ app/Styles/print.css | 20 + app/Styles/styles.css | 171 ++++ app/Utils/Config.php | 154 ++++ app/Utils/DBFactory.php | 82 ++ app/Utils/Env.php | 85 ++ app/Utils/Gel.php | 370 ++++++++ app/Utils/Inv.php | 374 ++++++++ app/Utils/Invesa.php | 172 ++++ app/Utils/PPOBClient.php | 207 +++++ app/commands/CacheCommand.php | 44 + app/commands/MigrateCommand.php | 259 ++++++ app/commands/PPOBCommand.php | 43 + app/commands/ProdukCommand.php | 41 + app/config/app.php.example | 59 ++ app/config/asset.php | 72 ++ app/config/bootstrap.php | 83 ++ app/config/config.php | 40 + app/config/qz/cert.pem | 25 + app/config/qz/key.pem | 28 + app/config/routes.php | 151 ++++ app/config/runway.php | 74 ++ app/config/services.php | 156 ++++ app/views/401.twig | 54 ++ app/views/404.twig | 54 ++ app/views/index.twig | 110 +++ app/views/login.twig | 71 ++ app/views/monitor.twig | 38 + composer.json | 54 ++ docker-compose.yml | 13 + public/assets/css/po.css | 78 ++ .../bootstrap-icons/bootstrap-icons.woff | Bin 0 -> 180288 bytes .../bootstrap-icons/bootstrap-icons.woff2 | Bin 0 -> 134044 bytes public/assets/images/bs/rak_1280.jpg | Bin 0 -> 129873 bytes public/assets/images/bs/rak_960.jpg | Bin 0 -> 92620 bytes public/assets/images/bs/shop_1280.jpg | Bin 0 -> 293622 bytes public/assets/images/bs/shop_960.jpg | Bin 0 -> 190921 bytes public/assets/images/bs/toko_1280.jpg | Bin 0 -> 81983 bytes public/assets/images/bs/toko_960.jpg | Bin 0 -> 60938 bytes public/assets/images/chr.png | Bin 0 -> 252218 bytes public/assets/images/logo-apps.png | Bin 0 -> 13063 bytes public/assets/images/logo-nota.png | Bin 0 -> 6731 bytes public/assets/images/logo200.png | Bin 0 -> 18121 bytes public/assets/images/logo300.png | Bin 0 -> 28888 bytes public/assets/images/logo60.png | Bin 0 -> 14331 bytes public/assets/images/logo600.png | Bin 0 -> 73315 bytes public/assets/images/logo80.png | Bin 0 -> 3351 bytes public/assets/images/voucher/cirblue.png | Bin 0 -> 225 bytes public/assets/images/voucher/logo-cabang.png | Bin 0 -> 24995 bytes public/assets/images/voucher/vou-biru.jpg | Bin 0 -> 113523 bytes public/assets/images/voucher/vou-emas.jpg | Bin 0 -> 94203 bytes public/assets/images/voucher/vou-hijau.jpg | Bin 0 -> 93913 bytes public/assets/images/voucher/vou-kuning.jpg | Bin 0 -> 108817 bytes public/assets/images/voucher/vou-merah.jpg | Bin 0 -> 112598 bytes public/assets/images/voucher/vou-perak.jpg | Bin 0 -> 58552 bytes public/assets/images/voucher/vou-pink.jpg | Bin 0 -> 90333 bytes public/assets/images/voucher/vou-ungu.jpg | Bin 0 -> 110089 bytes public/index.php | 4 + runway | 3 + 255 files changed, 35457 insertions(+) create mode 100644 .env.example create mode 100644 .gitignore create mode 100644 .runway-config.json create mode 100644 README.md create mode 100644 app/Controller/AuthController.php create mode 100644 app/Controller/Display/ConfigController.php create mode 100644 app/Controller/Display/IklanController.php create mode 100644 app/Controller/Display/PromoController.php create mode 100644 app/Controller/Gel/GajiController.php create mode 100644 app/Controller/Gel/HutangController.php create mode 100644 app/Controller/Gel/KaryaController.php create mode 100644 app/Controller/Gel/KeluarController.php create mode 100644 app/Controller/Gel/PiutangController.php create mode 100644 app/Controller/Gel/TerimaController.php create mode 100644 app/Controller/Gel/UmumController.php create mode 100644 app/Controller/IndexController.php create mode 100644 app/Controller/Inv/BeliController.php create mode 100644 app/Controller/Inv/BelireturController.php create mode 100644 app/Controller/Inv/CekhargaController.php create mode 100644 app/Controller/Inv/JualController.php create mode 100644 app/Controller/Inv/MutasiController.php create mode 100644 app/Controller/Inv/OpnameController.php create mode 100644 app/Controller/Inv/OpnamebarangController.php create mode 100644 app/Controller/Inv/PosController.php create mode 100644 app/Controller/Member/BaruController.php create mode 100644 app/Controller/Member/PointController.php create mode 100644 app/Controller/Member/TukarController.php create mode 100644 app/Controller/MonitorController.php create mode 100644 app/Controller/Ppob/PpobtxController.php create mode 100644 app/Controller/Ppob/PrabayarController.php create mode 100644 app/Controller/Ppob/TopupController.php create mode 100644 app/Controller/Promo/BarangController.php create mode 100644 app/Controller/Promo/BelidiscController.php create mode 100644 app/Controller/Promo/TotalController.php create mode 100644 app/Controller/QZController.php create mode 100644 app/Controller/Report/Beli/AnalisaController.php create mode 100644 app/Controller/Report/Beli/BeliController.php create mode 100644 app/Controller/Report/Beli/MutasiController.php create mode 100644 app/Controller/Report/Beli/ReturController.php create mode 100644 app/Controller/Report/Dana/KeluarController.php create mode 100644 app/Controller/Report/Dana/MasukController.php create mode 100644 app/Controller/Report/Dana/PosController.php create mode 100644 app/Controller/Report/Gel/BulanneracaController.php create mode 100644 app/Controller/Report/Gel/BulanrlcabController.php create mode 100644 app/Controller/Report/Gel/BulansaldoController.php create mode 100644 app/Controller/Report/Gel/BulanshuController.php create mode 100644 app/Controller/Report/Gel/HarianbantuController.php create mode 100644 app/Controller/Report/Gel/HarianbesarController.php create mode 100644 app/Controller/Report/Gel/HariandetailController.php create mode 100644 app/Controller/Report/Gel/HarianjurnalController.php create mode 100644 app/Controller/Report/Gel/HariansaldoController.php create mode 100644 app/Controller/Report/Inv/BarcodeController.php create mode 100644 app/Controller/Report/Inv/HutangController.php create mode 100644 app/Controller/Report/Inv/LabelController.php create mode 100644 app/Controller/Report/Inv/PiutangController.php create mode 100644 app/Controller/Report/Jual/AnalisaController.php create mode 100644 app/Controller/Report/Jual/JualController.php create mode 100644 app/Controller/Report/Jual/MarginController.php create mode 100644 app/Controller/Report/Jual/MarginposController.php create mode 100644 app/Controller/Report/Jual/MutasiController.php create mode 100644 app/Controller/Report/Jual/RekapController.php create mode 100644 app/Controller/Report/Member/HistoriController.php create mode 100644 app/Controller/Report/Member/PointController.php create mode 100644 app/Controller/Report/Member/TukarController.php create mode 100644 app/Controller/Report/NotaController.php create mode 100644 app/Controller/Report/Ppob/JualController.php create mode 100644 app/Controller/Report/Ppob/MarginController.php create mode 100644 app/Controller/Report/Rekap/MarginController.php create mode 100644 app/Controller/Report/Rekap/ModalController.php create mode 100644 app/Controller/Report/Stok/AkhirController.php create mode 100644 app/Controller/Report/Stok/CabangController.php create mode 100644 app/Controller/Report/Stok/MutasiController.php create mode 100644 app/Controller/Report/Stok/OpnameController.php create mode 100644 app/Controller/System/AboutController.php create mode 100644 app/Controller/System/ChpasswdController.php create mode 100644 app/Controller/System/ConfigController.php create mode 100644 app/Controller/System/MenugrupController.php create mode 100644 app/Controller/System/OperatorController.php create mode 100644 app/Controller/System/PrinterController.php create mode 100644 app/Controller/System/ProfileController.php create mode 100644 app/Controller/System/SuperController.php create mode 100644 app/Controller/Table/Gel/GajiController.php create mode 100644 app/Controller/Table/Gel/GrupController.php create mode 100644 app/Controller/Table/Gel/KaryawanController.php create mode 100644 app/Controller/Table/Gel/RekController.php create mode 100644 app/Controller/Table/Member/MemberController.php create mode 100644 app/Controller/Table/Member/MembergrupController.php create mode 100644 app/Controller/Table/Member/PointbarangController.php create mode 100644 app/Controller/Table/Member/PointskemaController.php create mode 100644 app/Controller/Table/Member/PointtipeController.php create mode 100644 app/Controller/Table/Ppob/KategoriController.php create mode 100644 app/Controller/Table/Ppob/OperatorController.php create mode 100644 app/Controller/Table/Ppob/ProdukController.php create mode 100644 app/Controller/Table/ProdukController.php create mode 100644 app/Controller/Table/ProdukgrupController.php create mode 100644 app/Controller/Table/RekposController.php create mode 100644 app/Controller/Table/SatuanController.php create mode 100644 app/Controller/Table/SupplierController.php create mode 100644 app/Controller/Table/VarianController.php create mode 100644 app/Middleware/SecurityHeaders.php create mode 100644 app/Scripts/display/config.js create mode 100644 app/Scripts/display/iklan.js create mode 100644 app/Scripts/display/promo.js create mode 100644 app/Scripts/gel/gaji.js create mode 100644 app/Scripts/gel/hutang.js create mode 100644 app/Scripts/gel/karya.js create mode 100644 app/Scripts/gel/keluar.js create mode 100644 app/Scripts/gel/piutang.js create mode 100644 app/Scripts/gel/terima.js create mode 100644 app/Scripts/gel/umum.js create mode 100644 app/Scripts/index.js create mode 100644 app/Scripts/inv/beli.js create mode 100644 app/Scripts/inv/beli_retur.js create mode 100644 app/Scripts/inv/cekharga.js create mode 100644 app/Scripts/inv/jual.js create mode 100644 app/Scripts/inv/mutasi.js create mode 100644 app/Scripts/inv/opname.js create mode 100644 app/Scripts/inv/opname_barang.js create mode 100644 app/Scripts/inv/pos.js create mode 100644 app/Scripts/locale/datepicker.id.js create mode 100644 app/Scripts/locale/fonia.id.js create mode 100644 app/Scripts/locale/moment.id.js create mode 100644 app/Scripts/login.js create mode 100644 app/Scripts/member/baru.js create mode 100644 app/Scripts/member/point.js create mode 100644 app/Scripts/member/tukar.js create mode 100644 app/Scripts/monitor.js create mode 100644 app/Scripts/ppob/ppobtx.js create mode 100644 app/Scripts/ppob/prabayar.js create mode 100644 app/Scripts/ppob/topup.js create mode 100644 app/Scripts/promo/barang.js create mode 100644 app/Scripts/promo/beli_disc.js create mode 100644 app/Scripts/promo/total.js create mode 100644 app/Scripts/report/beli/analisa.js create mode 100644 app/Scripts/report/beli/beli.js create mode 100644 app/Scripts/report/beli/mutasi.js create mode 100644 app/Scripts/report/beli/retur.js create mode 100644 app/Scripts/report/dana/keluar.js create mode 100644 app/Scripts/report/dana/masuk.js create mode 100644 app/Scripts/report/dana/pos.js create mode 100644 app/Scripts/report/gel/bulan_neraca.js create mode 100644 app/Scripts/report/gel/bulan_rlcab.js create mode 100644 app/Scripts/report/gel/bulan_saldo.js create mode 100644 app/Scripts/report/gel/bulan_shu.js create mode 100644 app/Scripts/report/gel/harian_bantu.js create mode 100644 app/Scripts/report/gel/harian_besar.js create mode 100644 app/Scripts/report/gel/harian_detail.js create mode 100644 app/Scripts/report/gel/harian_jurnal.js create mode 100644 app/Scripts/report/gel/harian_saldo.js create mode 100644 app/Scripts/report/inv/barcode.js create mode 100644 app/Scripts/report/inv/hutang.js create mode 100644 app/Scripts/report/inv/label.js create mode 100644 app/Scripts/report/inv/piutang.js create mode 100644 app/Scripts/report/jual/analisa.js create mode 100644 app/Scripts/report/jual/jual.js create mode 100644 app/Scripts/report/jual/margin.js create mode 100644 app/Scripts/report/jual/marginpos.js create mode 100644 app/Scripts/report/jual/mutasi.js create mode 100644 app/Scripts/report/jual/rekap.js create mode 100644 app/Scripts/report/member/histori.js create mode 100644 app/Scripts/report/member/point.js create mode 100644 app/Scripts/report/member/tukar.js create mode 100644 app/Scripts/report/ppob/jual.js create mode 100644 app/Scripts/report/ppob/margin.js create mode 100644 app/Scripts/report/rekap/margin.js create mode 100644 app/Scripts/report/rekap/modal.js create mode 100644 app/Scripts/report/stok/akhir.js create mode 100644 app/Scripts/report/stok/cabang.js create mode 100644 app/Scripts/report/stok/mutasi.js create mode 100644 app/Scripts/report/stok/opname.js create mode 100644 app/Scripts/system/about.js create mode 100644 app/Scripts/system/chpasswd.js create mode 100644 app/Scripts/system/config.js create mode 100644 app/Scripts/system/menu_grup.js create mode 100644 app/Scripts/system/operator.js create mode 100644 app/Scripts/system/printer.js create mode 100644 app/Scripts/system/profile.js create mode 100644 app/Scripts/system/super.js create mode 100644 app/Scripts/table/gel/gaji.js create mode 100644 app/Scripts/table/gel/grup.js create mode 100644 app/Scripts/table/gel/karyawan.js create mode 100644 app/Scripts/table/gel/rek.js create mode 100644 app/Scripts/table/member/member.js create mode 100644 app/Scripts/table/member/member_grup.js create mode 100644 app/Scripts/table/member/point_barang.js create mode 100644 app/Scripts/table/member/point_skema.js create mode 100644 app/Scripts/table/member/point_tipe.js create mode 100644 app/Scripts/table/ppob/kategori.js create mode 100644 app/Scripts/table/ppob/operator.js create mode 100644 app/Scripts/table/ppob/produk.js create mode 100644 app/Scripts/table/produk.js create mode 100644 app/Scripts/table/produk_grup.js create mode 100644 app/Scripts/table/rekpos.js create mode 100644 app/Scripts/table/satuan.js create mode 100644 app/Scripts/table/supplier.js create mode 100644 app/Scripts/table/varian.js create mode 100644 app/Styles/monitor.css create mode 100644 app/Styles/print.css create mode 100644 app/Styles/styles.css create mode 100644 app/Utils/Config.php create mode 100644 app/Utils/DBFactory.php create mode 100644 app/Utils/Env.php create mode 100644 app/Utils/Gel.php create mode 100644 app/Utils/Inv.php create mode 100644 app/Utils/Invesa.php create mode 100644 app/Utils/PPOBClient.php create mode 100644 app/commands/CacheCommand.php create mode 100644 app/commands/MigrateCommand.php create mode 100644 app/commands/PPOBCommand.php create mode 100644 app/commands/ProdukCommand.php create mode 100644 app/config/app.php.example create mode 100644 app/config/asset.php create mode 100644 app/config/bootstrap.php create mode 100644 app/config/config.php create mode 100644 app/config/qz/cert.pem create mode 100644 app/config/qz/key.pem create mode 100644 app/config/routes.php create mode 100644 app/config/runway.php create mode 100644 app/config/services.php create mode 100644 app/views/401.twig create mode 100644 app/views/404.twig create mode 100644 app/views/index.twig create mode 100644 app/views/login.twig create mode 100644 app/views/monitor.twig create mode 100644 composer.json create mode 100644 docker-compose.yml create mode 100644 public/assets/css/po.css create mode 100644 public/assets/fonts/bootstrap-icons/bootstrap-icons.woff create mode 100644 public/assets/fonts/bootstrap-icons/bootstrap-icons.woff2 create mode 100644 public/assets/images/bs/rak_1280.jpg create mode 100644 public/assets/images/bs/rak_960.jpg create mode 100644 public/assets/images/bs/shop_1280.jpg create mode 100644 public/assets/images/bs/shop_960.jpg create mode 100644 public/assets/images/bs/toko_1280.jpg create mode 100644 public/assets/images/bs/toko_960.jpg create mode 100644 public/assets/images/chr.png create mode 100644 public/assets/images/logo-apps.png create mode 100644 public/assets/images/logo-nota.png create mode 100644 public/assets/images/logo200.png create mode 100644 public/assets/images/logo300.png create mode 100644 public/assets/images/logo60.png create mode 100644 public/assets/images/logo600.png create mode 100644 public/assets/images/logo80.png create mode 100644 public/assets/images/voucher/cirblue.png create mode 100644 public/assets/images/voucher/logo-cabang.png create mode 100644 public/assets/images/voucher/vou-biru.jpg create mode 100644 public/assets/images/voucher/vou-emas.jpg create mode 100644 public/assets/images/voucher/vou-hijau.jpg create mode 100644 public/assets/images/voucher/vou-kuning.jpg create mode 100644 public/assets/images/voucher/vou-merah.jpg create mode 100644 public/assets/images/voucher/vou-perak.jpg create mode 100644 public/assets/images/voucher/vou-pink.jpg create mode 100644 public/assets/images/voucher/vou-ungu.jpg create mode 100644 public/index.php create mode 100644 runway diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..ff1f751 --- /dev/null +++ b/.env.example @@ -0,0 +1,14 @@ +# Application +APP_ENV=development +APP_DEBUG=true +FLIGHT_BASE_URL=/ +APP_TIMEZONE=UTC + +# Database : sqlite | mysql | (empty to disable) +DB_DRIVER=sqlite +DB_HOST=localhost +DB_DATABASE= +DB_USERNAME= +DB_PASSWORD= +# Absolute or project-relative path for SQLite +DB_SQLITE_PATH= \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d8c798a --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +/.vscode/ +/.env +/vendor/ +/temp/ +/composer.lock +/app/config/app.php \ No newline at end of file diff --git a/.runway-config.json b/.runway-config.json new file mode 100644 index 0000000..9ae045c --- /dev/null +++ b/.runway-config.json @@ -0,0 +1,4 @@ +{ + "index_root": "public/index.php", + "app_root": "app/" +} \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..f30d0be --- /dev/null +++ b/README.md @@ -0,0 +1,110 @@ +# Flight PHP Skeleton App + +Use this skeleton application to quickly setup and start working on a new Flight PHP application. This application uses the latest version of Flight PHP v3. + +This skeleton is designed to be AI-friendly out of the box, with predefined instructions files for popular AI coding assistants such as GitHub Copilot, Cursor, and Windsurf. This helps streamline development and ensures your project is ready for modern, AI-assisted workflows. + +This skeleton application was built for Composer. You also could download a zip of this repo, downloading a zip of the [flightphp/core](https://github.com/flightphp/core) repo, and manually autoload the files by running `require('flight/autoload.php')` in your `app/config/# FlightPHP Skeleton Project Instructions + +This document provides guidelines and best practices for structuring and developing a project using the FlightPHP framework. + +## Installation + +Run this command from the directory in which you want to install your new Flight PHP application. (this will require PHP 7.4 or newer) + +```bash +composer create-project flightphp/skeleton cool-project-name +``` + +Replace `cool-project-name` with the desired directory name for your new application. + +After you create the project, make sure you go to the `app/config/config.php` and `app/config/services.php` and uncomment the lines related to the database you want to use before you get started. + +> _Tip: This skeleton includes configuration files for AI coding assistants (Copilot, Cursor, Windsurf) to help you get the most out of AI-driven development tools from the start._ + +### Robust Setup of the Application + +This skeleton will come with 2 versions of a starter application. The robust version is a fully structured application meant for projects that you anticipate will be a bigger size. This is setup with object oriented programming in mind so that it is easier to unit test and scale your project with multiple developers (or make it easier on yourself). + +The robust version adds an `app/` directory where everything has a basic structure. This is how this skeleton is configured by default.meant + +### Simple Setup of the Application + +This is basically a single file application. The only exception to this is the config file which is still in the `app/config/` directory. This is a good starting point for smaller projects or projects that you don't anticipate will grow much. + +To use the simple version, you'll need to move the `index-simple.php` file to the `public/` directory and rename it to `index.php`. You can delete any other controllers, views, or config files (except the `config.php` file of course). + +With the simple setup, there is two very import security steps to be aware of. +- **DO NOT SAVE SENSITIVE CREDENTIALS TO THE `index.php` FILE**. +- **DO NOT COMMIT ANY TYPE OF SENSITIVE CREDENTIALS TO YOUR REPOSITORY**. + +This is what the config file is for. If you need to save sensitive credentials, save them to the config file and then reference them in the `index.php` file. + +## Running the Application + +### No Dependency Setup + +To run the application in development, you can run these commands + +```bash +cd cool-project-name +composer start +``` + +After that, open `http://localhost:8000` in your browser. + +__Note: If you run into an error similar to this `Failed to listen on localhost:8000 (reason: Address already in use)` then you'll need to change the port that the application is running on. You can do this by editing the `composer.json` file and changing the port in the `scripts.start` key.__ + +### Docker Setup + +You can [install Docker](https://docs.docker.com/engine/install/) and use `docker-compose` to run the app with `docker`, so you can run these commands: +```bash +cd cool-project-name +docker-compose up -d +# or if a newer version of docker +docker compose up -d +``` +After that, open `http://localhost:8000` in your browser. + +### Vagrant Setup +You can [install Vagrant](https://vagrantup.com/download) and a provider like [VirtualBox](https://www.virtualbox.org/wiki/Downloads) and use simple run the following command to bring up an environment with PHP/MariaDB already setup based on [n0nag0n/firefly](https://github.com/n0nag0n/firefly) + +```bash +cd cool-project-name +vagrant up +``` + +After that, open `http://localhost:8000` in your browser. + +## Project Structure + +This skeleton is organized for clarity and maintainability, and is also structured to be easily navigable by AI coding assistants. The following layout is recommended: + +``` +project-root/ +│ +├── app/ # Application-specific code +│ ├── controllers/ # Route controllers (e.g., HomeController.php) +│ ├── middlewares/ # Custom middleware classes/functions +│ ├── models/ # Data models (if needed) +│ ├── utils/ # Utility/helper functions +│ ├── views/ # View templates (if using) +│ └── commands/ # Custom CLI commands for Runway +│ +├── public/ # Web root (index.php, assets, etc.) +│ +├── config/ # Configuration files (database, app settings, routes) +│ +├── vendor/ # Composer dependencies +│ +├── tests/ # Unit and integration tests +│ +├── composer.json # Composer config +│ +└── README.md # Project overview +``` + +> _Predefined instructions for AI tools are included in this skeleton, making it easier for AI assistants to understand and help you with this structure._ + +## Do it! +That's it! Go build something flipping sweet! diff --git a/app/Controller/AuthController.php b/app/Controller/AuthController.php new file mode 100644 index 0000000..ac0e614 --- /dev/null +++ b/app/Controller/AuthController.php @@ -0,0 +1,147 @@ +app = $app; + $this->db = $db; + $this->session = $session; + $this->auth = new Auth($app); + $this->aapp = $this->session->get('WEB_APP') ?? []; + $this->auser = $this->session->get('WEB_USER') ?? []; + $this->ainv = $this->session->get('APP_INV') ?? []; + } + + public function login() { + $ajson['status'] = false; + $auser = []; + if ($this->auth->user_check(Param::Get("Username"), Param::Get("Password"))) { + $auser = $this->auth->user_data(Param::Get("Username")); + + //MONITOR DISPLAY + if (($this->ainv['MON_ENABLE'] ?? false) && ($auser['UserID'] ?? false)) { + $this->auth->pos_login($this->ainv['CABANGID'], $auser['UserID'], $auser['UNIX'], $this->app->request()->ip); + } + + $this->session->set('WEB_USER', $auser); + + if (Param::Get("redir", "") !== "") { + $_redir = $this->auth->redirect(Param::Get("redir")); + //jika kosong, tampilkan pesan redirect tidak diijinkan + //jika berisi, js harus redirect ... + } + + $ajson['status'] = true; + $ajson['token'] = $this->session->get('APP_TOKEN'); + $ajson['message'] = '
Login berhasil,

'.$auser["Username"].' / '.$auser["Nama"].'
'.$auser["Posisi"].'
login terakhir :
'.tgl_sql2str($auser["Last_Date"],true).'
'.$auser["Last_IP"].'

'; + } else { + $ajson['message'] = "Periksa kembali ID Pengguna atau Password Anda ..."; + } + $this->app->json($ajson); + } + + public function logout() { + $ajson['status'] = false; + //MONITOR DISPLAY + if (($this->ainv['MON_ENABLE'] ?? false) && ($this->auser['UserID'] ?? false)) { + $this->auth->pos_logout($this->ainv['CABANGID'], $this->auser['UserID'], $this->auser['UNIX'], $this->app->request()->ip); + } + + $this->auth->logout(); + $this->session->clear(); + + $_host = $this->app->request()->getVar('HTTP_ORIGIN') ?? $this->aapp['PARENT_SITE']; + $_host = str_replace(['http://','https://'], "", $_host); + if ($this->aapp['PARENT_SUB'] === true) { + $_subs = explode('.', $_host); + if (count($_subs) > 2) array_shift($_subs); + $_host = implode('.', $_subs); + } + $ajson['nexthost'] = "//" . $_host; + $this->app->json($ajson); + } + + public function menu() { + $page = Param::Get("p", ""); + $query = Param::Get("q", ""); + $ajson['login'] = false; + + if (count($this->auser) > 0 && !empty($page)) { + $ajson = Menu::MenuJSON($this->db, $page, $query); + } + $this->app->json($ajson); + } + + public function supervisi() { + $data = Param::Get("data", ""); + $ajson = ['status' => 0, 'pesan' => ""]; + + if ($data == "super-check") { + $bsuper = (Param::Get("SUPER","true") == "true") ? true : false; + $buover = (Param::Get("UOVER","false") == "true") ? true : false; + if (!$this->auth->user_check_level(Param::Get("UID"), $this->aapp['AUTH_LEVEL']) && $bsuper == true) { + $ajson['status'] = 0; + $ajson['pesan'] = "Silakan hubungi Supervisor / Administrator Anda!"; + } else { + if (!$this->auth->user_check(Param::Get("UID"), Param::Get("PWD"))) { + $ajson['status'] = 0; + $ajson['pesan'] = "User ID atau Password Anda Salah!
Anda tidak diijinkan melanjutkan proses!"; + } else { + $ajson['status'] = 1; + if ($buover == true && $bsuper == false && Param::Get("UID") <> $this->auser['Username']) { + $new_sess = $this->auth->user_data(Param::Get("UID")); + $tmp_sess = $this->session->get('WEB_USER'); + foreach ($new_sess as $_key => $_val) { + if ($tmp_sess[$_key]) $tmp_sess[$_key] = $_val; + } + $this->session->set('WEB_USER', $tmp_sess); + } + } + } + + } elseif ($data == "super-request") { + $this->db->delete('app_auth', 'UserID=? AND Kode=? AND SID=? AND REQ=? AND Auth=0', [$this->auser['UserID'], Param::Get("KODE"), Param::Get("REQ_SID"), Param::Get("REQ")]); + $this->db->runQuery('INSERT INTO app_auth (UserID, Kode, SID, REQ, Catatan, Tanggal) VALUES (?, ?, ?, ?, ?, NOW())', [ $this->auser['UserID'], Param::Get("KODE"), Param::Get("REQ_SID"), Param::Get("REQ"), Param::Get("MSG") ]); + + } elseif ($data == "super-cancel") { + $this->db->delete('app_auth', 'UserID=? AND Kode=? AND SID=? AND REQ=?', [$this->auser['UserID'], Param::Get("KODE"), Param::Get("REQ_SID"), Param::Get("REQ")]); + + } elseif ($data == "request-check") { + $_auth = (int) $this->db->fetchField('SELECT Auth FROM app_auth WHERE UserID=? AND Kode=? AND SID=? AND REQ=?', [$this->auser['UserID'], Param::Get("KODE"), Param::Get("REQ_SID"), Param::Get("REQ")]) ?? 0; + if ($_auth == 1) $ajson['status'] = 1; + } + $this->app->json($ajson); + } + +} diff --git a/app/Controller/Display/ConfigController.php b/app/Controller/Display/ConfigController.php new file mode 100644 index 0000000..d333d44 --- /dev/null +++ b/app/Controller/Display/ConfigController.php @@ -0,0 +1,171 @@ +app = $app; + $this->db = $db; + $this->mode = (string) Param::Get("mode"); + $this->id_reg = (string) Param::Get("REG_ID", $session->get('WEB_APP')['REG_ID']); + } + + public function form_display() { + if ( $this->mode === "save" ) { + $sql = new SQL($this->app); + $sql->set_table("disp_config"); + $sql->add_param("MON_ENABLE"); + $sql->add_param("Text_Run"); + $sql->add_param("Warna"); + $sql->add_param("Font"); + $sql->add_param("Promo_Idle"); + $sql->add_param("Promo_Durasi"); + $sql->add_param("POLE_ENABLE"); + $sql->add_param("POLE_PORT"); + $sql->add_param("POLE_START1"); + $sql->add_param("POLE_START2"); + $sql->add_param("POLE_END1"); + $sql->add_param("POLE_END2"); + $sql->add_where("REG_ID"); + $sql->UpdateDB(); + + $ajson['sukses'] = true; + $this->mode = "view"; + } + + $para = []; + if ($this->id_reg > 0) { + $para = $this->db->fetchRow("SELECT * FROM disp_config WHERE REG_ID=?", [$this->id_reg]); + $para['CabID'] = $this->db->fetchField("SELECT CABANGID FROM inv_config WHERE REG_ID=?", [$this->id_reg]) ?? 0; + $para['Nama_Cab'] = $this->db->fetchField("SELECT Nama_Cab FROM para_cabang WHERE CabID=?", [$para['CabID']]) ?? ''; + } + + $benable = ($this->mode === "edit") ? true : false; + $form = new Form($this->app); + $tmon_ena = $form->switch("_", "MON_ENABLE", $para['MON_ENABLE'], $benable, false, [1,0]); + $ttext_run = $form->textarea("_", "Text_Run", $para['Text_Run'], $benable, false, 2, "tulisan banner"); + $twarna = $form->color("_", "Warna", $para['Warna'], $benable, false); + $tfont = $form->textbox("_", "Font", $para['Font'], $benable, false, "number"); + $tpro_idle = $form->textbox("_", "Promo_Idle", $para['Promo_Idle'], $benable, false, "number"); + $tpro_dur = $form->textbox("_", "Promo_Durasi", $para['Promo_Durasi'], $benable, false, "number"); + $tpole_ena = $form->switch("_", "POLE_ENABLE", $para['POLE_ENABLE'], $benable, false, [1,0]); + $tpole_port = $form->option("_", "POLE_PORT", $para['POLE_PORT'], $benable, false, [$para['POLE_PORT']=>$para['POLE_PORT']]); + $tpole_end1 = $form->textbox("_", "POLE_END1", $para['POLE_END1'], $benable, false, "text", "baris 1 farewell", 20); + $tpole_end2 = $form->textbox("_", "POLE_END2", $para['POLE_END2'], $benable, false, "text", "baris 2 farewell", 20); + $tpole_start1 = $form->textbox("_", "POLE_START1", $para['POLE_START1'], $benable, false, "text", "baris 1 welcome", 20); + $tpole_start2 = $form->textbox("_", "POLE_START2", $para['POLE_START2'], $benable, false, "text", "baris 2 welcome", 20); + + $ajson['html'] = ' + +
+
+
+ +
'.$tmon_ena.'
+
+
+ +
'.$ttext_run.'
+
+
+ +
'.$twarna.Invesa::Form_Info("Warna tulisan banner.").'
+
+
+ +
'.$tfont.Invesa::Form_Info("Ukuran font tampilan banner.").'
+
+
+ +
'.$tpro_idle.Invesa::Form_Info("Waktu tunggu tampil promo setelah transaksi POS terakhir.").'
+
+
+ +
'.$tpro_dur.Invesa::Form_Info("Waktu durasi penggantian tulisan promo (bagian bawah)").'
+
+
+
+
+ +
'.$tpole_ena.'
+
+
+ +
'.$tpole_port.'
+
+
+ +
'.$tpole_start1.Invesa::Form_Info("Maximum 20 huruf.").'
+
+
+ +
'.$tpole_start2.Invesa::Form_Info("Maximum 20 huruf.").'
+
+
+ +
'.$tpole_end1.Invesa::Form_Info("Maximum 20 huruf.").'
+
+
+ +
'.$tpole_end2.Invesa::Form_Info("Maximum 20 huruf.").'
+
+
+
+ '; + $ajson['Nama_Cab'] = $para['Nama_Cab']; + $this->app->json($ajson); + } + + public function brow_cabang() { + $obj = new Table($this->app); + $obj->set_table("(SELECT * FROM para_cabang WHERE Aktif=1) C LEFT JOIN inv_config G ON (G.CABANGID=C.CabID)", "C.*,G.REG_ID"); + $obj->add_field("REG_ID", "ID", "hid"); + $obj->add_field("Kode_Cab", "Kode", "c"); + $obj->add_field("Nama_Cab", "Nama Cabang", "awr"); + $obj->set_field_order("Kode_Cab", "A"); + $obj->set_func_select("DISPConfigJS.cab_select"); + $this->app->json([ $obj->json_table("divBrowCab") ]); + } + + public function index() { + $this->app->json(['html' => + '
 
' + ]); + } +} diff --git a/app/Controller/Display/IklanController.php b/app/Controller/Display/IklanController.php new file mode 100644 index 0000000..90974b6 --- /dev/null +++ b/app/Controller/Display/IklanController.php @@ -0,0 +1,175 @@ +app = $app; + $this->db = $db; + $this->mode_detail = (string) Param::Get("mode_detail"); + $this->id_promo = (int) Param::Get("PromoID"); + } + + public function table_detail() { + if (in_array($this->mode_detail, ["insert","update","delete"])) { + $sql = new SQL($this->app); + $sql->set_table("disp_promo"); + $sql->add_param("CabID"); + $sql->add_param_date("Tanggal"); + $sql->add_param("Info"); + $sql->add_param("Aktif"); + $sql->add_param_userid(); + $sql->add_where("PromoID"); + + if ($this->mode_detail === "insert") { + $sql->add_param("PromoID"); + $sql->add_param("Tipe", 2); + if ($this->id_promo > 0) { $sql->UpdateDB(); } + else $sql->InsertDB(); + } else if ($this->mode_detail === "update") { + $sql->UpdateDB(); + } else if ($this->mode_detail === "delete") { + $sql->DeleteDB(); + } + } + + $tcari = Param::Get("Cari_Iklan"); + $tsql = ""; $asql = []; + if (!empty($tcari)) { + $tsql = " AND CONCAT(DATE_FORMAT(I.Tanggal,'%d-%m-%Y'),I.Info) LIKE ?"; + $asql[] = '%'.$tcari.'%'; + } + + $obj = new Table($this->app); + $obj->set_table("(SELECT * FROM disp_promo WHERE Tipe=2) I LEFT JOIN para_cabang C ON (C.CabID=I.CabID)", "I.*,IF(ISNULL(C.Nama_Cab),'SEMUA CABANG',C.Nama_Cab) Nama_Cab", $tsql, $asql); + $obj->add_field("PromoID", "ID", "hid"); + $obj->add_field("Tanggal", "Tanggal", "c", "sqltgl", "", "val-tgl"); + $obj->add_field("Nama_Cab", "Cabang", "l"); + $obj->add_field("Info", "Keterangan", "awr"); + $obj->add_field("Aktif", "Aktif", "c", "checkbox"); + $obj->set_field_order("Tanggal", "A"); + $obj->add_row_btn("clipboard", "Ubah", "DISPIklanJS.detail_ubah"); + $obj->add_row_btn("trash", "Hapus", "DISPIklanJS.detail_hapus"); + $obj->set_func_btn("DISPIklanJS.detail_tambah", "+ Iklan"); + $this->app->json([ $obj->json_table("divDetail") ]); + } + + public function form_iklan() { + $atabel = Invesa::A_Iklan(); + if ($this->id_promo > 0) { + $atabel = $this->db->fetchRow("SELECT * FROM disp_promo WHERE PromoID=?", [$this->id_promo]); + } + + $form = new Form($this->app); + $tcab = $form->option_db("_", "CabID", $atabel['CabID'], true, false, "para_cabang", ["CabID","Nama_Cab"], "Aktif=1 ORDER BY CabID", [0,"SEMUA CABANG"]); + $ttanggal = $form->datebox("_", "Tanggal", $atabel['Tanggal'], true, false); + $tinfo = $form->textarea("_", "Info", $atabel['Info'], true, false, 3, "keterangan iklan"); + $taktif = $form->radio("_", "Aktif", $atabel['Aktif'], true, false, [1=>"Aktif",0=>"Tidak"]); + $ajson['html'] = ' +
+
+
+ +
'.$ttanggal.'
+
+
+ +
'.$tcab.'
+
+
+ +
'.$tinfo.'
+
+
+ +
'.$taktif.'
+
+
+
+ +
Ukuran file max 20MB ( png / jpg / gif ) +
+ + '; + $this->app->json($ajson); + } + + public function upload_picture() { + $ajson['result'] = 0; + $upload = $this->app->request()->getUploadedFiles(); + $file = $upload['Gambar1']; + + if ($file->getError() === UPLOAD_ERR_OK) { + $file_name = $file->getClientFilename(); + $file_size = $file->getSize(); + if ($file_size < 20480000) { + $file_ext = pathinfo($file_name, PATHINFO_EXTENSION); + if (in_array($file_ext, ["png","jpg","jpeg","gif"])) { + $file_name = $file->getTempName(); + $mime = $file->getClientMediaType(); + if ($this->id_promo > 0) { + $this->db->runQuery("UPDATE disp_promo SET Image=\"".addslashes(file_get_contents($file_name))."\",Mime='".$mime."' WHERE PromoID=?", [$this->id_promo]); + } else { + $this->db->runQuery("INSERT INTO disp_promo (Image,Mime) VALUES(\"".addslashes(file_get_contents($file_name))."\",'".$mime."')"); + $this->id_promo = (int) $this->db->lastInsertId(); + } + $ajson['result'] = 1; + $ajson['PromoID'] = $this->id_promo; + } else { + $ajson['message'] = "File tidak dapat diterima !"; + } + } else { + $ajson['message'] = "Ukuran file diatas 20MB !"; + } + } else { + $ajson = ['result' => 0, 'message' => $file->getError()]; + } + $this->app->json($ajson); + } + + public function get_picture() { + $gambar = "/9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAIBAQIBAQICAgICAgICAwUDAwMDAwYEBAMFBwYHBwcGBwcICQsJCAgKCAcHCg0KCgsMDAwMBwkODw0MDgsMDAz/2wBDAQICAgMDAwYDAwYMCAcIDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz/wAARCAABAAEDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD9/KKKKAP/2Q=="; + $mime = "image/jpg"; + + $prof = $this->db->fetchRow("SELECT Image,Mime FROM disp_promo WHERE PromoID=? AND Image IS NOT NULL", [$this->id_promo]); + if ($prof) { + $gambar = base64_encode($prof['Image']); + $mime = $prof['Mime']; + } + $this->app->json([ 'src' => 'data:'.$mime.';base64,'.$gambar ]); + } + + public function index() { + $this->app->json(['html' => + '
Konfigurasi Display Iklan POS
 
' + ]); + } +} diff --git a/app/Controller/Display/PromoController.php b/app/Controller/Display/PromoController.php new file mode 100644 index 0000000..703a8fc --- /dev/null +++ b/app/Controller/Display/PromoController.php @@ -0,0 +1,182 @@ +app = $app; + $this->db = $db; + $this->mode_detail = (string) Param::Get("mode_detail"); + $this->id_promo = (int) Param::Get("PromoID"); + } + + public function table_detail() { + if (in_array($this->mode_detail, ["insert","update","delete"])) { + $sql = new SQL($this->app); + $sql->set_table("disp_promo"); + $sql->add_param_date("Tanggal"); + $sql->add_param("Info"); + $sql->add_param("Warna"); + $sql->add_param("Font"); + $sql->add_param("Aktif"); + $sql->add_param_userid(); + $sql->add_where("PromoID"); + + if ($this->mode_detail === "insert") { + $sql->add_param("PromoID"); + $sql->add_param("Tipe", 1); + if ($this->id_promo > 0) { $sql->UpdateDB(); } + else $sql->InsertDB(); + } else if ($this->mode_detail === "update") { + $sql->UpdateDB(); + } else if ($this->mode_detail === "delete") { + $sql->DeleteDB(); + } + } + + $tcari = Param::Get("Cari_Promo"); + $tsql = "Tipe=1"; $asql = []; + if (!empty($tcari)) { + $tsql = " AND CONCAT(DATE_FORMAT(Tanggal,'%d-%m-%Y'),Info) LIKE ?"; + $asql[] = '%'.$tcari.'%'; + } + + $obj = new Table($this->app); + $obj->set_table("disp_promo", "*", $tsql, $asql); + $obj->add_field("PromoID", "ID", "hid"); + $obj->add_field("Tanggal", "Tanggal", "c", "sqltgl", "", "val-tgl"); + $obj->add_field("Info", "Isi Informasi / Promo", "awr"); + $obj->add_field("Warna", "Warna", "c"); + $obj->add_field("Font", "Font", "c"); + $obj->add_field("Aktif", "Aktif", "c", "checkbox"); + $obj->set_field_order("Tanggal", "A"); + $obj->add_row_btn("clipboard", "Ubah", "DISPPromoJS.detail_ubah"); + $obj->add_row_btn("trash", "Hapus", "DISPPromoJS.detail_hapus"); + $obj->set_func_btn("DISPPromoJS.detail_tambah", "+ Promo"); + $this->app->json([ $obj->json_table("divDetail") ]); + } + + public function form_promo() { + $atabel = Invesa::A_Iklan(); + if ($this->id_promo > 0) { + $atabel = $this->db->fetchRow("SELECT * FROM disp_promo WHERE PromoID=?", [$this->id_promo]); + } + + $form = new Form($this->app); + $ttanggal = $form->datebox("_", "Tanggal", $atabel['Tanggal'], true, false); + $tinfo = $form->textarea("_", "Info", $atabel['Info'], true, false, 2, "info promo"); + $twarna = $form->color("_", "Warna", $atabel['Warna'], true, false); + $tfont = $form->textbox("_", "Font", $atabel['Font'], true, false, "number"); + $taktif = $form->radio("_", "Aktif", $atabel['Aktif'], true, false, [1=>"Aktif",0=>"Tidak"]); + $ajson['html'] = ' +
+
+
+ +
'.$ttanggal.'
+
+
+ +
'.$tinfo.'[br] = Ganti Baris, [i]..[/i] = Italic, [b]..[/b] = Bold
+
+
+ +
'.$twarna.Invesa::Form_Info("Warna tulisan promo.").'
+
+
+ +
'.$tfont.Invesa::Form_Info("Ukuran font promo.").'
+
+
+ +
'.$taktif.'
+
+
+
+ +
Ukuran file max 20MB ( png / jpg / gif ) +
+ + '; + $this->app->json($ajson); + } + + public function upload_picture() { + $ajson['result'] = 0; + $upload = $this->app->request()->getUploadedFiles(); + $file = $upload['Gambar1']; + + if ($file->getError() === UPLOAD_ERR_OK) { + $file_name = $file->getClientFilename(); + $file_size = $file->getSize(); + if ($file_size < 20480000) { + $file_ext = pathinfo($file_name, PATHINFO_EXTENSION); + if (in_array($file_ext, ["png","jpg","jpeg","gif"])) { + $file_name = $file->getTempName(); + $mime = $file->getClientMediaType(); + if ($this->id_promo > 0) { + $this->db->runQuery("UPDATE disp_promo SET Image=\"".addslashes(file_get_contents($file_name))."\",Mime='".$mime."' WHERE PromoID=?", [$this->id_promo]); + } else { + $this->db->runQuery("INSERT INTO disp_promo (Image,Mime) VALUES(\"".addslashes(file_get_contents($file_name))."\",'".$mime."')"); + $this->id_promo = (int) $this->db->lastInsertId(); + } + $ajson['result'] = 1; + $ajson['PromoID'] = $this->id_promo; + } else { + $ajson['message'] = "File tidak dapat diterima !"; + } + } else { + $ajson['message'] = "Ukuran file diatas 20MB !"; + } + } else { + $ajson = ['result' => 0, 'message' => $file->getError()]; + } + $this->app->json($ajson); + } + + public function get_picture() { + $gambar = "/9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAIBAQIBAQICAgICAgICAwUDAwMDAwYEBAMFBwYHBwcGBwcICQsJCAgKCAcHCg0KCgsMDAwMBwkODw0MDgsMDAz/2wBDAQICAgMDAwYDAwYMCAcIDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz/wAARCAABAAEDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD9/KKKKAP/2Q=="; + $mime = "image/jpg"; + + $prof = $this->db->fetchRow("SELECT Image,Mime FROM disp_promo WHERE PromoID=? AND Image IS NOT NULL", [$this->id_promo]); + if ($prof) { + $gambar = base64_encode($prof['Image']); + $mime = $prof['Mime']; + } + $this->app->json([ 'src' => 'data:'.$mime.';base64,'.$gambar ]); + } + + public function index() { + $this->app->json(['html' => + '
Konfigurasi Display Promo POS
 
' + ]); + } +} diff --git a/app/Controller/Gel/GajiController.php b/app/Controller/Gel/GajiController.php new file mode 100644 index 0000000..971da27 --- /dev/null +++ b/app/Controller/Gel/GajiController.php @@ -0,0 +1,492 @@ +app = $app; + $this->db = $db; + $this->web_app = (array) $session->get('WEB_APP'); + $this->app_gel = (array) $session->get('APP_GEL'); + $this->id_cab = Param::Int("CabID", $session->get('APP_INV')['CABANGID']); + $this->mode = Param::Get("mode", ""); + $this->mode_detail = Param::Get("mode_detail", ""); + $this->no_gaji = Param::Get("No_Gaji", ""); + $this->gel = new Gel($app); + } + + public function table_detail() { + if (in_array($this->mode_detail, ["insert","update","delete"])) { + $sql = new SQL($this->app); + $sql->set_table("tmp_gaji_detail"); + $sql->add_param("KaryaID"); + $sql->add_param("Qty_Harian"); + $sql->add_param("Gaji_Harian"); + $sql->add_param("Total_Gaji", "Qty_Harian*Gaji_Harian", true); + $sql->add_param("Qty_Lembur"); + $sql->add_param("Lembur_Harian"); + $sql->add_param("Total_Lembur", "Qty_Lembur*Lembur_Harian", true); + $sql->add_param("Qty_BonusM"); + $sql->add_param("Qty_BonusB"); + $sql->add_param("Bonus_Minggu"); + $sql->add_param("Bonus_Bulan"); + $sql->add_param("Total_BonusM", "Qty_BonusM*Bonus_Minggu", true); + $sql->add_param("Total_BonusB", "Qty_BonusB*Bonus_Bulan", true); + $sql->add_param("Total_Potong"); + $sql->add_param("Total_Semua", "Total_Gaji+Total_Lembur+Total_BonusM+Total_BonusB-Total_Potong", true); + $sql->add_param("Catatan", Param::Get("CatatKar")); + $sql->add_param_unix(); + $sql->add_param_userid(); + $sql->add_where("ID"); + $sql->add_where("No_Gaji", $this->no_gaji); + + if ($this->mode_detail === "insert") { + $sql->add_param("No_Gaji"); + $sql->InsertDB(); + } else if ($this->mode_detail === "update") { + $sql->UpdateDB(); + } else if ($this->mode_detail === "delete") { + $sql->DeleteDB(); + } + } + + $tsql = ''; $asql = [$this->no_gaji]; $qtabel = "gel_gaji_detail"; + if (in_array($this->mode, ["add","edit"])) { + if ($this->mode === "add") { $tsql = " AND Unix=?"; $asql[] = $this->app->user()->unix(); } + $qtabel = "tmp_gaji_detail"; + } + + $obj = new Table($this->app); + $obj->set_table("(SELECT * FROM ".$qtabel.' WHERE No_Gaji=?'.$tsql.") D LEFT JOIN para_karyawan P ON (D.KaryaID=P.KaryaID)", "D.*,P.Nama_Karya,(P.Total_Pinjam-D.Total_Potong) Sisa_Pinjam", "", $asql); + $obj->set_footer("SUM(Total_Semua) Total_Semua"); + $obj->add_field("ID", "ID", "hid"); + $obj->add_field("KaryaID", "KaryaID", "hid"); + $obj->add_field("Nama_Karya", "Nama Karyawan", "awr"); + $obj->add_field("Qty_Harian", "Hari", "r", "rupiah"); + $obj->add_field("Total_BonusM", "Bonus MG", "r", "rupiah"); + $obj->add_field("Total_BonusB", "Bonus BLN", "r", "rupiah"); + $obj->add_field("Total_Potong", "Potongan", "r", "rupiah"); + $obj->add_field("Total_Semua", "Gaji Bersih", "r", "rupiah", "rupiah"); + $obj->add_field("Catatan", "Catatan", "awr"); + $obj->set_field_order("Nama_Karya", "A"); + if (in_array($this->mode, ["add","edit"])) { + $obj->add_row_btn("clipboard", "Ubah", "GELGajiJS.detail_ubah"); + $obj->add_row_btn("trash", "Hapus", "GELGajiJS.detail_hapus", "Unix", $this->app->user()->unix()); + $obj->set_func_btn("GELGajiJS.detail_tambah", ' Karyawan'); + $obj->set_func_btn("GELGajiJS.karya_brow", ' Browse'); + } + $this->app->json([ $obj->json_table("divDetailTabel") ]); + } + + public function brow_tx() { + $tcari = Param::Get("Cari_TX"); + $tsql = ''; $asql = []; + if (!empty($tcari)) { + $tsql .= "CONCAT(No_Gaji,DATE_FORMAT(Tgl_Gaji,'%d-%m-%Y'),Catatan) LIKE ?"; + $asql[] = '%' . $tcari . '%'; + } + + $obj = new Table($this->app); + $obj->set_table("gel_gaji", "*,CONCAT(LPAD(Bulan,2,'0'),'-',Tahun) BLTH,(Total_Gaji+Total_Bonus-Total_Potong) Jumlah", $tsql); + $obj->add_field("No_Gaji", "No. Trans", "c"); + $obj->add_field("Tgl_Gaji", "Tgl. Trans", "c", "sqltgl", "", "val-tgl"); + $obj->add_field("Minggu", "MG", "c"); + $obj->add_field("BLTH", "Bulan", "c"); + $obj->add_field("Total_Gaji", "Total Gaji", "r", "rupiah"); + $obj->add_field("Total_Bonus", "Total Bonus", "r", "rupiah"); + $obj->add_field("Total_Potong", "Potongan", "r", "rupiah"); + $obj->add_field("Jumlah", "TOTAL", "r", "rupiah"); + $obj->set_field_order("No_Gaji", "D"); + $obj->set_func_select("GELGajiJS.tx_select"); + $this->app->json([ $obj->db_table("divBrowTX") ]); + } + + public function brow_cetak() { + $obj = new Table($this->app); + $obj->set_table("(SELECT * FROM gel_gaji_detail WHERE No_Gaji=?) D LEFT JOIN para_karyawan P ON (D.KaryaID=P.KaryaID)", "D.*,P.Nama_Karya, 'N' Cek", "", [$this->no_gaji]); + $obj->add_field("ID", "ID", "hid"); + $obj->add_field("Nama_Karya", "Nama Karyawan", "awr"); + $obj->add_field("Total_Gaji", "Total Gaji", "r", "rupiah"); + $obj->add_field("Total_Semua", "Gaji Bersih", "r", "rupiah"); + $obj->add_field("Catatan", "Catatan", "awr"); + $obj->add_row_checkbox("ID", "Cek"); + $obj->set_field_order("Nama_Karya", "A"); + $this->app->json([ $obj->db_table("divBrowCetak") ]); + } + + public function brow_karya() { + $tcari = Param::Get("Cari_Karya"); + $tsql = ''; $asql = [$this->no_gaji]; + if (!empty($tcari)) { + $tsql .= " AND Nama_Karya LIKE ?"; + $asql[] = '%' . $tcari . '%'; + } + + $obj = new Table($this->app); + $obj->set_table("para_karyawan", "*", "Aktif=1 AND KaryaID NOT IN (SELECT KaryaID FROM tmp_gaji_detail WHERE No_Gaji=?)".$tsql, $asql); + $obj->add_field("KaryaID", "ID", "hid"); + $obj->add_field("Nama_Karya", "Nama Karyawan", "awr"); + $obj->add_field("Gaji_Harian", "Gaji Harian", "r", "rupiah"); + $obj->add_field("Total_Pinjam", "Total Pinjaman", "r", "rupiah"); + $obj->set_field_order("Nama_Karya", "A"); + $obj->set_func_select("GELGajiJS.karya_select"); + $this->app->json([ $obj->db_table("divBrowKarya") ]); + } + + public function auto_karya() { + $tcari = Param::Get("Auto_Query"); + $ajson['autodata'] = []; + $stat = $this->db->runQuery("SELECT KaryaID,Nama_Karya,CONCAT(Gaji_Harian,':',Total_Pinjam) Data2 FROM para_karyawan WHERE Aktif=1 AND KaryaID NOT IN (SELECT KaryaID FROM tmp_gaji_detail WHERE No_Gaji=?) AND Nama_Karya LIKE ? ORDER BY Nama_Karya LIMIT 50", [$this->no_gaji, '%'.$tcari.'%']); + while ($row = $stat->fetch(SimplePdo::FETCH_ASSOC)) { + $ajson['autodata'][] = ['value'=>$row['KaryaID'], 'text'=>$row['Nama_Karya'], 'data'=>$row['Data2'], 'bc'=>0]; + } + $this->app->json($ajson); + } + + public function form_master() { + $ajson = [ 'error'=>"", 'html'=>"" ]; + $atabel = [ 'No_Gaji'=>"", 'CabID'=>$this->id_cab, 'Tgl_Gaji'=>"", 'Minggu'=>date('W'), 'Bulan'=>date('n'), 'Tahun'=>date('Y'), 'Catatan'=>"" ]; + + if ($this->mode === "add") { + $atabel['No_Gaji'] = "GJ-BARU#".(string) $this->web_app['SERVER_ID']. $this->app->user()->id(3); + $atabel['Tgl_Gaji'] = tgl_ymd(); + $this->no_gaji = ""; + + } else if ($this->mode === "edit") { + $this->Gaji_Copy($this->no_gaji); + + } else if ($this->mode === "save") { + $no_lama = $this->no_gaji; + $tgl_gaji = Param::Get("Tgl_Gaji"); + $b_baru = str_contains($no_lama, "BARU"); + if ($b_baru) $this->no_gaji = $this->Gaji_Baru($this->id_cab, $tgl_gaji, true); + $this->Gaji_Save($this->no_gaji, $b_baru, $no_lama); + + $agaji = $this->db->fetchRow("SELECT SUM(Total_Gaji+Total_Lembur) Gaji, SUM(Total_BonusM+Total_BonusB) Bonus, SUM(Total_Potong) Potong FROM gel_gaji_detail WHERE No_Gaji=?", [$this->no_gaji]) ?? ['Gaji'=>0, 'Bonus'=>0, 'Potong'=>0]; + + $sql = new SQL($this->app); + $sql->set_table("gel_gaji"); + $sql->add_param_date("Tgl_Gaji"); + $sql->add_param("Total_Gaji", $agaji['Gaji']); + $sql->add_param("Total_Bonus", $agaji['Bonus']); + $sql->add_param("Total_Potong", $agaji['Potong']); + $sql->add_param("Minggu"); + $sql->add_param("Bulan"); + $sql->add_param("Tahun"); + $sql->add_param("CabID"); + $sql->add_param("Catatan"); + $sql->add_param_stamp(); + $sql->add_param_userid(); + $sql->add_where("No_Gaji", $this->no_gaji); + $sql->UpdateDB(); + + // PROSES POSTING GL + $ainfo = $this->db->fetchRow("SELECT *,Total_Gaji+Total_Bonus Gaji FROM gel_gaji WHERE No_Gaji=?", [$this->no_gaji]); + $ajurnal = [ + 'Kode_Jurnal' => $this->no_gaji, + 'TipeID' => 14, + 'CabID' => $this->id_cab, + 'Tanggal' => $tgl_gaji, + 'Kode_Ref' => $this->no_gaji, + 'Catatan' => "Pembayaran Gaji : ".$ainfo['No_Gaji']." / Minggu ".$ainfo['Minggu'].", Bulan ".bulan_array()[$ainfo['Bulan']]." ".$ainfo['Tahun'] + ]; + $adetail = [ + [ + 'Kode_Rek' => $this->app_gel['BIAYA_GAJI'], + 'DK' => "D", + 'Jumlah' => $ainfo['Gaji'] + ], + [ + 'Kode_Rek' => $this->app_gel['KAS_TUNAI'], + 'DK' => "K", + 'Jumlah' => (float) $ainfo['Gaji'] - (float) $ainfo['Total_Potong'] + ] + ]; + + $this->db->delete("gel_karyawan", "Kode_Jurnal=?", [$this->no_gaji]); + if ((float) $ainfo['Total_Potong'] > 0) { + $apotong = $this->db->fetchAll("SELECT KaryaID,Total_Potong FROM gel_gaji_detail WHERE No_Gaji=? AND Total_Potong>0", [$this->no_gaji]); + foreach($apotong as $_key => $val) { + $this->db->insert("gel_karyawan", [ 'No_Trans'=>$this->gel->Karya_Baru($tgl_gaji), 'Tgl_Trans'=>$ainfo['Tgl_Gaji'], 'KaryaID'=>$val['KaryaID'], 'Kode_Jurnal'=>$this->no_gaji, 'Total_Bayar'=>$val['Total_Potong'], 'Catatan'=>'Potong Gaji : '.$this->no_gaji, 'Kunci'=>1, 'UserID'=>$this->app->user()->id() ]); + $adetail[] = [ + 'Kode_Rek' => $this->app_gel['PIU_KARYA'], + 'DK' => "K", + 'Jumlah' => $val['Total_Potong'] + ]; + // UPDATE KE KARYAWAN + $ipinjam = $this->db->fetchField("SELECT SUM(Total_Pinjam-Total_Bayar) FROM gel_karyawan WHERE KaryaID=?", [$val['KaryaID']]) ?? 0; + $this->db->runQuery("UPDATE para_karyawan SET Total_Pinjam=? WHERE KaryaID=?", [$ipinjam, $val['KaryaID']]); + } + } + $this->gel->Jurnal_Post($ajurnal, $adetail); + $this->mode = "view"; + + } else if ($this->mode === "cancel") { + $this->Gaji_Cancel($this->no_gaji); + $this->mode = "view"; + $this->no_gaji = ""; + } + + if (!empty($this->no_gaji) && $this->mode !== "cancel") { + $row = $this->db->fetchRow("SELECT * FROM gel_gaji WHERE No_Gaji='".$this->no_gaji."'"); + if ($row) { + $atabel = $row; + } else { + $ajson['error'] = "Nomor Transaksi belum ada / tidak diketemukan !"; + } + } + + $enable = in_array($this->mode, ["add","edit"]) ? true : false; + $form = new Form($this->app); + $tno = $form->textbox("_", "No_Gaji", $atabel['No_Gaji'], !$enable, false, "text", "nomor transaksi"); + $ttgl = $form->datebox("_", "Tgl_Gaji", $atabel['Tgl_Gaji'], $enable, false); + $tcab = $form->option_db("_", "CabID", $atabel['CabID'], $enable, false, "para_cabang", ["CabID","Nama_Cab"], "Aktif=1 ORDER BY CabID"); + $tmg = $form->option("_", "Minggu", $atabel['Minggu'], $enable, false, $this->range_minggu((int) $atabel['Bulan'], (int) $atabel['Tahun'])); + $tbln = $form->option("_", "Bulan", $atabel['Bulan'], $enable, false, bulan_array(), null, "GELGajiJS.oc_Minggu()"); + $tthn = $form->option("_", "Tahun", $atabel['Tahun'], $enable, false, $this->gel->Tahun_Array(), null, "GELGajiJS.oc_Minggu()"); + $tcatat = $form->textbox("_", "Catatan", stripslashes($atabel['Catatan']), $enable, false, "text", "catatan gaji"); + $ajson['html'] = ' +
+
+
+ +
'.$tno.'
+
+
+ +
'.$ttgl.'
+
+
+
+
+ +
'.$tcab.'
+
+
+ +
'.$tbln.$tthn.'/'.$tmg.'
+
+
+
+
+ +
'.$tcatat.'
+
+

+ + + + '; + $this->app->json($ajson); + } + + public function form_gaji() { + $id = (int) Param::Get("ID", 0); + $atabel = [ 'ID'=>$id, 'KaryaID'=>Param::Get("KaryaID"), 'Nama_Karya'=>"", 'Qty_Harian'=>0, 'Gaji_Harian'=>0, 'Qty_Lembur'=>0, 'Lembur_Harian'=>$this->app_gel['LEMBUR'], 'Qty_BonusM'=>0, 'Qty_BonusB'=>0, 'Bonus_Minggu'=>$this->app_gel['BONUS1'], 'Bonus_Bulan'=>$this->app_gel['BONUS2'], 'Total_Potong'=>0, 'Total_Pinjam'=>0, 'Tot_Gaji'=>0, 'Tot_Lembur'=>0, 'Tot_Bonus1'=>0, 'Tot_Bonus2'=>0, 'Jumlah'=>0, 'Catatan'=>"" ]; + if ($id > 0) { + $_agaji = $this->db->fetchRow("SELECT * FROM tmp_gaji_detail WHERE No_Gaji=? AND ID=?", [$this->no_gaji, $id]); + if ($_agaji) $atabel = array_merge($atabel, $_agaji->getData()); + } + if (!empty($atabel['KaryaID'])) { + $_akary = $this->db->fetchRow("SELECT Nama_Karya,Gaji_Harian,Total_Pinjam FROM para_karyawan WHERE KaryaID=?", [$atabel['KaryaID']]); + if ($_akary) $atabel = array_merge($atabel, $_akary->getData()); + } + + $form = new Form($this->app); + $tnama = $form->textauto("_", "Nama_Karya", ['value'=>$atabel['KaryaID'],'text'=>$atabel['Nama_Karya']], true, true, "ketik nama karyawan"); + $tqty_har = $form->textbox("_", "Qty_Harian", $atabel['Qty_Harian'], true, true, "double"); + $tqty_lem = $form->textbox("_", "Qty_Lembur", $atabel['Qty_Lembur'], true, true, "double"); + $tqty_bm = $form->textbox("_", "Qty_BonusM", $atabel['Qty_BonusM'], true, true, "double"); + $tqty_bb = $form->textbox("_", "Qty_BonusB", $atabel['Qty_BonusB'], true, true, "double"); + $tpotong = $form->textbox("_", "Total_Potong", $atabel['Total_Potong'], true, true, "double"); + $tgj_hari = $form->textbox("_", "Gaji_Harian", $atabel['Gaji_Harian'], false, false, "double"); + $tlb_hari = $form->textbox("_", "Lembur_Harian", $atabel['Lembur_Harian'], false, false, "double"); + $tbon_m = $form->textbox("_", "Bonus_Minggu", $atabel['Bonus_Minggu'], false, false, "double"); + $tbon_b = $form->textbox("_", "Bonus_Bulan", $atabel['Bonus_Bulan'], false, false, "double"); + $ttot_gaji = $form->textbox("_", "Tot_Gaji", $atabel['Tot_Gaji'], false, false, "double"); + $ttot_lemb = $form->textbox("_", "Tot_Lembur", $atabel['Tot_Lembur'], false, false, "double"); + $ttot_bon1 = $form->textbox("_", "Tot_Bonus1", $atabel['Tot_Bonus1'], false, false, "double"); + $ttot_bon2 = $form->textbox("_", "Tot_Bonus2", $atabel['Tot_Bonus2'], false, false, "double"); + $tjumlah = $form->textbox("_", "Jumlah", $atabel['Jumlah'], false, false, "double"); + $tcatat = $form->textbox("_", "CatatKar", $atabel['Catatan'], true, true, "text"); + $ajson['html'] = ' +
+ +
'.$tnama.'
+
+
+ +
'.$tqty_har.$tgj_hari.'
+
'.$ttot_gaji.'
+
+
+ +
'.$tqty_lem.$tlb_hari.'
+
'.$ttot_lemb.'
+
+
+ +
'.$tqty_bm.$tbon_m.'
+
'.$ttot_bon1.'
+
+
+ +
'.$tqty_bb.$tbon_b.'
+
'.$ttot_bon2.'
+
+

+
+ +
'.$tpotong.'
+
+
+ +
'.$tjumlah.'
+
+

+
+ +
+
+
+ +
'.$tcatat.'
+
+ + + '; + $this->app->json($ajson); + } + + public function proses_hapus() { + $this->db->runQuery("DELETE FROM gel_gaji WHERE No_Gaji=?", [$this->no_gaji]); + $this->db->runQuery("DELETE FROM gel_gaji_detail WHERE No_Gaji=?", [$this->no_gaji]); + // PROSES POSTING GL + $this->db->runQuery("DELETE FROM gel_jurnal WHERE Kode_Jurnal=?", [$this->no_gaji]); + $this->db->runQuery("DELETE FROM gel_jurnal_detail WHERE Kode_Jurnal=?", [$this->no_gaji]); + $this->db->runQuery("DELETE FROM gel_karyawan WHERE Kode_Jurnal=?", [$this->no_gaji]); + $this->app->json([ 'status' => true ]); + } + + public function option_minggu() { + $amg = $this->range_minggu((int) Param::Get("Bulan"), (int) Param::Get("Tahun")); + $ajson['option'] = []; + foreach($amg as $_key => $_val) { + $ajson['option'][] = ['value' => $_key, 'label' => $_val]; + } + $this->app->json($ajson); + } + + public function index() { + $this->app->json(['html' => ' +
+
+ +
+
+
 
+
 
+
+
+
+
' + ]); + } + + private function Gaji_Baru(int $id_cab = 0, string $tgl = "", bool $save = false) { + if (empty($tgl)) { + $tno = "J" . date("y") . abjad(date("n")); + } else { + $tmp = explode("-", $tgl); + $tno = "J" . substr($tmp[2],2,2) . abjad((int) $tmp[1]); + } + $tno .= $this->web_app['SERVER_ID'] . $id_cab; + $ino = (int) $this->db->fetchField("SELECT MAX(RIGHT(No_Gaji,5)) FROM gel_gaji WHERE No_Gaji LIKE ?", [$tno.'%']) ?? 0; + $tno .= isi_nol(++$ino, 5); + if ($save===true) $this->db->insert("gel_gaji", [ 'No_Gaji'=>$tno ]); + return $tno; + } + + private function Gaji_Copy(string $no_gaji, bool $unix = false): void { + if (empty($no_gaji)) return; + $this->Gaji_Cancel($no_gaji); + $this->db->runQuery("INSERT INTO tmp_gaji_detail (No_Gaji,KaryaID,Qty_Harian,Gaji_Harian,Total_Gaji,Qty_Lembur,Lembur_Harian,Total_Lembur,Qty_BonusM,Qty_BonusB,Bonus_Minggu,Bonus_Bulan,Total_BonusM,Total_BonusB,Total_Potong,Total_Semua,Catatan,UserID,Unix) SELECT No_Gaji,KaryaID,Qty_Harian,Gaji_Harian,Total_Gaji,Qty_Lembur,Lembur_Harian,Total_Lembur,Qty_BonusM,Qty_BonusB,Bonus_Minggu,Bonus_Bulan,Total_BonusM,Total_BonusB,Total_Potong,Total_Semua,Catatan,UserID,'".(($unix)?$this->app->user()->unix():0)."' FROM gel_gaji_detail WHERE No_Gaji=?", [$no_gaji]); + } + + private function Gaji_Save(string $no_gaji, bool $is_baru = false, ?string $no_lama = ""): void { + if (empty($no_gaji)) return; + $this->db->delete("gel_gaji_detail", "No_Gaji=?", [$no_gaji]); + if ($is_baru) { + $this->Gaji_Cancel($no_gaji); + $this->db->runQuery("UPDATE tmp_gaji_detail SET No_Gaji=? WHERE No_Gaji=? AND Unix=?", [$no_gaji, $no_lama, $this->app->user()->unix()]); + } + $this->db->runQuery("INSERT INTO gel_gaji_detail (No_Gaji,KaryaID,Qty_Harian,Gaji_Harian,Total_Gaji,Qty_Lembur,Lembur_Harian,Total_Lembur,Qty_BonusM,Qty_BonusB,Bonus_Minggu,Bonus_Bulan,Total_BonusM,Total_BonusB,Total_Potong,Total_Semua,Catatan,UserID) SELECT No_Gaji,KaryaID,Qty_Harian,Gaji_Harian,Total_Gaji,Qty_Lembur,Lembur_Harian,Total_Lembur,Qty_BonusM,Qty_BonusB,Bonus_Minggu,Bonus_Bulan,Total_BonusM,Total_BonusB,Total_Potong,Total_Semua,Catatan,UserID FROM tmp_gaji_detail WHERE No_Gaji=?", [$no_gaji]); + $this->Gaji_Cancel($no_gaji); + } + + private function Gaji_Cancel(string $no_gaji = ""): void { + if (empty($no_gaji)) return; + $this->db->delete("tmp_gaji_detail", "No_Gaji=?", [$no_gaji]); + } + + private function range_minggu(int $bln=1, int $tahun=2010): array { + $nawal = date('W', mktime(0,0,0,$bln,1,$tahun)) - 1; + $nakhir = date('W', mktime(0,0,0,$bln+1,1,$tahun)) * 1; + $amg = []; + if ($nawal > $nakhir) { + $amg[$nawal] = "Minggu ".$nawal; + $nawal = 1; + } + for ($x = $nawal; $x <= $nakhir; $x++) { + $amg[$x] = "Minggu ".$x; + } + return $amg; + } + +} diff --git a/app/Controller/Gel/HutangController.php b/app/Controller/Gel/HutangController.php new file mode 100644 index 0000000..6b008d5 --- /dev/null +++ b/app/Controller/Gel/HutangController.php @@ -0,0 +1,315 @@ +app = $app; + $this->db = $db; + $this->app_gel = (array) $session->get('APP_GEL'); + $this->mode = Param::Get("mode", ""); + $this->mode_detail = Param::Get("mode_detail", ""); + $this->id_sup = Param::Int("SupID", 0); + $this->no_beli = Param::Get("No_Beli", ""); + $this->mode_tampil = Param::Int("Mode_Tampil", 0); + $this->gel = new Gel($app); + } + + public function table_nota() { + $tsql = 'SupID=?'; $asql = [$this->id_sup]; + if ($this->mode_tampil === 0) { + $tsql .= " AND Lunas=0"; + } + + $obj = new Table($this->app); + $obj->set_table("(SELECT No_Beli,Tgl_Beli,Real_Diskon,Real_Beli,Real_Beli+Real_Diskon Sub_Total,IF(Data_Beli=1,'B','R') Tipe,CabID,Lunas FROM inv_beli WHERE ".$tsql.") B LEFT JOIN para_cabang C ON (C.CabID=B.CabID)", "B.*,C.Nama_Cab", "", $asql); + $obj->set_footer("SUM(B.Real_Beli) Real_Beli"); + $obj->add_field("Tipe", "Tipe", "hid"); + $obj->add_field("No_Beli", "No. Trans", "c"); + $obj->add_field("Tgl_Beli", "Tgl. Trans", "c", "sqltgl", "", "val-tgl"); + $obj->add_field("Nama_Cab", "Cabang", "l"); + $obj->add_field("Sub_Total", "Sub. Total", "r", "rupiah", "rupiah"); + $obj->add_field("Real_Diskon", "Diskon", "r", "rupiah"); + $obj->add_field("Real_Beli", "TOTAL", "r", "rupiah", "rupiah"); + if ($this->mode_tampil === 1) $obj->add_field("Lunas", "Lunas", "c", "checkbox"); + $obj->set_field_order("No_Beli", "A"); + $obj->add_row_btn("save", "Pilih", "GELHutangJS.nota_select"); + $this->app->json([ $obj->json_table("divTXNota") ]); + } + + public function table_bayar() { + $ajson = []; + $lunas = (int) Param::Get("Lunas", 0); + if (in_array($this->mode_detail, ["insert","update","delete"])) { + $sql = new SQL($this->app); + $sql->set_table("inv_beli_lunas"); + $sql->add_param("No_Beli"); + $sql->add_param_date("Tgl_Bayar"); + $sql->add_param("Total_Bayar"); + $sql->add_param("Total_Potong"); + $sql->add_param_userid(); + $sql->add_where("ID"); + $sql->add_where("No_Beli", $this->no_beli); + + $tgl_bayar = Param::Get("Tgl_Bayar", "00-00-0000"); + + if ($this->mode_detail === "insert") { + $abeli = $this->db->fetchRow("SELECT CabID,SupID FROM inv_beli WHERE No_Beli=?", [$this->no_beli]) ?? ['CabID'=>0, 'SupID'=>0]; + $sql->add_param("CabID", $abeli['CabID']); + $sql->add_param("SupID", $abeli['SupID']); + $sql->InsertDB(); + $id_bayar = $sql->LastInsertID(); + + // PROSES POSTING GL + if (Param::Get("Tipe_Nota","B")==="B") { + $tcat = "Pembayaran Faktur : "; $ddk = "D"; $kdk = "K"; + } else { + $tcat ="Retur Nota : "; $ddk = "K"; $kdk = "D"; + } + $tot_bayar = (float) Param::Get("Total_Bayar", 0); + $tot_potong = (float) Param::Get("Total_Potong", 0); + $ajurnal = [ + 'Kode_Jurnal' => "", + 'TipeID' => 10, + 'CabID' => $abeli['CabID'], + 'Tanggal' => $tgl_bayar, + 'Kode_Ref' => $this->no_beli, + 'Catatan' => $tcat . Param::Get("Nama_Sup", "") + ]; + $adetail = [ + [ 'Kode_Rek' => $this->app_gel['HUT_USAHA'], 'DK' => $ddk, 'Jumlah' => $tot_bayar+$tot_potong, 'SupID' => $this->id_sup ], + [ 'Kode_Rek' => Param::Get("Kode_Rek", ""), 'DK' => $kdk, 'Jumlah' => $tot_bayar ] + ]; + if ($tot_potong > 0) array_push($adetail, [ 'Kode_Rek' => $this->app_gel['POT_BELI'], 'DK' => $kdk, 'Jumlah' => $tot_potong ]); + $gel_jur = $this->gel->Jurnal_Post($ajurnal, $adetail); + $this->db->update("inv_beli_lunas", ['Kode_Jurnal'=>$gel_jur], "No_Beli=? AND ID=?", [$this->no_beli, $id_bayar]); + + } else if ($this->mode_detail === "delete") { + // PROSES POSTING GL + $gel_jur = $this->db->fetchField("SELECT Kode_Jurnal FROM inv_beli_lunas WHERE No_Beli=? AND ID=?", [$this->no_beli, Param::Get("ID", 0)]) ?? ''; + if (!empty($gel_jur)) { + $this->db->delete("gel_jurnal", "Kode_Jurnal=?", [$gel_jur]); + $this->db->delete("gel_jurnal_detail", "Kode_Jurnal=?", [$gel_jur]); + } + $sql->DeleteDB(); + } + + $anota = $this->db->fetchRow("SELECT SUM(Total_Bayar) Bayar,SUM(Total_Potong) Potong FROM inv_beli_lunas WHERE No_Beli=?", [$this->no_beli]) ?? ['Bayar'=>0, 'Potong'=>0]; + $this->db->runQuery("UPDATE inv_beli SET Total_Bayar=?,Total_Potong=?,Lunas=IF(Real_Beli-Total_Bayar-Total_Potong=0,1,0),Tgl_Lunas=IF(Lunas=1,'".tgl_sql2str($tgl_bayar)."','0000-00-00') WHERE No_Beli=?", [$anota['Bayar'], $anota['Potong'], $this->no_beli]); + $this->gel->Update_Lunas_Sup($this->id_sup); + $anota = $this->db->fetchRow("SELECT Lunas,Real_Beli-Total_Bayar-Total_Potong Total_Sisa FROM inv_beli WHERE No_Beli=?", [$this->no_beli]) ?? ['Lunas'=>0, 'Total_Sisa'=>0]; + $lunas = $anota['Lunas']; + $ajson[] = ['type'=>"form", 'id'=>"Total_Sisa", 'value'=>$anota['Total_Sisa']]; + $ajson[] = ['type'=>"form", 'id'=>"Lunas", 'value'=>$anota['Lunas']]; + } + + $obj = new Table($this->app); + $obj->set_table("inv_beli_lunas", "*", "No_Beli=?", [$this->no_beli]); + $obj->add_field("ID", "ID", "hid"); + $obj->add_field("Tgl_Bayar", "Tgl. Bayar", "c", "sqltgl", "", "val-tgl"); + $obj->add_field("Kode_Jurnal", "Kode Jurnal", "c"); + $obj->add_field("Total_Bayar", "Jumlah Bayar", "r", "rupiah"); + $obj->add_field("Total_Potong", "Pemotongan", "r", "rupiah"); + $obj->set_field_order("Tgl_Bayar", "A"); + if ($this->app->user()->is_level(0) && ($lunas===0 || ($lunas===1 && $this->mode_tampil===1))) { + $obj->add_row_btn("trash", "Hapus", "GELHutangJS.bayar_hapus", "No_Beli", $this->no_beli); + } + if ($lunas === 0) { + $obj->set_func_btn("GELHutangJS.bayar_show", ' Pembayaran'); + } + $ajson[] = $obj->json_table("divDetailBayar"); + $this->app->json($ajson); + } + + public function brow_sup() { + $tcari = Param::Get("Cari_Sup"); + $tsql = 'Lunas>0'; $asql = []; + if (!empty($tcari)) { + $tsql .= " AND CONCAT(Kode_Sup,Nama_Sup,Telp_Sup) LIKE ?"; + $asql[] = '%' . $tcari . '%'; + } + + $obj = new Table($this->app); + $obj->set_table("para_supplier", "*", $tsql, $asql); + $obj->add_field("SupID", "ID", "hid"); + $obj->add_field("Kode_Sup", "Kode", "l"); + $obj->add_field("Nama_Sup", "Nama Supplier", "awr"); + $obj->add_field("Telp_Sup", "Telp", "l"); + $obj->add_field("Alamat_Sup", "Alamat", "hid"); + $obj->set_field_order("Kode_Sup", "A"); + $obj->set_func_select("GELHutangJS.sup_select"); + $this->app->json([ $obj->db_table("divBrowSup") ]); + } + + public function auto_sup() { + $tcari = Param::Get("Auto_Query"); + $ajson['autodata'] = []; + $stat = $this->db->runQuery("SELECT * FROM para_supplier WHERE Lunas>0 AND CONCAT(Kode_Sup,Nama_Sup,Telp_Sup) LIKE ? ORDER BY Kode_Sup LIMIT 50", ['%'.$tcari.'%']); + while ($row = $stat->fetch(SimplePdo::FETCH_ASSOC)) { + $ajson['autodata'][] = ['value'=>$row['SupID'], 'text'=>$row['Nama_Sup'], 'html'=>''.$row['Kode_Sup'].' '.$row['Nama_Sup'], 'data'=>$row['Alamat_Sup'], 'bc'=>0]; + } + $this->app->json($ajson); + } + + public function form_master() { + $ajson = [ 'error'=>"", 'html'=>"" ]; + $atabel = [ 'SupID'=>0, 'Nama_Sup'=>"", 'Alamat_Sup'=>"" ]; + + $form = new Form($this->app); + $tsup = $form->textauto("_", "Nama_Sup", ['value'=>$atabel['SupID'],'text'=>$atabel['Nama_Sup']], true, false, "ketik nama supplier"); + $tsupal = $form->textbox("_", "Alamat_Sup", $atabel['Alamat_Sup'], false, false, "text"); + $ajson['html'] = ' +
+ +
'.$tsup.'
+
+
+ +
'.$tsupal.'
+
+

+ + '; + $this->app->json($ajson); + } + + public function form_nota() { + $tipe = Param::Get("Tipe_Nota", "B"); + $atabel = [ 'No_Beli'=>$this->no_beli ]; + if (!empty($this->no_beli)) { + $atabel = $this->db->fetchRow("SELECT *,Real_Beli+Real_Diskon Sub_Total,Real_Beli-Total_Bayar-Total_Potong Sisa_Bayar FROM inv_beli WHERE No_Beli=?", [$this->no_beli]); + } + + $form = new Form($this->app); + $tnota = $form->textbox("_", "No_Beli", $atabel['No_Beli'], false, false, "text"); + $tfaktur = $form->textbox("_", "No_Faktur", $atabel['No_Faktur'], false, false, "text"); + $ttglnota = $form->datebox("_", "Tgl_Beli", $atabel['Tgl_Beli'], false, false); + $ttglfaktur = $form->datebox("_", "Tgl_Faktur", $atabel['Tgl_Faktur'], false, false); + $tsubtot = $form->textbox("_", "Real_Beli", $atabel['Sub_Total'], false, false, "double"); + $tdiskon = $form->textbox("_", "Ral_Diskon", $atabel['Real_Diskon'], false, false, "double"); + $tjumlah = $form->textbox("_", "Jumlah", $atabel['Real_Beli'], false, false, "double"); + $ajson['html'] = ' +
+
Informasi Faktur / Retur
+
+
+ +
'.$tnota.'
+ +
'.$tsubtot.'
+
+
+ +
'.$tfaktur.'
+ +
'.$tdiskon.'
+
+
+ +
'.$ttglnota.'
+ +
'.$tjumlah.'
+
+
+ +
'.$ttglfaktur.'
+
+

+ + + '; + $this->app->json($ajson); + } + + public function form_bayar() { + $form = new Form($this->app); + $ttglbyr = $form->datebox("_", "Tgl_Bayar", tgl_ymd(), true, false); + $trek = $form->option_db("_", "Kode_Rek", $this->app_gel['KAS_TUNAI'], true, false, "vi_gel_acc", ["Kode_Rek","Nama_Lengkap"], "Kas_Rek=1 AND Aktif=1 AND Mode='D' ORDER BY Kode_Rek"); + $ttotal = $form->textbox("_", "Temp_Total", Param::Get("Total_Sisa",0), false, false, "double"); + $tbayar = $form->textbox("_", "Total_Bayar", Param::Get("Total_Sisa",0), true, false, "double"); + $tpotong = $form->textbox("_", "Total_Potong", 0, true, false, "double"); + $ajson['html'] = ' +
+ +
'.$ttglbyr.'
+
+
+ +
'.$trek.'
+
+

+
+ +
'.$ttotal.'
+
+
+ +
'.$tbayar.'
+
+
+ +
'.$tpotong.'
+
'; + $this->app->json($ajson); + } + + public function index() { + $this->app->json(['html' => ' +
+
+ +
+
+
 
+
 
+
 
+
 
+
+
+
+
' + ]); + } +} diff --git a/app/Controller/Gel/KaryaController.php b/app/Controller/Gel/KaryaController.php new file mode 100644 index 0000000..789213d --- /dev/null +++ b/app/Controller/Gel/KaryaController.php @@ -0,0 +1,252 @@ +app = $app; + $this->db = $db; + $this->app_gel = (array) $session->get('APP_GEL'); + $this->mode = Param::Get("mode", ""); + $this->mode_detail = Param::Get("mode_detail", ""); + $this->id_karya = Param::Int("KaryaID", 0); + $this->is_pinjam = Param::Int("is_pinjam", 0); + $this->no_trans = Param::Get("No_Trans", ""); + $this->gel = new Gel($app); + } + + public function table_karya() { + if (in_array($this->mode_detail, ["insert","update","delete"])) { + $sql = new SQL($this->app); + $sql->set_table("gel_karyawan"); + $sql->add_param_date("Tgl_Trans"); + $sql->add_param("Catatan"); + $sql->add_param_userid(); + $sql->add_where("No_Trans", $this->no_trans); + + $tgl_trans = Param::Get("Tgl_Trans"); + if ($this->mode_detail === "insert") { + $this->no_trans = $this->gel->Karya_Baru($tgl_trans); + $sql->add_param("No_Trans", $this->no_trans); + $sql->add_param("KaryaID"); + + // PROSES POSTING GL + if ($this->is_pinjam === 1) { + $sql->add_param("Total_Pinjam"); + $tcat = "Pinjaman Karyawan : "; $ddk = "D"; $kdk = "K"; + } else { + $sql->add_param("Total_Bayar"); + $tcat = "Pembayaran Karyawan : "; $ddk = "K"; $kdk = "D"; + } + $sql->InsertDB(); + + $tot_jumlah = (float) Param::Get("Total_Bayar", 0) + (float) Param::Get("Total_Pinjam", 0); + $ajurnal = [ + 'TipeID' => 13, + 'Tanggal' => $tgl_trans, + 'Kode_Ref' => $this->no_trans, + 'Catatan' => $tcat.(string) Param::Get("Nama_Karya").", Untuk : ".(string) Param::Get("Catatan") + ]; + $adetail = []; + $adetail[] = [ + 'Kode_Rek' => $this->app_gel['PIU_KARYA'], + 'DK' => $ddk, + 'Jumlah' => $tot_jumlah + ]; + $adetail[] = [ + 'Kode_Rek' => (string) Param::Get("Kode_Rek"), + 'DK' => $kdk, + 'Jumlah' => $tot_jumlah + ]; + $kode_jurnal = $this->gel->Jurnal_Post($ajurnal, $adetail); + $this->db->update("gel_karyawan", [ 'Kode_Jurnal'=>$kode_jurnal ], "No_Trans=?", [ $this->no_trans ]); + + } else if ($this->mode_detail === "delete") { + $sql->DeleteDB(); + // PROSES POSTING GL + $kode_jurnal = $this->db->fetchField("SELECT Kode_Jurnal FROM gel_karyawan WHERE No_Trans=?", [ $this->no_trans ]) ?? ''; + if (!empty($kode_jurnal)) { + $this->db->delete("gel_jurnal", "Kode_Jurnal=?", [ $kode_jurnal ]); + $this->db->delete("gel_jurnal_detail", "Kode_Jurnal=?", [ $kode_jurnal ]); + } + } + + $ipinjam = (float) $this->db->fetchField("SELECT SUM(Total_Pinjam-Total_Bayar) FROM gel_karyawan WHERE KaryaID=?", [ $this->id_karya ]) ?? 0; + $this->db->update("para_karyawan", ['Total_Pinjam'=>$ipinjam], "KaryaID=?", [ $this->id_karya ]); + } + + $obj = new Table($this->app); + $obj->set_table("gel_karyawan", "*", "KaryaID=?", [ $this->id_karya ]); + $obj->set_footer("SUM(Total_Pinjam) Total_Pinjam,SUM(Total_Bayar) Total_Bayar"); + $obj->add_field("No_Trans", "No. Trans", "c"); + $obj->add_field("Tgl_Trans", "Tgl. Trans", "c", "sqltgl", "", "val-tgl"); + $obj->add_field("Kode_Jurnal", "Kode Jurnal", "c"); + $obj->add_field("Total_Pinjam", "Pinjaman", "r", "rupiah", "rupiah"); + $obj->add_field("Total_Bayar", "Setoran", "r", "rupiah", "rupiah"); + $obj->add_field("Catatan", "Catatan", "awr"); + $obj->set_field_order("Tgl_Trans", "A"); + $obj->add_row_btn("trash", "Hapus", "GELKaryaJS.karya_hapus", "Kunci", 0); + $this->app->json([ $obj->json_table("divTXKarya") ]); + } + + public function form_master() { + $ajson = [ 'error'=>"", 'html'=>"" ]; + $atabel = ['KaryaID'=>0, 'Total_Pinjam'=>0, 'Tot_Pinjam'=>0, 'Tot_Bayar'=>0]; + + if ($this->id_karya > 0) { + $row = $this->db->fetchRow("SELECT * FROM para_karyawan WHERE KaryaID=?", [ $this->id_karya ]); + if ($row) { + $atabel = $row->getData(); + if ((int) $atabel['KaryaID'] > 0) { + $_tot = $this->db->fetchRow("SELECT SUM(Total_Pinjam) Tot_Pinjam,SUM(Total_Bayar) Tot_Bayar FROM gel_karyawan WHERE KaryaID=?", [ $atabel['KaryaID'] ]); + if ($_tot) $atabel = array_merge($atabel, $_tot->getData()); + } + } else { + $ajson['error'] = "Nomor Transaksi belum ada / tidak diketemukan !"; + } + } + $ket_saldo = ((float) $atabel['Total_Pinjam'] > 0) ? "Saldo Pinjaman" : "Saldo Simpanan"; + + $form = new Form($this->app); + $tkary = $form->option_db("_", "KaryaID", $atabel['KaryaID'], true, false, "para_karyawan", ["KaryaID","Nama_Karya"], "Aktif=1 ORDER BY Nama_Karya", null, null, "GELKaryaJS.ocKarya"); + $ttot_pin = ''; + $ttot_bay = ''; + $tpinjam = ''; + $ajson['html'] = ' +
+
+
+ +
'.$tkary.'
+
+
+ +
'.$tpinjam.'
+
+
+
+
+ +
'.$ttot_pin.'
+
+
+ +
'.$ttot_bay.'
+
+
+
+

'; + $this->app->json($ajson); + } + + public function form_pinjam() { + $form = new Form($this->app); + $ttgltran = $form->datebox("_", "Tgl_Trans", tgl_ymd(), true, false); + $trek = $form->option_db("_", "Kode_Rek", $this->app_gel['KAS_TUNAI'], true, false, "vi_gel_acc", ["Kode_Rek","Nama_Lengkap"], "Kas_Rek=1 AND Aktif=1 AND Mode='D' ORDER BY Kode_Rek"); + $tpinjam = $form->textbox("_", "Total_Pinjam", 0, true, false, "double"); + $tcatat = $form->textarea("_", "Catatan", "", true, false, 2); + $ajson['html'] = ' +
+ +
'.$ttgltran.'
+
+
+ +
'.$trek.'
+
+
+ +
'.$tpinjam.'
+
+
+ +
'.$tcatat.'
+
'; + $this->app->json($ajson); + } + + public function form_bayar() { + $form = new Form($this->app); + $ttgltran = $form->datebox("_", "Tgl_Trans", tgl_ymd(), true, false); + $trek = $form->option_db("_", "Kode_Rek", $this->app_gel['KAS_TUNAI'], true, false, "vi_gel_acc", ["Kode_Rek","Nama_Lengkap"], "Kas_Rek=1 AND Aktif=1 AND Mode='D' ORDER BY Kode_Rek"); + $tbayar = $form->textbox("_", "Total_Bayar", 0, true, false, "double"); + $tcatat = $form->textarea("_", "Catatan", "", true, false, 2); + $ajson['html'] = ' +
+ +
'.$ttgltran.'
+
+
+ +
'.$trek.'
+
+
+ +
'.$tbayar.'
+
+
+ +
'.$tcatat.'
+
'; + $this->app->json($ajson); + } + + public function index() { + $this->app->json(['html' => ' +
+
+ +
+
+
 
+
 
+
+
+
+
' + ]); + } + +} diff --git a/app/Controller/Gel/KeluarController.php b/app/Controller/Gel/KeluarController.php new file mode 100644 index 0000000..cbaf22c --- /dev/null +++ b/app/Controller/Gel/KeluarController.php @@ -0,0 +1,302 @@ +app = $app; + $this->db = $db; + $this->web_app = (array) $session->get('WEB_APP'); + $this->app_gel = (array) $session->get('APP_GEL'); + $this->id_cab = Param::Int("CabID", $session->get('APP_INV')['CABANGID']); + $this->mode = Param::Get("mode", ""); + $this->mode_detail = Param::Get("mode_detail", ""); + $this->kode_jurnal = Param::Get("Kode_Jurnal", ""); + $this->kode_rek = Param::Get("Kode_Rek", ""); + $this->gel = new Gel($app); + } + + public function table_detail() { + if (in_array($this->mode_detail, ["insert","update","delete"])) { + $sql = new SQL($this->app); + $sql->set_table("tmp_gel_jurnal_detail"); + $sql->add_param("Kode_Rek"); + $sql->add_param("DK", "K"); + $sql->add_param("Jumlah"); + $sql->add_param_unix(); + $sql->add_param_userid(); + $sql->add_where("Kode_Jurnal"); + $sql->add_where("ID"); + + if ($this->mode_detail === "insert") { + $sql->add_param("Kode_Jurnal"); + $sql->InsertDB(); + } else if ($this->mode_detail === "update") { + $sql->UpdateDB(); + } else if ($this->mode_detail === "delete") { + $sql->DeleteDB(); + } + } + + $tsql = ''; $asql = [$this->kode_jurnal, "D"]; $qtabel = "gel_jurnal_detail"; + if (in_array($this->mode, ["add","edit"])) { + if ($this->mode === "add") { $tsql = " AND Unix=?"; $asql[] = $this->app->user()->unix(); } + $qtabel = "tmp_gel_jurnal_detail"; + } + + $obj = new Table($this->app); + $obj->set_table("(SELECT * FROM ".$qtabel." WHERE Kode_Jurnal=? AND DK=?".$tsql.") D LEFT JOIN gel_acc A ON (D.Kode_Rek=A.Kode_Rek)", "D.*,D.Jumlah Jumlah2,A.Nama_Rek", "", $asql); + $obj->set_footer("SUM(Jumlah) Jumlah2, COUNT(*) Kode_Rek"); + $obj->add_field("ID", "ID", "hid"); + $obj->add_field("Kode_Rek", "Kode", "c", "", "records"); + $obj->add_field("Nama_Rek", "Rekening Debit", "awr"); + $obj->add_field("Jumlah2", "Jumlah", "r", "kurung", "kurung"); + $obj->set_field_order("Kode_Rek", "A"); + if (in_array($this->mode, ["add","edit"])) { + $obj->add_row_btn("clipboard", "Ubah", "GELKeluarJS.detail_ubah"); + $obj->add_row_btn("trash", "Hapus", "GELKeluarJS.detail_hapus", "Unix", $this->app->user()->unix()); + $obj->set_func_btn("GELKeluarJS.detail_tambah", ' Rekening'); + $obj->set_func_btn("GELKeluarJS.rek_brow", ' Browse'); + } + + $nitems = (int) $this->db->fetchField("SELECT COUNT(*) FROM ".$qtabel." WHERE Kode_Jurnal=? AND DK=?".$tsql, $asql) ?? 0; + $this->app->json([ $obj->json_table("divDetailTabel"), ['type'=>"form", 'id'=>"Total_Item", 'value'=>$nitems] ]); + } + + public function brow_tx() { + $tcari = Param::Get("Cari_TX"); + $tsql = 'TipeID=3'; $asql = []; + if (!empty($tcari)) { + $tsql .= " AND CONCAT(Kode_Jurnal,DATE_FORMAT(Tanggal,'%d-%m-%Y'),Kode_Ref,Catatan) LIKE ?"; + $asql[] = '%' . $tcari . '%'; + } + + $obj = new Table($this->app); + $obj->set_table("gel_jurnal", "*", $tsql, $asql); + $obj->add_field("Kode_Jurnal", "Kode Jurnal", "c"); + $obj->add_field("Tanggal", "Tanggal", "c", "sqltgl", "", "val-tgl"); + $obj->add_field("Kode_Ref", "Kode Ref.", "l"); + $obj->add_field("Catatan", "Deskripsi", "awr"); + $obj->set_field_order("Kode_Jurnal", "D"); + $obj->set_func_select("GELKeluarJS.tx_select"); + $this->app->json([ $obj->db_table("divBrowTX") ]); + } + + public function brow_rek() { + $tcari = Param::Get("Cari_Rek"); + $tsql = 'Aktif=1 AND Mode="D"'; $asql = []; + if (!empty($tcari)) { + $tsql .= " AND CONCAT(Kode_Rek,Nama_Rek) LIKE ?"; + $asql[] = '%' . $tcari . '%'; + } + + $obj = new Table($this->app); + $obj->set_table("gel_acc", "*", $tsql, $asql); + $obj->add_field("Kode_Rek", "Kode", "c"); + $obj->add_field("Nama_Rek", "Nama Rekening", "awr"); + $obj->add_field("Level", "Level", "c"); + $obj->set_field_order("Kode_Rek", "A"); + $obj->set_func_select("GELKeluarJS.rek_select"); + $this->app->json([ $obj->db_table("divBrowRek") ]); + } + + public function auto_rek() { + $tcari = Param::Get("Auto_Query"); + $ajson['autodata'] = []; + $stat = $this->db->runQuery("SELECT Kode_Rek,Nama_Rek,CONCAT(Kode_Rek,' - ',Nama_Rek) Nama_Lengkap FROM gel_acc WHERE Aktif=1 AND Mode='D' AND CONCAT(Kode_Rek,Nama_Rek) LIKE ? ORDER BY Kode_Rek LIMIT 50", ['%'.$tcari.'%']); + while ($row = $stat->fetch(SimplePdo::FETCH_ASSOC)) { + $ajson['autodata'][] = ['value'=>$row['Kode_Rek'], 'text'=>$row['Nama_Rek'], 'html'=>''.$row['Kode_Rek'].' '.$row['Nama_Rek'], 'data'=>"", 'bc'=>0]; + } + $this->app->json($ajson); + } + + public function form_master() { + $ajson = [ 'error'=>"", 'html'=>"" ]; + $atabel = [ 'Kode_Jurnal'=>"", 'CabID'=>$this->id_cab, 'Kode_Ref'=>"", 'Tanggal'=>tgl_ymd(), 'Kode_Kas'=>"", 'Catatan'=>"" ]; + + if ($this->mode === "add") { + $atabel['Kode_Jurnal'] = "GK-BARU#".(string) $this->web_app['SERVER_ID']. $this->app->user()->id(3); + $atabel['Tanggal'] = tgl_ymd(); + $atabel['Kode_Kas'] = $this->app_gel['KAS_TUNAI']; + $this->kode_jurnal = ""; + + } else if ($this->mode === "edit") { + $this->gel->Detail_Copy($this->kode_jurnal); + + } else if ($this->mode === "save") { + $no_lama = $this->kode_jurnal; + $tgl_jurn = Param::Get("Tanggal"); + $b_baru = str_contains($no_lama, "BARU"); + if ($b_baru) $this->kode_jurnal = $this->gel->Jurnal_Baru($this->id_cab, $tgl_jurn, true); + + $kode_kas = Param::Get("Kode_Kas"); + $this->db->runQuery("DELETE FROM tmp_gel_jurnal_detail WHERE Kode_Jurnal='".$no_lama."' AND LEFT(Kode_Rek,1)='1' AND DK='K'"); + $ntot_kas = $this->db->fetchField("SELECT SUM(-Jumlah) FROM tmp_gel_jurnal_detail WHERE Kode_Jurnal=? AND Unix=?", [$no_lama, $this->app->user()->unix()]) ?? 0; + $this->db->insert("tmp_gel_jurnal_detail", [ 'Kode_Jurnal'=>$no_lama, 'Kode_Rek'=>$kode_kas, 'DK'=>'K', 'Jumlah'=>$ntot_kas,'Unix'=>$this->app->user()->unix(), 'UserID'=>$this->app->user()->id() ]); + $this->gel->Detail_Save($this->kode_jurnal, 3, $this->id_cab, $tgl_jurn, $b_baru, $no_lama); + $this->gel->Jurnal_Save($this->kode_jurnal, 3, $this->id_cab, $tgl_jurn, Param::Get("Kode_Ref"), Param::Get("Catatan")); + $atabel['Tanggal'] = $tgl_jurn; + $this->mode = "view"; + + } else if ($this->mode === "cancel") { + $this->gel->Detail_Cancel($this->kode_jurnal); + $this->mode = "view"; + $this->kode_jurnal = ""; + } + + if (!empty($this->kode_jurnal) && $this->mode !== "cancel") { + $row = $this->db->fetchRow("SELECT * FROM gel_jurnal WHERE Kode_Jurnal='".$this->kode_jurnal."' AND TipeID=3"); + if ($row) { + $atabel = $row; + $atabel['Kode_Kas'] = $this->db->fetchField("SELECT Kode_Rek FROM gel_jurnal_detail WHERE Kode_Jurnal='".$atabel['Kode_Jurnal']."' AND DK='K' LIMIT 1") ?? ''; + } else { + $ajson['error'] = "Nomor Transaksi belum ada / tidak diketemukan !"; + } + } + + $enable = in_array($this->mode, ["add","edit"]) ? true : false; + $form = new Form($this->app); + $tkode = $form->textbox("_", "Kode_Jurnal", $atabel['Kode_Jurnal'], !$enable, false, "text", "kode jurnal"); + $tref = $form->textbox("_", "Kode_Ref", $atabel['Kode_Ref'], $enable, false, "text", "kode referensi"); + $ttgl = $form->datebox("_", "Tanggal", $atabel['Tanggal'], $enable, false); + $tcab = $form->option_db("_", "CabID", $atabel['CabID'], $enable, false, "para_cabang", ["CabID","Nama_Cab"], "Aktif=1 ORDER BY CabID"); + $tkas = $form->option_db("_", "Kode_Kas", $atabel['Kode_Kas'], $enable, false, "vi_gel_acc", ["Kode_Rek","Nama_Lengkap"], "Kas_Rek=1 AND Aktif=1 AND Mode='D' ORDER BY Kode_Rek"); + $tcatat = $form->textbox("_", "Catatan", stripslashes($atabel['Catatan']), $enable, false, "text", "catatan jurnal"); + $ajson['html'] = ' +
+
+
+ +
'.$tkode.'
+
+
+ +
'.$ttgl.'
+
+
+
+
+ +
'.$tcab.'
+
+
+ +
'.$tref.'
+
+
+
+
+ +
'.$tcatat.'
+
+
+ +
'.$tkas.'
+
+

+ + '; + $this->app->json($ajson); + } + + public function form_rek() { + $id = (int) Param::Get("ID", 0); + $atabel = [ 'ID'=>$id, 'Kode_Rek'=>$this->kode_rek, 'Nama_Rek'=>"", 'Jumlah'=>0 ]; + if ($id > 0) { + $atabel = $this->db->fetchRow("SELECT * FROM tmp_gel_jurnal_detail WHERE Kode_Jurnal=? AND ID=?", [$this->kode_jurnal, $id]); + } + if (!empty($atabel['Kode_Rek'])) { + $atabel['Nama_Rek'] = $this->db->fetchField("SELECT Nama_Rek FROM gel_acc WHERE Kode_Rek=?", [$atabel['Kode_Rek']]) ?? ''; + } + + $form = new Form($this->app); + $tkode = $form->textbox("_", "Kode_Rek", $atabel['Kode_Rek'], false, false, "text"); + $tnama = $form->textauto("_", "Nama_Rek", ['value'=>$atabel['Kode_Rek'],'text'=>$atabel['Nama_Rek']], true, true, "ketik kode / nama rekening"); + $tjumlah = $form->textbox("_", "Jumlah", abs($atabel['Jumlah']), true, true, "double"); + + $ajson['html'] = ' +
+ +
'.$tkode.'
+
+
+ +
'.$tnama.'
+
+
+ +
'.$tjumlah.'
+
+ + '; + $this->app->json($ajson); + } + + public function proses_hapus() { + $this->db->runQuery("DELETE FROM gel_jurnal WHERE Kode_Jurnal='".$this->kode_jurnal."'"); + $this->db->runQuery("DELETE FROM gel_jurnal_detail WHERE Kode_Jurnal='".$this->kode_jurnal."'"); + $this->app->json([ 'status' => true ]); + } + + public function index() { + $this->app->json(['html' => ' +
+
+ +
+
+
 
+
 
+
+
+
+
' + ]); + } +} diff --git a/app/Controller/Gel/PiutangController.php b/app/Controller/Gel/PiutangController.php new file mode 100644 index 0000000..4d6f007 --- /dev/null +++ b/app/Controller/Gel/PiutangController.php @@ -0,0 +1,329 @@ +app = $app; + $this->db = $db; + $this->app_gel = (array) $session->get('APP_GEL'); + $this->mode = Param::Get("mode", ""); + $this->mode_detail = Param::Get("mode_detail", ""); + $this->id_buyer = Param::Int("MemberID", 0); + $this->no_jual = Param::Get("No_Jual", ""); + $this->mode_tampil = Param::Int("Mode_Tampil", 0); + $this->gel = new Gel($app); + } + + public function table_nota() { + $tsql = 'FALSE'; $asql = []; + if ($this->id_buyer > 0) { + $tsql = 'MemberID=?'; + $asql[] = $this->id_buyer; + if ($this->mode_tampil === 0) { + $tsql .= " AND Lunas=0"; + } + } + + $obj = new Table($this->app); + $obj->set_table("(SELECT No_Jual,Tgl_Jual,Total_Jual,Total_Diskon,Total_Jual-Total_Diskon Total,Total_Bayar+Total_Potong Bayar,Total_Jual-Total_Diskon-Total_Bayar-Total_Potong Sisa,IF(Data_Jual=1,'J','R') Tipe,CabID,Lunas FROM inv_jual WHERE ".$tsql.") J LEFT JOIN para_cabang C ON (C.CabID=J.CabID)", "J.*,C.Nama_Cab", "", $asql); + $obj->set_footer("SUM(J.Total) Total,SUM(J.Bayar) Bayar,SUM(J.Sisa) Sisa"); + $obj->add_field("Tipe", "Tipe", "hid"); + $obj->add_field("No_Jual", "No. Trans", "c"); + $obj->add_field("Tgl_Jual", "Tgl. Trans", "c", "sqltgl", "", "val-tgl"); + $obj->add_field("Nama_Cab", "Cabang", "l"); + $obj->add_field("Total_Jual", "Sub. Total", "r", "rupiah", "rupiah"); + $obj->add_field("Total_Diskon", "Diskon", "r", "rupiah"); + $obj->add_field("Total", "TOTAL", "r", "rupiah", "rupiah"); + $obj->add_field("Bayar", "BAYAR", "r", "rupiah", "rupiah"); + $obj->add_field("Sisa", "SISA", "r", "rupiah", "rupiah"); + if ($this->mode_tampil === 1) $obj->add_field("Lunas", "Lunas", "c", "checkbox"); + $obj->set_field_order("No_Jual", "A"); + $obj->add_row_btn("save", "Pilih", "GELPiutangJS.nota_select"); + $this->app->json([ $obj->json_table("divTXNota") ]); + } + + public function table_bayar() { + $ajson = []; + $lunas = (int) Param::Get("Lunas", 0); + if (in_array($this->mode_detail, ["insert","update","delete"])) { + $sql = new SQL($this->app); + $sql->set_table("inv_jual_lunas"); + $sql->add_param("No_Jual"); + $sql->add_param_date("Tgl_Bayar"); + $sql->add_param("Total_Bayar"); + $sql->add_param("Total_Potong"); + $sql->add_param_userid(); + $sql->add_where("ID"); + $sql->add_where("No_Jual", $this->no_jual); + + $tgl_bayar = Param::Get("Tgl_Bayar", "00-00-0000"); + + if ($this->mode_detail === "insert") { + $ajual = $this->db->fetchRow("SELECT CabID,MemberID FROM inv_jual WHERE No_Jual=?", [$this->no_jual]) ?? ['CabID'=>0, 'MemberID'=>0]; + $sql->add_param("CabID", $ajual['CabID']); + $sql->add_param("MemberID", $ajual['MemberID']); + $sql->InsertDB(); + $id_bayar = $sql->LastInsertID(); + + // PROSES POSTING GL + if (Param::Get("Tipe_Nota","J")==="J") { + $tcat = "Penerimaan Nota : "; $ddk = "D"; $kdk = "K"; + } else { + $tcat ="Retur Nota : "; $ddk = "K"; $kdk = "D"; + } + $tot_bayar = (float) Param::Get("Total_Bayar", 0); + $tot_potong = (float) Param::Get("Total_Potong", 0); + $ajurnal = [ + 'Kode_Jurnal' => "", + 'TipeID' => 11, + 'CabID' => $ajual['CabID'], + 'Tanggal' => $tgl_bayar, + 'Kode_Ref' => $this->no_jual, + 'Catatan' => $tcat . Param::Get("Nama_Member", "") + ]; + $adetail = [ + [ 'Kode_Rek' => Param::Get("Kode_Rek", ""), 'DK' => $ddk, 'Jumlah' => $tot_bayar ], + [ 'Kode_Rek' => $this->app_gel['PIU_USAHA'], 'DK' => $kdk, 'Jumlah' => $tot_bayar+$tot_potong, 'MemberID' => $this->id_buyer ] + ]; + if ($tot_potong > 0) array_push($adetail, [ 'Kode_Rek' => $this->app_gel['POT_JUAL'], 'DK' => $ddk, 'Jumlah' => $tot_potong ]); + $gel_jur = $this->gel->Jurnal_Post($ajurnal, $adetail); + $this->db->update("inv_jual_lunas", ['Kode_Jurnal'=>$gel_jur], "No_Jual=? AND ID=?", [$this->no_jual, $id_bayar]); + + } else if ($this->mode_detail === "delete") { + // PROSES POSTING GL + $gel_jur = $this->db->fetchField("SELECT Kode_Jurnal FROM inv_jual_lunas WHERE No_Jual=? AND ID=?", [$this->no_jual, Param::Get("ID", 0)]) ?? ''; + if (!empty($gel_jur)) { + $this->db->delete("gel_jurnal", "Kode_Jurnal=?", [$gel_jur]); + $this->db->delete("gel_jurnal_detail", "Kode_Jurnal=?", [$gel_jur]); + } + $sql->DeleteDB(); + } + + $anota = $this->db->fetchRow("SELECT SUM(Total_Bayar) Bayar,SUM(Total_Potong) Potong FROM inv_jual_lunas WHERE No_Jual=?", [$this->no_jual]) ?? ['Bayar'=>0, 'Potong'=>0]; + $this->db->runQuery("UPDATE inv_jual SET Total_Bayar=?,Total_Potong=?,Lunas=IF(Total_Jual-Total_Diskon-Total_Bayar-Total_Potong=0,1,0),Tgl_Lunas=IF(Lunas=1,'".tgl_sql2str($tgl_bayar)."','0000-00-00') WHERE No_Jual=?", [$anota['Bayar'], $anota['Potong'], $this->no_jual]); + //UPDATE POINT UNTUK LUNAS +10 HARI + $this->db->runQuery("UPDATE inv_jual SET Point=IF(Tgl_Lunas<=(Tgl_Jual+INTERVAL 10 DAY),Point,0) WHERE No_Jual=?", [$this->no_jual]); + $this->gel->Update_Lunas_Buy($this->id_buyer); + $anota = $this->db->fetchRow("SELECT Lunas,Total_Jual-Total_Diskon-Total_Bayar-Total_Potong Total_Sisa FROM inv_jual WHERE No_Jual=?", [$this->no_jual]) ?? ['Lunas'=>0, 'Total_Sisa'=>0]; + $lunas = $anota['Lunas']; + $ajson[] = ['type'=>"form", 'id'=>"Total_Sisa", 'value'=>$anota['Total_Sisa']]; + $ajson[] = ['type'=>"form", 'id'=>"Lunas", 'value'=>$anota['Lunas']]; + } + + $obj = new Table($this->app); + $obj->set_table("inv_jual_lunas", "*", "No_Jual=?", [$this->no_jual]); + $obj->add_field("ID", "ID", "hid"); + $obj->add_field("Tgl_Bayar", "Tgl. Bayar", "c", "sqltgl", "", "val-tgl"); + $obj->add_field("Kode_Jurnal", "Kode Jurnal", "c"); + $obj->add_field("Total_Bayar", "Jumlah Bayar", "r", "rupiah"); + $obj->add_field("Total_Potong", "Pemotongan", "r", "rupiah"); + $obj->set_field_order("Tgl_Bayar", "A"); + if ($this->app->user()->is_level(0) && ($lunas===0 || ($lunas===1 && $this->mode_tampil===1))) { + $obj->add_row_btn("trash", "Hapus", "GELPiutangJS.bayar_hapus", "No_Jual", $this->no_jual); + } + if ($lunas === 0) { + $obj->set_func_btn("GELPiutangJS.bayar_show", ' Pembayaran'); + } + $ajson[] = $obj->json_table("divDetailBayar"); + $this->app->json($ajson); + } + + public function brow_buyer() { + $tcari = Param::Get("Cari_Buyer"); + $tsql = 'Lunas>0'; $asql = []; + if (!empty($tcari)) { + $tsql .= " AND CONCAT(Kode_Member,Nama_Member,Alamat_Member) LIKE ?"; + $asql[] = '%' . $tcari . '%'; + } + + $obj = new Table($this->app); + $obj->set_table("para_member", "*", $tsql, $asql); + $obj->add_field("MemberID", "ID", "hid"); + $obj->add_field("Kode_Member", "Kode", "l"); + $obj->add_field("Nama_Member", "Nama Member", "awr"); + $obj->add_field("Alamat_Member", "Alamat", "awr"); + $obj->add_field("Kota_Member", "Kota", "awr"); + $obj->set_field_order("Nama_Member", "A"); + $obj->set_func_select("GELPiutangJS.buyer_select"); + $this->app->json([ $obj->db_table("divBrowBuyer") ]); + } + + public function auto_buyer() { + $tcari = Param::Get("Auto_Query"); + $ajson['autodata'] = []; + $stat = $this->db->runQuery("SELECT MemberID,Kode_Member,Nama_Member,CONCAT(Alamat_Member,_latin1', ',Kota_Member) Alamat_Kota FROM para_member WHERE Lunas>0 AND CONCAT(Kode_Member,Nama_Member,Alamat_Member) LIKE ? ORDER BY Nama_Member LIMIT 50", ['%'.$tcari.'%']); + while ($row = $stat->fetch(SimplePdo::FETCH_ASSOC)) { + $ajson['autodata'][] = ['value'=>$row['MemberID'], 'text'=>$row['Nama_Member'], 'html'=>''.$row['Kode_Member'].' '.$row['Nama_Member'], 'data'=>$row['Alamat_Kota'], 'bc'=>0]; + } + $this->app->json($ajson); + } + + public function form_master() { + $ajson = [ 'error'=>"", 'html'=>"" ]; + $atabel = [ 'MemberID'=>0, 'Nama_Member'=>"", 'Alamat_Member'=>"" ]; + + $form = new Form($this->app); + $tmemb = $form->textauto("_", "Nama_Member", ['value'=>$atabel['MemberID'],'text'=>$atabel['Nama_Member']], true, false, "ketik nama member"); + $tmembal = $form->textbox("_", "Alamat_Member", $atabel['Alamat_Member'], false, false, "text"); + $ajson['html'] = ' +
+ +
'.$tmemb.'
+
+
+ +
'.$tmembal.'
+
+

+ + '; + $this->app->json($ajson); + } + + public function form_nota() { + $tipe = Param::Get("Tipe_Nota", "J"); + $atabel = [ 'No_Jual'=>$this->no_jual, 'Nama_Operator'=>"" ]; + if (!empty($this->no_jual)) { + $atabel = $this->db->fetchRow("SELECT *,Total_Jual-Total_Diskon Jumlah,Total_Jual-Total_Diskon-Total_Bayar-Total_Potong Sisa_Bayar FROM inv_jual WHERE No_Jual=?", [$this->no_jual]); + if ((int) $atabel['UserID'] > 0) { + $atabel['Nama_Operator'] = $this->db->fetchField("SELECT Nama FROM app_operator WHERE UserID=?", [$atabel['UserID']]) ?? ''; + } + } + + $form = new Form($this->app); + $tnota = $form->textbox("_", "No_Jual", $atabel['No_Jual'], false, false, "text"); + $ttglnota = $form->datebox("_", "Tgl_Jual", $atabel['Tgl_Jual'], false, false); + $tsubtot = $form->textbox("_", "Total_Jual", $atabel['Total_Jual'], false, false, "double"); + $tdiskon = $form->textbox("_", "Total_Diskon", $atabel['Total_Diskon'], false, false, "double"); + $tjumlah = $form->textbox("_", "Jumlah", $atabel['Jumlah'], false, false, "double"); + $tbayar = $form->textbox("_", "V_Bayar", $atabel['Total_Bayar']+$atabel['Total_Potong'], false, false, "double"); + $tsisa = $form->textbox("_", "V_Sisa", $atabel['Sisa_Bayar'], false, false, "double"); + $toper = $form->textbox("_", "V_Ope", $atabel['Nama_Operator'], false, false, "text"); + $ajson['html'] = ' +
+
Informasi Faktur / Retur
+
+
+ +
'.$tnota.'
+ +
'.$tsubtot.'
+
+
+ +
'.$ttglnota.'
+ +
'.$tdiskon.'
+
+
+ +
'.$toper.'
+ +
'.$tjumlah.'
+
+
+ +
'.$tbayar.'
+ +
'.$tsisa.'
+
+

+ + + '; + $this->app->json($ajson); + } + + public function form_bayar() { + $form = new Form($this->app); + $ttglbyr = $form->datebox("_", "Tgl_Bayar", tgl_ymd(), true, false); + $trek = $form->option_db("_", "Kode_Rek", $this->app_gel['KAS_TUNAI'], true, false, "vi_gel_acc", ["Kode_Rek","Nama_Lengkap"], "Kas_Rek=1 AND Aktif=1 AND Mode='D' ORDER BY Kode_Rek"); + $ttotal = $form->textbox("_", "Temp_Total", Param::Get("Total_Sisa",0), false, false, "double"); + $tbayar = $form->textbox("_", "Total_Bayar", Param::Get("Total_Sisa",0), true, false, "double"); + $tpotong = $form->textbox("_", "Total_Potong", 0, true, false, "double"); + $ajson['html'] = ' +
+ +
'.$ttglbyr.'
+
+
+ +
'.$trek.'
+
+

+
+ +
'.$ttotal.'
+
+
+ +
'.$tbayar.'
+
+
+ +
'.$tpotong.'
+
'; + $this->app->json($ajson); + } + + public function index() { + $this->app->json(['html' => ' +
+
+ +
+
+
 
+
 
+
 
+
 
+
+
+
+
' + ]); + } +} diff --git a/app/Controller/Gel/TerimaController.php b/app/Controller/Gel/TerimaController.php new file mode 100644 index 0000000..9fab787 --- /dev/null +++ b/app/Controller/Gel/TerimaController.php @@ -0,0 +1,304 @@ +app = $app; + $this->db = $db; + $this->web_app = (array) $session->get('WEB_APP'); + $this->app_gel = (array) $session->get('APP_GEL'); + $this->id_cab = Param::Int("CabID", $session->get('APP_INV')['CABANGID']); + $this->mode = Param::Get("mode", ""); + $this->mode_detail = Param::Get("mode_detail", ""); + $this->kode_jurnal = Param::Get("Kode_Jurnal", ""); + $this->kode_rek = Param::Get("Kode_Rek", ""); + $this->gel = new Gel($app); + } + + public function table_detail() { + if (in_array($this->mode_detail, ["insert","update","delete"])) { + $jumlah = (float) Param::Get("Jumlah", 0) * -1; + + $sql = new SQL($this->app); + $sql->set_table("tmp_gel_jurnal_detail"); + $sql->add_param("Kode_Rek"); + $sql->add_param("DK", "K"); + $sql->add_param("Jumlah", $jumlah); + $sql->add_param_unix(); + $sql->add_param_userid(); + $sql->add_where("Kode_Jurnal"); + $sql->add_where("ID"); + + if ($this->mode_detail === "insert") { + $sql->add_param("Kode_Jurnal"); + $sql->InsertDB(); + } else if ($this->mode_detail === "update") { + $sql->UpdateDB(); + } else if ($this->mode_detail === "delete") { + $sql->DeleteDB(); + } + } + + $tsql = ''; $asql = [$this->kode_jurnal, "K"]; $qtabel = "gel_jurnal_detail"; + if (in_array($this->mode, ["add","edit"])) { + if ($this->mode === "add") { $tsql = " AND Unix=?"; $asql[] = $this->app->user()->unix(); } + $qtabel = "tmp_gel_jurnal_detail"; + } + + $obj = new Table($this->app); + $obj->set_table("(SELECT * FROM ".$qtabel." WHERE Kode_Jurnal=? AND DK=?".$tsql.") D LEFT JOIN gel_acc A ON (D.Kode_Rek=A.Kode_Rek)", "D.*,-D.Jumlah Jumlah2,A.Nama_Rek", "", $asql); + $obj->set_footer("SUM(-Jumlah) Jumlah2, COUNT(*) Kode_Rek"); + $obj->add_field("ID", "ID", "hid"); + $obj->add_field("Kode_Rek", "Kode", "c", "", "records"); + $obj->add_field("Nama_Rek", "Rekening Kredit", "awr"); + $obj->add_field("Jumlah2", "Jumlah", "r", "kurung", "kurung"); + $obj->set_field_order("Kode_Rek", "A"); + if (in_array($this->mode, ["add","edit"])) { + $obj->add_row_btn("clipboard", "Ubah", "GELTerimaJS.detail_ubah"); + $obj->add_row_btn("trash", "Hapus", "GELTerimaJS.detail_hapus", "Unix", $this->app->user()->unix()); + $obj->set_func_btn("GELTerimaJS.detail_tambah", ' Rekening'); + $obj->set_func_btn("GELTerimaJS.rek_brow", ' Browse'); + } + + $nitems = (int) $this->db->fetchField("SELECT COUNT(*) FROM ".$qtabel." WHERE Kode_Jurnal=? AND DK=?".$tsql, $asql) ?? 0; + $this->app->json([ $obj->json_table("divDetailTabel"), ['type'=>"form", 'id'=>"Total_Item", 'value'=>$nitems] ]); + } + + public function brow_tx() { + $tcari = Param::Get("Cari_TX"); + $tsql = 'TipeID=2'; $asql = []; + if (!empty($tcari)) { + $tsql .= " AND CONCAT(Kode_Jurnal,DATE_FORMAT(Tanggal,'%d-%m-%Y'),Kode_Ref,Catatan) LIKE ?"; + $asql[] = '%' . $tcari . '%'; + } + + $obj = new Table($this->app); + $obj->set_table("gel_jurnal", "*", $tsql, $asql); + $obj->add_field("Kode_Jurnal", "Kode Jurnal", "c"); + $obj->add_field("Tanggal", "Tanggal", "c", "sqltgl", "", "val-tgl"); + $obj->add_field("Kode_Ref", "Kode Ref.", "l"); + $obj->add_field("Catatan", "Deskripsi", "awr"); + $obj->set_field_order("Kode_Jurnal", "D"); + $obj->set_func_select("GELTerimaJS.tx_select"); + $this->app->json([ $obj->db_table("divBrowTX") ]); + } + + public function brow_rek() { + $tcari = Param::Get("Cari_Rek"); + $tsql = 'Aktif=1 AND Mode="D"'; $asql = []; + if (!empty($tcari)) { + $tsql .= " AND CONCAT(Kode_Rek,Nama_Rek) LIKE ?"; + $asql[] = '%' . $tcari . '%'; + } + + $obj = new Table($this->app); + $obj->set_table("gel_acc", "*", $tsql, $asql); + $obj->add_field("Kode_Rek", "Kode", "c"); + $obj->add_field("Nama_Rek", "Nama Rekening", "awr"); + $obj->add_field("Level", "Level", "c"); + $obj->set_field_order("Kode_Rek", "A"); + $obj->set_func_select("GELTerimaJS.rek_select"); + $this->app->json([ $obj->db_table("divBrowRek") ]); + } + + public function auto_rek() { + $tcari = Param::Get("Auto_Query"); + $ajson['autodata'] = []; + $stat = $this->db->runQuery("SELECT Kode_Rek,Nama_Rek,CONCAT(Kode_Rek,' - ',Nama_Rek) Nama_Lengkap FROM gel_acc WHERE Aktif=1 AND Mode='D' AND CONCAT(Kode_Rek,Nama_Rek) LIKE ? ORDER BY Kode_Rek LIMIT 50", ['%'.$tcari.'%']); + while ($row = $stat->fetch(SimplePdo::FETCH_ASSOC)) { + $ajson['autodata'][] = ['value'=>$row['Kode_Rek'], 'text'=>$row['Nama_Rek'], 'html'=>''.$row['Kode_Rek'].' '.$row['Nama_Rek'], 'data'=>"", 'bc'=>0]; + } + $this->app->json($ajson); + } + + public function form_master() { + $ajson = [ 'error'=>"", 'html'=>"" ]; + $atabel = [ 'Kode_Jurnal'=>"", 'CabID'=>$this->id_cab, 'Kode_Ref'=>"", 'Tanggal'=>tgl_ymd(), 'Kode_Kas'=>"", 'Catatan'=>"" ]; + + if ($this->mode === "add") { + $atabel['Kode_Jurnal'] = "GT-BARU#".(string) $this->web_app['SERVER_ID']. $this->app->user()->id(3); + $atabel['Tanggal'] = tgl_ymd(); + $atabel['Kode_Kas'] = $this->app_gel['KAS_TUNAI']; + $this->kode_jurnal = ""; + + } else if ($this->mode === "edit") { + $this->gel->Detail_Copy($this->kode_jurnal); + + } else if ($this->mode === "save") { + $no_lama = $this->kode_jurnal; + $tgl_jurn = Param::Get("Tanggal"); + $b_baru = str_contains($no_lama, "BARU"); + if ($b_baru) $this->kode_jurnal = $this->gel->Jurnal_Baru($this->id_cab, $tgl_jurn, true); + + $kode_kas = Param::Get("Kode_Kas"); + $this->db->runQuery("DELETE FROM tmp_gel_jurnal_detail WHERE Kode_Jurnal='".$no_lama."' AND LEFT(Kode_Rek,1)='1' AND DK='D'"); + $ntot_kas = $this->db->fetchField("SELECT SUM(-Jumlah) FROM tmp_gel_jurnal_detail WHERE Kode_Jurnal='".$no_lama."' AND Unix='".$this->app->user()->unix()."'") ?? 0; + $this->db->insert("tmp_gel_jurnal_detail", [ 'Kode_Jurnal'=>$no_lama, 'Kode_Rek'=>$kode_kas, 'DK'=>'D', 'Jumlah'=>$ntot_kas,'Unix'=>$this->app->user()->unix(), 'UserID'=>$this->app->user()->id() ]); + $this->gel->Detail_Save($this->kode_jurnal, 2, $this->id_cab, $tgl_jurn, $b_baru, $no_lama); + $this->gel->Jurnal_Save($this->kode_jurnal, 2, $this->id_cab, $tgl_jurn, Param::Get("Kode_Ref"), Param::Get("Catatan")); + $atabel['Tanggal'] = $tgl_jurn; + $this->mode = "view"; + + } else if ($this->mode === "cancel") { + $this->gel->Detail_Cancel($this->kode_jurnal); + $this->mode = "view"; + $this->kode_jurnal = ""; + } + + if (!empty($this->kode_jurnal) && $this->mode !== "cancel") { + $row = $this->db->fetchRow("SELECT * FROM gel_jurnal WHERE Kode_Jurnal='".$this->kode_jurnal."' AND TipeID=2"); + if ($row) { + $atabel = $row; + $atabel['Kode_Kas'] = $this->db->fetchField("SELECT Kode_Rek FROM gel_jurnal_detail WHERE Kode_Jurnal='".$atabel['Kode_Jurnal']."' AND DK='D' LIMIT 1") ?? ''; + } else { + $ajson['error'] = "Nomor Transaksi belum ada / tidak diketemukan !"; + } + } + + $enable = in_array($this->mode, ["add","edit"]) ? true : false; + $form = new Form($this->app); + $tkode = $form->textbox("_", "Kode_Jurnal", $atabel['Kode_Jurnal'], !$enable, false, "text", "kode jurnal"); + $tref = $form->textbox("_", "Kode_Ref", $atabel['Kode_Ref'], $enable, false, "text", "kode referensi"); + $ttgl = $form->datebox("_", "Tanggal", $atabel['Tanggal'], $enable, false); + $tcab = $form->option_db("_", "CabID", $atabel['CabID'], $enable, false, "para_cabang", ["CabID","Nama_Cab"], "Aktif=1 ORDER BY CabID"); + $tkas = $form->option_db("_", "Kode_Kas", $atabel['Kode_Kas'], $enable, false, "vi_gel_acc", ["Kode_Rek","Nama_Lengkap"], "Kas_Rek=1 AND Aktif=1 AND Mode='D' ORDER BY Kode_Rek"); + $tcatat = $form->textbox("_", "Catatan", stripslashes($atabel['Catatan']), $enable, false, "text", "catatan jurnal"); + $ajson['html'] = ' +
+
+
+ +
'.$tkode.'
+
+
+ +
'.$ttgl.'
+
+
+
+
+ +
'.$tcab.'
+
+
+ +
'.$tref.'
+
+
+
+
+ +
'.$tcatat.'
+
+
+ +
'.$tkas.'
+
+

+ + '; + $this->app->json($ajson); + } + + public function form_rek() { + $id = (int) Param::Get("ID", 0); + $atabel = [ 'ID'=>$id, 'Kode_Rek'=>$this->kode_rek, 'Nama_Rek'=>"", 'Jumlah'=>0 ]; + if ($id > 0) { + $atabel = $this->db->fetchRow("SELECT * FROM tmp_gel_jurnal_detail WHERE Kode_Jurnal=? AND ID=?", [$this->kode_jurnal, $id]); + } + if (!empty($atabel['Kode_Rek'])) { + $atabel['Nama_Rek'] = $this->db->fetchField("SELECT Nama_Rek FROM gel_acc WHERE Kode_Rek=?", [$atabel['Kode_Rek']]) ?? ''; + } + + $form = new Form($this->app); + $tkode = $form->textbox("_", "Kode_Rek", $atabel['Kode_Rek'], false, false, "text"); + $tnama = $form->textauto("_", "Nama_Rek", ['value'=>$atabel['Kode_Rek'],'text'=>$atabel['Nama_Rek']], true, true, "ketik kode / nama rekening"); + $tjumlah = $form->textbox("_", "Jumlah", abs($atabel['Jumlah']), true, true, "double"); + + $ajson['html'] = ' +
+ +
'.$tkode.'
+
+
+ +
'.$tnama.'
+
+
+ +
'.$tjumlah.'
+
+ + '; + $this->app->json($ajson); + } + + public function proses_hapus() { + $this->db->runQuery("DELETE FROM gel_jurnal WHERE Kode_Jurnal='".$this->kode_jurnal."'"); + $this->db->runQuery("DELETE FROM gel_jurnal_detail WHERE Kode_Jurnal='".$this->kode_jurnal."'"); + $this->app->json([ 'status' => true ]); + } + + public function index() { + $this->app->json(['html' => ' +
+
+ +
+
+
 
+
 
+
+
+
+
' + ]); + } +} diff --git a/app/Controller/Gel/UmumController.php b/app/Controller/Gel/UmumController.php new file mode 100644 index 0000000..8bbf19d --- /dev/null +++ b/app/Controller/Gel/UmumController.php @@ -0,0 +1,306 @@ +app = $app; + $this->db = $db; + $this->web_app = (array) $session->get('WEB_APP'); + $this->app_gel = (array) $session->get('APP_GEL'); + $this->id_cab = Param::Int("CabID", $session->get('APP_INV')['CABANGID']); + $this->mode = Param::Get("mode", ""); + $this->mode_detail = Param::Get("mode_detail", ""); + $this->kode_jurnal = Param::Get("Kode_Jurnal", ""); + $this->kode_rek = Param::Get("Kode_Rek", ""); + $this->gel = new Gel($app); + } + + public function table_detail() { + if (in_array($this->mode_detail, ["insert","update","delete"])) { + $jumlah = (float) Param::Get("Jumlah", 0) * ((string) Param::Get("DK","D")==="D" ? 1 : -1); + + $sql = new SQL($this->app); + $sql->set_table("tmp_gel_jurnal_detail"); + $sql->add_param("Kode_Rek"); + $sql->add_param("DK"); + $sql->add_param("Jumlah", $jumlah); + $sql->add_param_unix(); + $sql->add_param_userid(); + $sql->add_where("Kode_Jurnal"); + $sql->add_where("ID"); + + if ($this->mode_detail === "insert") { + $sql->add_param("Kode_Jurnal"); + $sql->InsertDB(); + } else if ($this->mode_detail === "update") { + $sql->UpdateDB(); + } else if ($this->mode_detail === "delete") { + $sql->DeleteDB(); + } + } + + $tsql = ''; $asql = [$this->kode_jurnal]; $qtabel = "gel_jurnal_detail"; + if (in_array($this->mode, ["add","edit"])) { + if ($this->mode === "add") { $tsql = " AND Unix=?"; $asql[] = $this->app->user()->unix(); } + $qtabel = "tmp_gel_jurnal_detail"; + } + + $obj = new Table($this->app); + $obj->set_table("(SELECT *,IF(DK='D',Jumlah,0) Debit,IF(DK='K',-Jumlah,0) Kredit FROM ".$qtabel." WHERE Kode_Jurnal=?".$tsql.") D LEFT JOIN gel_acc A ON (D.Kode_Rek=A.Kode_Rek)", "D.*,A.Nama_Rek", "", $asql); + $obj->set_footer("SUM(D.Debit) Debit,SUM(D.Kredit) Kredit,COUNT(*) Kode_Rek"); + $obj->add_field("ID", "ID", "hid"); + $obj->add_field("Kode_Rek", "Kode", "c", "", "records"); + $obj->add_field("Nama_Rek", "Nama Rekening", "awr"); + $obj->add_field("DK", "D / K", "hid"); + $obj->add_field("Debit", "Debit", "r", "kurung", "kurung"); + $obj->add_field("Kredit", "Kredit", "r", "kurung", "kurung"); + $obj->set_field_order("Kode_Rek", "A"); + if (in_array($this->mode, ["add","edit"])) { + $obj->add_row_btn("clipboard", "Ubah", "GELUmumJS.detail_ubah"); + $obj->add_row_btn("trash", "Hapus", "GELUmumJS.detail_hapus", "Unix", $this->app->user()->unix()); + $obj->set_func_btn("GELUmumJS.detail_tambah", ' Rekening'); + $obj->set_func_btn("GELUmumJS.rek_brow", ' Browse'); + } + + $nitems = 0; $ntotal = 0; + $row = $this->db->fetchRow("SELECT COUNT(*) Baris,SUM(Jumlah) Jumlah FROM ".$qtabel." WHERE Kode_Jurnal=?".$tsql, $asql); + if ($row) { + $nitems = (int) $row['Baris']; + $ntotal = (float) $row['Jumlah']; + } + $this->app->json([ $obj->json_table("divDetailTabel"), ['type'=>"form", 'id'=>"Total_Item", 'value'=>$nitems], ['type'=>"form", 'id'=>"Total_Jumlah", 'value'=>$ntotal] ]); + } + + public function brow_tx() { + $tcari = Param::Get("Cari_TX"); + $tsql = 'TipeID=4'; $asql = []; + if (!empty($tcari)) { + $tsql .= " AND CONCAT(Kode_Jurnal,DATE_FORMAT(Tanggal,'%d-%m-%Y'),Kode_Ref,Catatan) LIKE ?"; + $asql[] = '%' . $tcari . '%'; + } + + $obj = new Table($this->app); + $obj->set_table("gel_jurnal", "*", $tsql, $asql); + $obj->add_field("Kode_Jurnal", "Kode Jurnal", "c"); + $obj->add_field("Tanggal", "Tanggal", "c", "sqltgl", "", "val-tgl"); + $obj->add_field("Kode_Ref", "Kode Ref.", "l"); + $obj->add_field("Catatan", "Deskripsi", "awr"); + $obj->set_field_order("Kode_Jurnal", "D"); + $obj->set_func_select("GELUmumJS.tx_select"); + $this->app->json([ $obj->db_table("divBrowTX") ]); + } + + public function brow_rek() { + $tcari = Param::Get("Cari_Rek"); + $tsql = 'Aktif=1 AND Mode="D"'; $asql = []; + if (!empty($tcari)) { + $tsql .= " AND CONCAT(Kode_Rek,Nama_Rek) LIKE ?"; + $asql[] = '%' . $tcari . '%'; + } + + $obj = new Table($this->app); + $obj->set_table("gel_acc", "*", $tsql, $asql); + $obj->add_field("Kode_Rek", "Kode", "c"); + $obj->add_field("Nama_Rek", "Nama Rekening", "awr"); + $obj->add_field("Level", "Level", "c"); + $obj->set_field_order("Kode_Rek", "A"); + $obj->set_func_select("GELUmumJS.rek_select"); + $this->app->json([ $obj->db_table("divBrowRek") ]); + } + + public function auto_rek() { + $tcari = Param::Get("Auto_Query"); + $ajson['autodata'] = []; + $stat = $this->db->runQuery("SELECT Kode_Rek,Nama_Rek,CONCAT(Kode_Rek,' - ',Nama_Rek) Nama_Lengkap FROM gel_acc WHERE Aktif=1 AND Mode='D' AND CONCAT(Kode_Rek,Nama_Rek) LIKE ? ORDER BY Kode_Rek LIMIT 50", ['%'.$tcari.'%']); + while ($row = $stat->fetch(SimplePdo::FETCH_ASSOC)) { + $ajson['autodata'][] = ['value'=>$row['Kode_Rek'], 'text'=>$row['Nama_Rek'], 'html'=>''.$row['Kode_Rek'].' '.$row['Nama_Rek'], 'data'=>"", 'bc'=>0]; + } + $this->app->json($ajson); + } + + public function form_master() { + $ajson = [ 'error'=>"", 'html'=>"" ]; + $atabel = [ 'Kode_Jurnal'=>"", 'CabID'=>$this->id_cab, 'Kode_Ref'=>"", 'Tanggal'=>tgl_ymd(), 'Catatan'=>"" ]; + + if ($this->mode === "add") { + $atabel['Kode_Jurnal'] = "GU-BARU#".(string) $this->web_app['SERVER_ID']. $this->app->user()->id(3); + $atabel['Tanggal'] = tgl_ymd(); + $this->kode_jurnal = ""; + + } else if ($this->mode === "edit") { + $this->gel->Detail_Copy($this->kode_jurnal); + + } else if ($this->mode === "save") { + $no_lama = $this->kode_jurnal; + $tgl_jurn = Param::Get("Tanggal"); + $b_baru = str_contains($no_lama, "BARU"); + if ($b_baru) $this->kode_jurnal = $this->gel->Jurnal_Baru($this->id_cab, $tgl_jurn, true); + + $this->gel->Detail_Save($this->kode_jurnal, 4, $this->id_cab, $tgl_jurn, $b_baru, $no_lama); + $this->gel->Jurnal_Save($this->kode_jurnal, 4, $this->id_cab, $tgl_jurn, Param::Get("Kode_Ref"), Param::Get("Catatan")); + $atabel['Tanggal'] = $tgl_jurn; + $this->mode = "view"; + + } else if ($this->mode === "cancel") { + $this->gel->Detail_Cancel($this->kode_jurnal); + $this->mode = "view"; + $this->kode_jurnal = ""; + } + + if (!empty($this->kode_jurnal) && $this->mode !== "cancel") { + $row = $this->db->fetchRow("SELECT * FROM gel_jurnal WHERE Kode_Jurnal='".$this->kode_jurnal."' AND TipeID=4"); + if ($row) { + $atabel = $row; + } else { + $ajson['error'] = "Nomor Transaksi belum ada / tidak diketemukan !"; + } + } + + $enable = in_array($this->mode, ["add","edit"]) ? true : false; + $form = new Form($this->app); + $tkode = $form->textbox("_", "Kode_Jurnal", $atabel['Kode_Jurnal'], !$enable, false, "text", "kode jurnal"); + $tref = $form->textbox("_", "Kode_Ref", $atabel['Kode_Ref'], $enable, false, "text", "kode referensi"); + $ttgl = $form->datebox("_", "Tanggal", $atabel['Tanggal'], $enable, false); + $tcab = $form->option_db("_", "CabID", $atabel['CabID'], $enable, false, "para_cabang", ["CabID","Nama_Cab"], "Aktif=1 ORDER BY CabID"); + $tcatat = $form->textbox("_", "Catatan", stripslashes($atabel['Catatan']), $enable, false, "text", "catatan jurnal"); + $ajson['html'] = ' +
+
+
+ +
'.$tkode.'
+
+
+ +
'.$ttgl.'
+
+
+
+
+ +
'.$tcab.'
+
+
+ +
'.$tref.'
+
+
+
+
+ +
'.$tcatat.'
+
+

+ + + '; + $this->app->json($ajson); + } + + public function form_rek() { + $id = (int) Param::Get("ID", 0); + $atabel = [ 'ID'=>$id, 'Kode_Rek'=>$this->kode_rek, 'DK'=>Param::Get("DK", "D"), 'Nama_Rek'=>"", 'Jumlah'=>0 ]; + if ($id > 0) { + $atabel = $this->db->fetchRow("SELECT * FROM tmp_gel_jurnal_detail WHERE Kode_Jurnal=? AND ID=?", [$this->kode_jurnal, $id]); + } + if (!empty($atabel['Kode_Rek'])) { + $atabel['Nama_Rek'] = $this->db->fetchField("SELECT Nama_Rek FROM gel_acc WHERE Kode_Rek=?", [$atabel['Kode_Rek']]) ?? ''; + } + + $form = new Form($this->app); + $tkode = $form->textbox("_", "Kode_Rek", $atabel['Kode_Rek'], false, false, "text"); + $tnama = $form->textauto("_", "Nama_Rek", ['value'=>$atabel['Kode_Rek'],'text'=>$atabel['Nama_Rek']], true, true, "ketik kode / nama rekening"); + $tdk = $form->radio("_", "DK", $atabel['DK'], true, false, ['D'=>"Debit",'K'=>"Kredit"]); + $tjumlah = $form->textbox("_", "Jumlah", abs($atabel['Jumlah']), true, true, "double"); + + $ajson['html'] = ' +
+ +
'.$tkode.'
+
+
+ +
'.$tnama.'
+
+
+ +
'.$tdk.'
+
+
+ +
'.$tjumlah.'
+
+ + '; + $this->app->json($ajson); + } + + public function proses_hapus() { + $this->db->runQuery("DELETE FROM gel_jurnal WHERE Kode_Jurnal='".$this->kode_jurnal."'"); + $this->db->runQuery("DELETE FROM gel_jurnal_detail WHERE Kode_Jurnal='".$this->kode_jurnal."'"); + $this->app->json([ 'status' => true ]); + } + + public function index() { + $this->app->json(['html' => ' +
+
+ +
+
+
 
+
 
+
+
+
+
' + ]); + } +} diff --git a/app/Controller/IndexController.php b/app/Controller/IndexController.php new file mode 100644 index 0000000..d178a2a --- /dev/null +++ b/app/Controller/IndexController.php @@ -0,0 +1,169 @@ +app = $app; + $this->db = $db; + $this->web_app = $session->get('WEB_APP'); + $this->id_cab = (int) $session->get('APP_INV')['CABANGID']; + $this->level_user = (int) $session->get('WEB_USER')['Level']; + } + + public function chart_sale() { + $ajson['tipe'] = "chart"; + $adata['datasets'] = [['data'=>[], 'label'=>"Penjualan", 'borderColor'=>[], 'backgroundColor'=>[]]]; + $adata['labels'] = ["Belum Ada Penjualan"]; + + $asale = $this->db->fetchAll("SELECT P.Nama_Produk,D.Qty FROM (SELECT InvID,SUM(-Qty) Qty FROM inv_detail WHERE CabID=? AND NotaID IN (5) AND Tgl_Ref>=? GROUP BY InvID ORDER BY SUM(-Qty) DESC LIMIT 10) D LEFT JOIN inv_produk P ON (D.InvID=P.InvID)", [$this->id_cab, tgl_sql2str(tgl_operasi(tgl_dmy(),-7))]); + if (count($asale) === 0) $adata['labels'] = []; + foreach ($asale as $sale) { + $adata['labels'][] = $sale['Nama_Produk']; + $adata['datasets'][0]['data'][] = $sale['Qty']; + $adata['datasets'][0]['borderColor'][] = random_color(); + $adata['datasets'][0]['backgroundColor'][] = random_color(); + } + + $ajson['chart'] = ['type' => "bar", + 'data' => $adata, + 'options' => [ + 'responsive' => true, + 'maintainAspectRatio' => false, + 'plugins' => [ + 'legend' => ['display' => false], + 'title' => ['display' => true, 'font' => ['size' => 20, 'weight' => 'normal'], 'text' => '10 Barang Terlaris'], + 'subtitle' => ['display' => true, 'position' => "top", 'text' => '(dalam sepekan terakhir)'] + ], + 'scales' => ['y' => ['beginAtZero' => true, 'title' => ['display' => true, 'font' => ['size' => 14], 'text' => "Qty Penjualan"]], 'x' => ['display' => false]], + 'layout' => ['padding' => ['top' => 10]] + ] + ]; + $this->app->json($ajson); + } + + public function chart_omzet() { + $ajson['tipe'] = "chart"; + $adata['labels'] = []; + $adata['datasets'] = []; + + if ($this->level_user <= 1) { + $acab = $this->db->fetchColumn("SELECT Kode_Cab FROM para_cabang WHERE Aktif=1 ORDER BY CabID"); + foreach ($acab as $cab) { + $adata['datasets'][] = ['data'=>[], 'label'=>$cab." (jt)", 'borderColor'=>random_color(), 'backgroundColor'=>random_color(), 'pointStyle'=>'circle', 'pointRadius'=>10, 'pointHoverRadius'=>15]; + } + $aomzet = $this->db->fetchAll("SELECT Tgl_Jual,DAY(Tgl_Jual) Tgl,SUM(IF(CabID=2,Total_Jual,0)) Total_2,SUM(IF(CabID=3,Total_Jual,0)) Total_3,SUM(IF(CabID=4,Total_Jual,0)) Total_4 FROM inv_jual WHERE Tgl_Jual<=? GROUP BY Tgl_Jual ORDER BY Tgl_Jual DESC LIMIT 10", [tgl_ymd()]); + if (count($aomzet) === 0) $adata['labels'] = []; + foreach ($aomzet as $omzet) { + $adata['labels'][] = substr(tgl_hari(tgl_sql2str($omzet['Tgl_Jual'])),0,3) ." (". $omzet['Tgl'] . ")"; + $adata['datasets'][0]['data'][] = round($omzet['Total_2']/1000000,2); + $adata['datasets'][1]['data'][] = round($omzet['Total_3']/1000000,2); + $adata['datasets'][2]['data'][] = round($omzet['Total_4']/1000000,2); + } + } else { + $acab = $this->db->fetchRow("SELECT Kode_Cab FROM para_cabang WHERE CabID=?", [ $this->id_cab ]) ?? ['Kode_Cab' => "Toko"]; + $adata['datasets'] = [['data'=>[], 'label'=>$acab['Kode_Cab']." (jt)", 'borderColor'=>random_color(), 'backgroundColor'=>random_color(), 'pointStyle'=>'circle', 'pointRadius'=>10, 'pointHoverRadius'=>15]]; + + $aomzet = $this->db->fetchAll("SELECT Tgl_Jual,DAY(Tgl_Jual) Tgl,SUM(Total_Jual) Total FROM inv_jual WHERE CabID=? AND Tgl_Jual<=? GROUP BY Tgl_Jual ORDER BY Tgl_Jual DESC LIMIT 10", [ $this->id_cab, tgl_ymd() ]); + if (count($aomzet) === 0) $adata['labels'] = []; + foreach ($aomzet as $omzet) { + $adata['labels'][] = substr(tgl_hari(tgl_sql2str($omzet['Tgl_Jual'])),0,3) ." (". $omzet['Tgl'] . ")"; + $adata['datasets'][0]['data'][] = round($omzet['Total']/1000000,2); + } + } + + $ajson['chart'] = ['type' => "line", + 'data' => $adata, + 'options' => [ + 'responsive' => true, + 'maintainAspectRatio' => false, + 'plugins' => [ + 'legend' => ['display' => false], + 'title' => ['display' => true, 'font' => ['size' => 20, 'weight' => 'normal'], 'text' => 'Penjualan 10 Hari Terakhir'], + 'subtitle' => ['display' => true, 'position' => "top", 'text' => '(dalam jutaan)'] + ], + 'scales' => ['y' => ['min' => 0, 'ticks' => ['stepSize' => 1], 'title' => ['display' => true, 'font' => ['size' => 14], 'text' => "Jumlah Penjualan"]]], + 'layout' => ['padding' => ['top' => 10]] + ] + ]; + $this->app->json($ajson); + } + + public function table_stok() { + $ajson['tipe'] = "tabel"; + $ajson['html'] = ''; + + $atabel = $this->db->fetchAll("SELECT DISTINCT S.Stok,P.Kode_SKU,P.Nama_Produk FROM (SELECT InvID,Stok FROM inv_stok WHERE CabID=?) S LEFT JOIN vi_inv_produk P ON (P.InvID=S.InvID AND P.Qty=1) WHERE P.Kode_SKU IS NOT NULL ORDER BY S.Stok LIMIT 20", [ $this->id_cab ]); + foreach ($atabel as $tabel) { + $ajson['html'] .= sprintf('', $tabel['Kode_SKU'], $tabel['Nama_Produk'], rupiah((float)$tabel['Stok'])); + } + + $ajson['html'] .= ''; + $this->app->json($ajson); + } + + public function index() { + $ajson['CabID'] = $this->id_cab ?? 0; + $ajson['html'] = ' +
+
+
+
+
+ +
+
+ +
+
+
+
+
+
+
+
'; + $this->app->json($ajson); + } + + public function get401() { + $this->app->render('401', $this->web_app); + } + + public function get404() { + $this->app->render('404', $this->web_app); + } + + public function post404() { + $ajson = [ + 'status' => false, + 'html' => '

4.0.4

Modul / Menu Tidak Ditemukan

Maaf, modul atau menu yang Anda cari tidak ada atau mungkin telah dipindahkan.

' + ]; + $this->app->json($ajson); + } + +} diff --git a/app/Controller/Inv/BeliController.php b/app/Controller/Inv/BeliController.php new file mode 100644 index 0000000..5695223 --- /dev/null +++ b/app/Controller/Inv/BeliController.php @@ -0,0 +1,581 @@ +app = $app; + $this->db = $db; + $this->web_app = (array) $session->get('WEB_APP'); + $this->app_gel = (array) $session->get('APP_GEL'); + $this->id_cab = Param::Int("CabID", $session->get('APP_INV')['CABANGID']); + $this->mode = Param::Get("mode", ""); + $this->mode_detail = Param::Get("mode_detail", ""); + $this->no_beli = Param::Get("No_Beli", ""); + $this->is_pend = str_contains($this->no_beli, "BELI") === true; + $this->id_inv = Param::Int("InvID", 0); + $this->id_satuan = Param::Int("SatuanID", 0); + $this->id_varian = Param::Int("VarianID", 0); + $this->inv = new Inv($app); + $this->gel = new Gel($app); + } + + public function table_detail() { + if (in_array($this->mode_detail, ["insert","update","delete"])) { + $iqty = Param::Float("Qty", 0); + + $sql = new SQL($this->app); + $sql->set_table("tmp_inv_detail"); + $sql->add_param("No_Ref", $this->no_beli); + $sql->add_param("InvID"); + $sql->add_param("SatuanID"); + $sql->add_param("VarianID"); + $sql->add_param("Qty", $iqty); + $sql->add_param("Harga_Beli"); + $sql->add_param("Disk_Rupiah"); + $sql->add_param("Disk_Persen1"); + $sql->add_param("Disk_Persen2"); + $sql->add_param("Disk_Persen3"); + $sql->add_param("Disk_Persen4"); + $sql->add_param("Disk_Persen5"); + $sql->add_param("Total_Diskon", "(Harga_Beli-((Harga_Beli-Disk_Rupiah)*((100.0-Disk_Persen1)/100)*((100.0-Disk_Persen2)/100)*((100.0-Disk_Persen3)/100)*((100.0-Disk_Persen4)/100)*((100.0-Disk_Persen5)/100)))*Qty", true); + $sql->add_param_unix(); + $sql->add_param_userid(); + $sql->add_where("ID"); + $sql->add_where("No_Ref", $this->no_beli); + + $_id = Param::Get("ID", 0); + if ( $this->mode_detail === "insert" ) { + $sql->InsertDB(); + $_id = $sql->LastInsertID("ID"); + } else if ( $this->mode_detail === "update" ) { + $sql->UpdateDB(); + } else if ( $this->mode_detail === "delete" ) { + $sql->DeleteDB(); + } + } + + $tsql = ''; $asql = [$this->no_beli]; $qtabel = "inv_detail"; + if ($this->is_pend) $qtabel = "tmp_inv_detail"; + if (in_array($this->mode, ["add","edit"])) { + if ($this->mode === "add") { $tsql = " AND Unix=?"; $asql[] = $this->app->user()->unix(); } + $qtabel = "tmp_inv_detail"; + } + + $obj = new Table($this->app); + $obj->set_table("(SELECT * FROM ".$qtabel." WHERE No_Ref=?".$tsql.") D LEFT JOIN vi_inv_produk P ON (D.InvID=P.InvID AND D.SatuanID=P.SatuanID AND D.VarianID=P.VarianID)", "D.*,P.Kode_SKU,P.Nama_Lengkap,(D.Qty*D.Harga_Beli)-D.Total_Diskon Total", "", $asql); + $obj->set_footer("SUM((D.Qty*D.Harga_Beli)-D.Total_Diskon) Total,SUM(D.Total_Diskon) Total_Diskon"); + $obj->add_field("ID", "No", "c"); + $obj->add_field("InvID", "InvID", "hid"); + $obj->add_field("SatuanID", "SatuanID", "hid"); + $obj->add_field("VarianID", "VarianID", "hid"); + $obj->add_field("Kode_SKU", "SKU", "c"); + $obj->add_field("Nama_Lengkap", "Nama Barang", "awr"); + $obj->add_field("Qty", "Qty", "r", "rupiah2"); + $obj->add_field("Harga_Beli", "Harga @", "r", "rupiah"); + $obj->add_field("Total_Diskon", "Diskon", "r", "rupiah", "rupiah"); + $obj->add_field("Total", "Jumlah", "r", "rupiah", "rupiah"); + $obj->set_field_order("ID", "D"); + if (in_array($this->mode, ["add","edit"])) { + $obj->add_row_btn("clipboard", "Ubah", "BeliJS.detail_ubah"); + $obj->add_row_btn("trash", "Hapus", "BeliJS.detail_hapus", "Unix", $this->app->user()->unix()); + $obj->set_func_btn("BeliJS.detail_tambah", ' Barang'); + $obj->set_func_btn("BeliJS.produk_brow", ' Browse'); + } + $obj->set_func_btn("BeliJS.total_show", "Total"); + $ajson[] = $obj->json_table("divDetailTabel"); + + if (in_array($this->mode, ["add","pending-edit"])) { + $ajual = $this->db->fetchRow("SELECT SUM((Qty*Harga_Beli)-Total_Diskon) Jumlah,SUM(Total_Diskon) Diskon FROM ".$qtabel." WHERE No_Ref=?".$tsql, $asql) ?? ['Jumlah'=>0, 'Diskon'=>0]; + $ajson[] = ['type'=>"form", 'id'=>"Real_Beli", 'value'=>$ajual['Jumlah']]; + $ajson[] = ['type'=>"form", 'id'=>"Real_Diskon", 'value'=>$ajual['Diskon']]; + } + if (in_array($this->mode_detail, ["insert","update"])) {//WARNING: harga jual dibawah limit margin!! + $hbeli = (float) $this->db->fetchField("SELECT CEIL(Harga_Beli-(Total_Diskon/Qty)) Pokok FROM tmp_inv_detail WHERE No_Ref=? AND ID=?", [$this->no_beli, $_id]) ?? 0; + $_row = $this->db->fetchRow("SELECT P.Nama_Produk,H.*,G.Margin FROM (SELECT * FROM inv_produk_harga WHERE InvID=? AND SatuanID=? AND Harga_Jual>0 ORDER BY Harga_Jual ASC LIMIT 1) H LEFT JOIN (SELECT * FROM inv_produk WHERE InvID=?) P ON (H.InvID=P.InvID) LEFT JOIN inv_produk_grup G ON (P.Grup_InvID=G.Grup_InvID)", [$this->id_inv, $this->id_satuan, $this->id_inv]); + if ($_row) { + if ((float) $_row['Margin'] > 0) $hbeli += ($hbeli*((float) $_row['Margin']/100)); + if ($hbeli > (float) $_row['Harga_Jual']) $ajson[] = ['type'=>"msg", 'mode'=>"error", 'wait'=>3000, 'value'=>"Produk \"".$_row['Nama_Produk']."\" Harga Beli telah melewati Margin Harga Jual!"]; + } + } + $this->app->json($ajson); + } + + public function brow_tx() { + $tcari = Param::Get("Cari_TX"); + $tsql = ''; $asql = []; + if (!empty($tcari)) { + $tsql .= "CONCAT(B.No_Beli,B.No_Faktur,S.Nama_Sup,DATE_FORMAT(B.Tgl_Faktur,'%d-%m-%Y')) LIKE ?"; + $asql[] = '%' . $tcari . '%'; + } + + $obj = new Table($this->app); + $obj->set_table("(SELECT *,Total_Beli-Total_Diskon Jumlah FROM inv_beli WHERE Data_Beli=1) B LEFT JOIN para_supplier S ON (B.SupID=S.SupID) LEFT JOIN para_cabang C ON (C.CabID=B.CabID)", "B.*,S.Nama_Sup,C.Kode_Cab", $tsql, $asql); + $obj->add_field("No_Beli", "No. Trans", "c"); + $obj->add_field("Tgl_Beli", "Tgl. Trans", "c", "sqltgl", "", "val-tgl"); + $obj->add_field("Kode_Cab", "Cabang", "c"); + $obj->add_field("Nama_Sup", "Nama Supplier", "awr"); + $obj->add_field("Total_Beli", "Sub. Total", "r", "rupiah2"); + $obj->add_field("Total_Diskon", "Diskon", "r", "rupiah2"); + $obj->add_field("Jumlah", "Jumlah", "r", "rupiah2"); + $obj->set_field_order("Tgl_Beli", "D"); + $obj->set_func_select("BeliJS.tx_select"); + $this->app->json([ $obj->db_table("divBrowTX") ]); + } + + public function brow_pending() { + $obj = new Table($this->app); + $obj->set_table("(SELECT *,Total_Beli-Total_Diskon Jumlah FROM inv_beli_pend WHERE UserID=?) B LEFT JOIN para_supplier S ON (B.SupID=S.SupID) LEFT JOIN para_cabang C ON (C.CabID=B.CabID)", "B.*,S.Nama_Sup,C.Kode_Cab", "", [$this->app->user()->id()]); + $obj->add_field("No_Beli", "No. Trans", "c"); + $obj->add_field("Tgl_Beli", "Tgl. Pending", "c", "sqltgl", "", "val-tgl"); + $obj->add_field("Kode_Cab", "Cabang", "c"); + $obj->add_field("Nama_Sup", "Nama Supplier", "awr"); + $obj->add_field("Total_Beli", "Sub. Total", "r", "rupiah2"); + $obj->add_field("Total_Diskon", "Diskon", "r", "rupiah2"); + $obj->add_field("Jumlah", "Jumlah", "r", "rupiah2"); + $obj->set_field_order("No_Beli", "D"); + $obj->add_row_btn("save", "Pilih", "BeliJS.pending_select"); + if ($this->app->user()->is_level(1)) $obj->add_row_btn("trash", "Hapus", "BeliJS.pending_delete", "UserID", $this->app->user()->id()); + $this->app->json([ $obj->db_table("divBrowPending") ]); + } + + public function brow_produk() { + $tcari = Param::Get("Cari_Produk"); + $tsql = ''; $asql = [1]; + if (!empty($tcari)) { + $tsql .= " AND P.Barcode_Nama LIKE ?"; + $asql[] = '%' . $tcari . '%'; + } + if ((string) Param::Get("Filter_Browse", "") !== "all") { + $tsql .= " AND S.SupID=?"; + array_push($asql, Param::Get("SupID")); + } + + $obj = new Table($this->app); + $obj->set_table("vi_inv_produk P LEFT JOIN inv_produk_sup S ON (P.InvID=S.InvID)", "P.*", "P.Aktif=?".$tsql, $asql); + $obj->add_field("InvID", "ID", "hid"); + $obj->add_field("SatuanID", "ID", "hid"); + $obj->add_field("VarianID", "ID", "hid"); + $obj->add_field("Kode_SKU", "SKU", "c"); + $obj->add_field("Kode_Barcode", "Barcode", "c"); + $obj->add_field("Nama_Lengkap", "Nama Barang", "awr"); + $obj->set_field_order("Kode_SKU", "A"); + $obj->set_func_select("BeliJS.produk_select"); + $this->app->json([ $obj->db_table("divBrowProduk") ]); + } + + public function auto_produk() { + $tcari = Param::Get("Auto_Query", ""); + $ajson['autodata'] = []; + $bcode = 0; $arec = []; + + // Cari by SKU + Barcode + $_row = $this->db->fetchRow("SELECT V.InvID,P.Nama_Produk,CONCAT(V.SatuanID,':',V.VarianID,':',S.Nama_Satuan) Data2 FROM (SELECT * FROM inv_produk_varian WHERE Kode_SKU=? OR Kode_Barcode=? LIMIT 1) V LEFT JOIN inv_produk P ON (P.InvID=V.InvID) LEFT JOIN para_satuan S ON (S.SatuanID=V.SatuanID) WHERE P.Aktif=1", [$tcari, $tcari]); + if ($_row) { + $bcode = 1; + $arec = $_row->getData(); + } + + if ($bcode === 1) { + $ajson['autodata'][] = ['value'=>$arec['InvID'], 'text'=>$arec['Nama_Produk'], 'data'=>$arec['Data2'], 'bc'=>1]; + } else { + $stat = $this->db->runQuery("SELECT P.InvID,P.Nama_Produk,V.Kode_SKU,IFNULL(MV.Nama_Varian,'') Nama_Varian,MS.Nama_Satuan,CONCAT(V.SatuanID,':',V.VarianID,':',MS.Nama_Satuan) Data2 FROM (SELECT * FROM inv_produk WHERE Nama_Produk LIKE ? AND Aktif=1) P INNER JOIN inv_produk_varian V ON (V.InvID=P.InvID) LEFT JOIN para_satuan MS ON (MS.SatuanID=V.SatuanID) LEFT JOIN para_varian MV ON (MV.VarianID=V.VarianID) ORDER BY P.Nama_Produk,MS.Nama_Satuan LIMIT 50", ['%'.$tcari.'%']); + while ($row = $stat->fetch(SimplePdo::FETCH_ASSOC)) { + $ajson['autodata'][] = ['value'=>$row['InvID'], 'text'=>$row['Nama_Produk'], 'html'=>''.$row['Kode_SKU'].' '.$row['Nama_Produk']." ".$row['Nama_Varian']." ".$row['Nama_Satuan'], 'data'=>$row['Data2'], 'bc'=>0]; + } + } + $this->app->json($ajson); + } + + public function form_master() { + $ajson = [ 'error'=>"", 'html'=>"" ]; + $atabel = []; + + if ($this->mode === "pending-edit") { + $this->inv->Pending_Edit($this->no_beli); + $atabel = $this->Data_Beli($this->no_beli); + $this->mode = "edit"; + } else if ($this->mode === "pending-save") { + $b_baru = false; + if (str_ends_with($this->no_beli, "#00")) { + $b_baru = true; + $no_lama = $this->no_beli; + $this->no_beli = $this->Pending_Nomor(); + $this->inv->Pending_Save($no_lama, $this->no_beli); + } + $apending = $this->db->fetchRow("SELECT SUM(Qty*Harga_Beli) Beli,SUM(Total_Diskon) Diskon FROM tmp_inv_detail WHERE No_Ref=?", [$this->no_beli]) ?? ['Beli'=>0, 'Diskon'=>0]; + + $sql = new SQL($this->app); + $sql->set_table("inv_beli_pend"); + $sql->add_param("No_Beli", $this->no_beli); + $sql->add_param_date("Tgl_Beli"); + $sql->add_param_date("Tgl_Faktur"); + $sql->add_param("No_Faktur"); + $sql->add_param("CabID"); + $sql->add_param("SupID"); + $sql->add_param("Total_Beli", $apending['Beli']); + $sql->add_param("Total_Diskon", $apending['Diskon']); + $sql->add_param("Real_Beli"); + $sql->add_param("Real_Diskon"); + $sql->add_param("PPN"); + $sql->add_param_userid(); + $sql->add_where("No_Beli", $this->no_beli); + if ($b_baru) $sql->InsertDB(); + else $sql->UpdateDB(); + $atabel = $this->Data_Beli(); + } else if ($this->mode === "pending-delete") { + $this->inv->Pending_Delete($this->no_beli); + $this->db->delete("inv_beli_pend", "No_Beli=?", [$this->no_beli]); + $atabel = $this->Data_Beli(); + } else if ($this->mode === "add") { + $atabel = $this->Data_Beli("", true); + } else if ($this->mode === "edit") { + $this->inv->Detail_Copy($this->no_beli, true); + $atabel = $this->Data_Beli($this->no_beli); + } else if ($this->mode === "save") { + $no_lama = $this->no_beli; + if ($this->is_pend) { + $this->no_beli = $this->inv->Nomor_Baru("B", Param::Get("Tgl_Beli"), true); + if (!str_ends_with($no_lama, "#00")) $this->db->delete("inv_beli_pend", "No_Beli=?", [$no_lama]); + } + $this->inv->Detail_Save($this->no_beli, 3, $this->id_cab, Param::Get("Tgl_Beli"), $this->is_pend, $no_lama, Param::Int("PPN", 0)); + + $abeli = $this->db->fetchRow("SELECT SUM(Qty*Harga_Beli) Beli, SUM(Total_Diskon) Diskon FROM inv_detail WHERE No_Ref=?", [$this->no_beli]) ?? ['Beli'=>0, 'Diskon'=>0]; + + $sql = new SQL($this->app); + $sql->set_table("inv_beli"); + $sql->add_param_date("Tgl_Beli"); + $sql->add_param_date("Tgl_Faktur"); + $sql->add_param("No_Faktur"); + $sql->add_param("CabID"); + $sql->add_param("SupID"); + $sql->add_param("Total_Beli", $abeli['Beli']); + $sql->add_param("Total_Diskon", $abeli['Diskon']); + $sql->add_param("Real_Beli"); + $sql->add_param("Real_Diskon"); + $sql->add_param("PPN"); + $sql->add_param("Data_Beli", 1); + $sql->add_param_stamp(); + $sql->add_param_userid(); + $sql->add_where("No_Beli", $this->no_beli); + $sql->UpdateDB(); + + $this->inv->Produk_Update($this->no_beli, Param::Int("SupID", 0)); + $this->gel->Update_Lunas_Sup(Param::Int("SupID", 0)); + + // PROSES POSTING GL + $ainfo = $this->db->fetchRow("SELECT B.*,S.Nama_Sup,B.Real_Beli Tagihan FROM (SELECT * FROM inv_beli WHERE No_Beli=?) B LEFT JOIN para_supplier S ON (S.SupID=B.SupID)", [$this->no_beli]); + if (count($ainfo) > 0) { + $ajurnal = [ + 'Kode_Jurnal' => $ainfo['No_Beli'], + 'TipeID' => 5, + 'CabID' => $ainfo['CabID'], + 'Tanggal' => tgl_sql2str($ainfo['Tgl_Beli']), + 'Kode_Ref' => $ainfo['No_Beli'], + 'Catatan' => "Pembelian : ".$ainfo['No_Beli'].(($ainfo['No_Faktur']=="")?"":" (Faktur : ".$ainfo['No_Faktur'].") ")." / ".$ainfo['Nama_Sup'] + ]; + $adetail = [ + [ + 'Kode_Rek' => $this->app_gel['STOK'], + 'DK' => "D", + 'Jumlah' => $ainfo['Tagihan'] + ], + [ + 'Kode_Rek' => $this->app_gel['HUT_USAHA'], + 'DK' => "K", + 'Jumlah' => $ainfo['Tagihan'], + 'SupID' => $ainfo['SupID'] + ] + ]; + $this->gel->Jurnal_Post($ajurnal, $adetail); + } + $atabel = $this->Data_Beli($this->no_beli); + $this->mode = "view"; + + } else if ($this->mode === "cancel") { + if (str_ends_with($this->no_beli, "#00") || !$this->is_pend) $this->inv->Detail_Cancel($this->no_beli); + $atabel = $this->Data_Beli(); + } else { + $atabel = $this->Data_Beli($this->no_beli); + } + + $enable = in_array($this->mode, ["add","edit"]) ? true : false; + $form = new Form($this->app); + $tnota = $form->textbox("_", "No_Beli", $atabel['No_Beli'], !$enable, true, "text", "nomor transaksi"); + $tfaktur = $form->textbox("_", "No_Faktur", $atabel['No_Faktur'], $enable, true, "text", "nomor faktur"); + $ttglnota = $form->datebox("_", "Tgl_Beli", $atabel['Tgl_Beli'], $enable, true); + $ttglfaktur = $form->datebox("_", "Tgl_Faktur", $atabel['Tgl_Faktur'], $enable, true); + $tcab = $form->option_db("_", "CabID", $atabel['CabID'], $enable, false, "para_cabang", ["CabID","Nama_Cab"], "Aktif=1 ORDER BY Nama_Cab", [0," "]); + $tsup = $form->option_db("_", "SupID", $atabel['SupID'], $enable, false, "para_supplier", ["SupID","Nama_Sup"], "Aktif=1 ORDER BY Nama_Sup", [0," "]); + $tppn = ''; + if ($enable) { + $tppn = $form->option("_", "PPN", $atabel['PPN'], true, false, Invesa::PPN_Array()); + $tppn = str_replace("option-tags", "", $tppn); + } + $ajson['html'] = ' +
+
+
+ +
'.$tnota.'
+
+
+ +
'.$ttglnota.'
+
+
+ +
'.$ttglfaktur.'
+
+
+
+
+ +
'.$tcab.'
+
+
+ +
'.$tsup.'
+
+
+ +
'.$tfaktur.$tppn.'
+
+
+
+

+ + + + + '; + $this->app->json($ajson); + } + + public function form_produk() { + $id = (int) Param::Get("ID", 0); + $atabel = [ 'ID'=>$id, 'InvID'=>$this->id_inv, 'SatuanID'=>$this->id_satuan, 'VarianID'=>$this->id_varian, 'Nama_Produk'=>"", 'Nama_Satuan'=>"", 'Qty'=>0, 'Harga_Beli'=>0, 'Disk_Rupiah'=>0, 'Disk_Persen1'=>0, 'Disk_Persen2'=>0, 'Disk_Persen3'=>0, 'Disk_Persen4'=>0, 'Disk_Persen5'=>0 ]; + if ($id > 0) { + $_row = $this->db->fetchRow("SELECT * FROM tmp_inv_detail WHERE No_Ref=? AND ID=?", [$this->no_beli, $id]); + if ($_row) $atabel = array_merge($atabel, $_row->getData()); + } + if ((int) $atabel['InvID'] > 0 && (int) $atabel['SatuanID'] > 0) { + $_row = $this->db->fetchRow("SELECT Nama_Produk,Nama_Satuan FROM vi_inv_produk WHERE InvID=? AND SatuanID=? AND VarianID=?", [$atabel['InvID'], $atabel['SatuanID'], $atabel['VarianID']]); + if ($_row) $atabel = array_merge($atabel, $_row->getData()); + } + + $form = new Form($this->app); + $tnama = $form->textauto("_", "Nama_Produk", ['value'=>$atabel['InvID'],'text'=>$atabel['Nama_Produk']], true, true, "ketik nama produk"); + $tvar = $form->option("_", "VarianID", $atabel['VarianID'], true, false, [$atabel['VarianID']=>"Tanpa Varian"]); + $tqty = $form->textbox("_", "Qty", $atabel['Qty'], true, true, "double"); + $tbeli = $form->textbox("_", "Harga_Beli", $atabel['Harga_Beli'], true, true, "double"); + $tdisrp = $form->textbox("_", "Disk_Rupiah", $atabel['Disk_Rupiah'], true, true, "double"); + $tdis1 = $form->textbox("_", "Disk_Persen1", $atabel['Disk_Persen1'], true, true, "double"); + $tdis2 = $form->textbox("_", "Disk_Persen2", $atabel['Disk_Persen2'], true, true, "double"); + $tdis3 = $form->textbox("_", "Disk_Persen3", $atabel['Disk_Persen3'], true, true, "double"); + $tdis4 = $form->textbox("_", "Disk_Persen4", $atabel['Disk_Persen4'], true, true, "double"); + $tdis5 = $form->textbox("_", "Disk_Persen5", $atabel['Disk_Persen5'], true, true, "double"); + $ttot_dis = $form->textbox("_", "Total_Diskon", 0, false, false, "double"); + $ttot = $form->textbox("_", "Jumlah", 0, false, false, "double"); + $tsat = $form->textbox("_", "Nama_Satuan", $atabel['Nama_Satuan'], false, false, "text"); + $ajson['html'] = ' +
+ +
'.$tnama.'
+
+
+ +
'.$tvar.'
+
+
+ +
'.$tqty.$tsat.'
+
+
+ +
'.$tbeli.'
+
+
+
+ +
'.$tdisrp.'
+
+
+ +
1'.$tdis1.'%
+
3'.$tdis3.'%
+
5'.$tdis5.'%
+
+
+ +
2'.$tdis2.'%
+
4'.$tdis4.'%
+
'.Invesa::Form_Info("Silakan masukkan -10 pada Diskon 5, jika ada PPN.").'
+
+
+
+ +
'.$ttot_dis.'
+
+
+ +
'.$ttot.'
+
+ + + + '; + $this->app->json($ajson); + } + + public function form_total() { + $form = new Form($this->app); + $tdisk = $form->textbox("_", "popTotal_Diskon", 0, true, false, "double"); + $tbeli = $form->textbox("_", "popTotal_Beli", 0, true, false, "double"); + $ajson['html'] = ' +
+ +
'.$tdisk.'
+
+
+ +
'.$tbeli.'
+
+ '; + $this->app->json($ajson); + } + + public function proses_delete() { + if ($this->is_pend === false) { + $this->db->runQuery("DELETE FROM inv_beli WHERE No_Beli=?", [$this->no_beli]); + $this->db->runQuery("DELETE FROM inv_detail WHERE No_Ref=?", [$this->no_beli]); + // PROSES POSTING GL + $this->db->runQuery("DELETE FROM gel_jurnal WHERE Kode_Jurnal=?", [$this->no_beli]); + $this->db->runQuery("DELETE FROM gel_jurnal_detail WHERE Kode_Jurnal=?", [$this->no_beli]); + } else { + $this->db->runQuery("DELETE FROM inv_beli_pend WHERE No_Beli=?", [$this->no_beli]); + $this->db->runQuery("DELETE FROM tmp_inv_detail WHERE No_Ref=?", [$this->no_beli]); + } + $this->app->json([ 'status' => true ]); + } + + public function option_varian() { + $aoption = ['type' => "option", 'id' => "VarianID", 'value' => $this->id_varian, 'avalue' => [['value'=>0, 'html'=>"Tanpa Varian"]]]; + $avarian = $this->db->fetchAll("SELECT * FROM para_varian WHERE VarianID IN (SELECT VarianID FROM inv_produk_varian WHERE InvID=? AND SatuanID=?) ORDER BY Nama_Varian", [$this->id_inv, $this->id_satuan]); + foreach ($avarian as $varian) { + $aoption['avalue'][] = ['value'=>$varian['VarianID'], 'html'=>$varian['Nama_Varian']]; + } + $this->app->json([ $aoption ]); + } + + public function item_detail() { + $ajson['data'] = []; + $_row = $this->db->fetchRow("SELECT * FROM inv_detail D WHERE Qty>0 AND InvID=? ORDER BY Tgl_Ref DESC", [$this->id_inv]); + if ($_row) $ajson['data'] = $_row->getData(); + + if ($this->id_satuan !== (int) $ajson['data']['SatuanID']) { + $_bagi = (float) $this->db->fetchField("SELECT A.Qty/B.Qty Bagi FROM (SELECT InvID,Qty FROM inv_produk_kemasan WHERE InvID=? AND SatuanID=? LIMIT 1) A LEFT JOIN (SELECT InvID,Qty FROM inv_produk_kemasan WHERE InvID=? AND SatuanID=? LIMIT 1) B ON (A.InvID=B.InvID)", [$this->id_inv, $this->id_satuan, $this->id_inv, $this->id_satuan]) ?? 1; + (float) $ajson['data']['Harga_Beli'] /= $_bagi; + (float) $ajson['data']['Disk_Rupiah'] /= $_bagi; + } + $this->app->json($ajson); + } + + public function index() { + $this->app->json(['html' => ' +
+
+ +
+
+
 
+
 
+
+
+
+
' + ]); + } + + private function Data_Beli(string $nomor="", bool $baru=false): array { + $aparam = [ 'No_Beli'=>$nomor, 'PPN'=>0, 'Lunas'=>0 ]; + if (empty($nomor)) { + if ($baru) $aparam['No_Beli'] = "BELI".$this->web_app['SERVER_ID'].(string) $this->id_cab.$this->app->user()->id(3)."#00"; + $aparam['Tgl_Beli'] = tgl_ymd(); + $aparam['Tgl_Faktur'] = tgl_ymd(); + $aparam['No_Faktur'] = ""; + $aparam['SupID'] = 0; + $aparam['CabID'] = $this->id_cab; + $aparam['Total_Beli'] = 0; + $aparam['Real_Beli'] = 0; + $aparam['Real_Diskon'] = 0; + } else { + $tabel_beli = (str_contains($nomor, "BELI") === false) ? "inv_beli" : "inv_beli_pend"; + $row = $this->db->fetchRow("SELECT * FROM ".$tabel_beli." WHERE No_Beli=?", [$nomor]); + if ($row) $aparam = array_merge($aparam, $row->getData()); + } + return $aparam; + } + + private function Pending_Nomor(): string { + $tno = "BELI".$this->web_app['SERVER_ID'].(string) $this->id_cab.$this->app->user()->id(3)."#"; + $ino = (int) $this->db->fetchField("SELECT MAX(RIGHT(No_Beli,2)) FROM inv_beli_pend WHERE No_Beli LIKE ?", [$tno.'%']) ?? 0; + $tno .= isi_nol(++$ino, 2); + return $tno; + } +} diff --git a/app/Controller/Inv/BelireturController.php b/app/Controller/Inv/BelireturController.php new file mode 100644 index 0000000..3e5b692 --- /dev/null +++ b/app/Controller/Inv/BelireturController.php @@ -0,0 +1,392 @@ +app = $app; + $this->db = $db; + $this->web_app = (array) $session->get('WEB_APP'); + $this->app_gel = (array) $session->get('APP_GEL'); + $this->id_cab = Param::Int("CabID", $session->get('APP_INV')['CABANGID']); + $this->mode = Param::Get("mode", ""); + $this->mode_detail = Param::Get("mode_detail", ""); + $this->no_beli = Param::Get("No_Beli", ""); + $this->is_baru = str_contains($this->no_beli, "BERE") === true; + $this->id_inv = Param::Int("InvID", 0); + $this->id_satuan = Param::Int("SatuanID", 0); + $this->id_varian = Param::Int("VarianID", 0); + $this->inv = new Inv($app); + $this->gel = new Gel($app); + } + + public function table_detail() { + if (in_array($this->mode_detail, ["insert","update","delete"])) { + $iqty = Param::Float("Qty", 0) * -1; + + $sql = new SQL($this->app); + $sql->set_table("tmp_inv_detail"); + $sql->add_param("No_Ref", $this->no_beli); + $sql->add_param("InvID"); + $sql->add_param("SatuanID"); + $sql->add_param("VarianID"); + $sql->add_param("Qty", $iqty); + $sql->add_param("Harga_Beli"); + $sql->add_param("Harga_Jual", "Harga_Beli", true); + $sql->add_param_unix(); + $sql->add_param_userid(); + $sql->add_where("ID"); + $sql->add_where("No_Ref", $this->no_beli); + + if ( $this->mode_detail === "insert" ) { + $sql->InsertDB(); + } else if ( $this->mode_detail === "update" ) { + $sql->UpdateDB(); + } else if ( $this->mode_detail === "delete" ) { + $sql->DeleteDB(); + } + } + + $tsql = ''; $asql = [$this->no_beli]; $qtabel = "inv_detail"; + if (in_array($this->mode, ["add","edit"])) { + if ($this->mode === "add") { $tsql = " AND Unix=?"; $asql[] = $this->app->user()->unix(); } + $qtabel = "tmp_inv_detail"; + } + + $obj = new Table($this->app); + $obj->set_table("(SELECT *,-Qty Qty2,(-Qty*Harga_Beli) Total FROM ".$qtabel." WHERE No_Ref=?".$tsql.") D LEFT JOIN vi_inv_produk P ON (D.InvID=P.InvID AND D.SatuanID=P.SatuanID AND D.VarianID=P.VarianID)", "D.*,P.Kode_SKU,P.Nama_Lengkap", "", $asql); + $obj->set_footer("SUM(D.Total) Total"); + $obj->add_field("ID", "No", "c"); + $obj->add_field("InvID", "InvID", "hid"); + $obj->add_field("SatuanID", "SatuanID", "hid"); + $obj->add_field("VarianID", "VarianID", "hid"); + $obj->add_field("Kode_SKU", "SKU", "c"); + $obj->add_field("Nama_Lengkap", "Nama Barang", "awr"); + $obj->add_field("Qty2", "Qty", "r", "rupiah2"); + $obj->add_field("Harga_Beli", "Harga @", "r", "rupiah"); + $obj->add_field("Total", "Jumlah", "r", "rupiah", "rupiah"); + $obj->set_field_order("ID", "D"); + if (in_array($this->mode, ["add","edit"])) { + $obj->add_row_btn("clipboard", "Ubah", "BeliReturJS.detail_ubah"); + $obj->add_row_btn("trash", "Hapus", "BeliReturJS.detail_hapus", "Unix", $this->app->user()->unix()); + $obj->set_func_btn("BeliReturJS.detail_tambah", ' Produk'); + $obj->set_func_btn("BeliReturJS.produk_brow", ' Browse'); + } + $ajson[] = $obj->json_table("divDetailTabel"); + $this->app->json($ajson); + } + + public function brow_tx() { + $tcari = Param::Get("Cari_TX"); + $tsql = ''; $asql = []; + if (!empty($tcari)) { + $tsql .= "CONCAT(B.No_Beli,B.No_Faktur,S.Nama_Sup,DATE_FORMAT(B.Tgl_Faktur,'%d-%m-%Y')) LIKE ?"; + $asql[] = '%' . $tcari . '%'; + } + + $obj = new Table($this->app); + $obj->set_table("(SELECT * FROM inv_beli WHERE Data_Beli=0) B LEFT JOIN para_supplier S ON (B.SupID=S.SupID) LEFT JOIN para_cabang C ON (C.CabID=B.CabID)", "B.*,S.Nama_Sup,C.Kode_Cab", $tsql, $asql); + $obj->add_field("No_Beli", "No. Trans", "c"); + $obj->add_field("Tgl_Beli", "Tgl. Trans", "c", "sqltgl", "", "val-tgl"); + $obj->add_field("Kode_Cab", "Cabang", "c"); + $obj->add_field("Nama_Sup", "Nama Supplier", "awr"); + $obj->add_field("Total_Beli", "Total", "r", "rupiah2"); + $obj->set_field_order("Tgl_Beli", "D"); + $obj->set_func_select("BeliReturJS.tx_select"); + $this->app->json([ $obj->db_table("divBrowTX") ]); + } + + public function brow_produk() { + $tcari = Param::Get("Cari_Produk"); + $tsql = ''; $asql = [1]; + if (!empty($tcari)) { + $tsql .= " AND P.Barcode_Nama LIKE ?"; + $asql[] = '%' . $tcari . '%'; + } + + $obj = new Table($this->app); + $obj->set_table("vi_inv_produk P", "P.*", "P.Aktif=?".$tsql, $asql); + $obj->add_field("InvID", "ID", "hid"); + $obj->add_field("SatuanID", "ID", "hid"); + $obj->add_field("VarianID", "ID", "hid"); + $obj->add_field("Kode_SKU", "SKU", "c"); + $obj->add_field("Kode_Barcode", "Barcode", "c"); + $obj->add_field("Nama_Lengkap", "Nama Barang", "awr"); + $obj->set_field_order("Kode_SKU", "A"); + $obj->set_func_select("BeliReturJS.produk_select"); + $this->app->json([ $obj->db_table("divBrowProduk") ]); + } + + public function auto_produk() { + $tcari = Param::Get("Auto_Query", ""); + $ajson['autodata'] = []; + $bcode = 0; $arec = []; + + // Cari by SKU + Barcode + $_row = $this->db->fetchRow("SELECT V.InvID,P.Nama_Produk,CONCAT(V.SatuanID,':',V.VarianID,':',S.Nama_Satuan) Data2 FROM (SELECT * FROM inv_produk_varian WHERE Kode_SKU=? OR Kode_Barcode=? LIMIT 1) V LEFT JOIN inv_produk P ON (P.InvID=V.InvID) LEFT JOIN para_satuan S ON (S.SatuanID=V.SatuanID) WHERE P.Aktif=1", [$tcari, $tcari]); + if ($_row) { + $bcode = 1; + $arec = $_row->getData(); + } + + if ($bcode === 1) { + $ajson['autodata'][] = ['value'=>$arec['InvID'], 'text'=>$arec['Nama_Produk'], 'data'=>$arec['Data2'], 'bc'=>1]; + } else { + $stat = $this->db->runQuery("SELECT P.InvID,P.Nama_Produk,V.Kode_SKU,IFNULL(MV.Nama_Varian,'') Nama_Varian,MS.Nama_Satuan,CONCAT(V.SatuanID,':',V.VarianID,':',MS.Nama_Satuan) Data2 FROM (SELECT * FROM inv_produk WHERE Nama_Produk LIKE ? AND Aktif=1) P INNER JOIN inv_produk_varian V ON (V.InvID=P.InvID) LEFT JOIN para_satuan MS ON (MS.SatuanID=V.SatuanID) LEFT JOIN para_varian MV ON (MV.VarianID=V.VarianID) ORDER BY P.Nama_Produk,MS.Nama_Satuan LIMIT 50", ['%'.$tcari.'%']); + while ($row = $stat->fetch(SimplePdo::FETCH_ASSOC)) { + $ajson['autodata'][] = ['value'=>$row['InvID'], 'text'=>$row['Nama_Produk'], 'html'=>''.$row['Kode_SKU'].' '.$row['Nama_Produk']." ".$row['Nama_Varian']." ".$row['Nama_Satuan'], 'data'=>$row['Data2'], 'bc'=>0]; + } + } + $this->app->json($ajson); + } + + public function form_master() { + $ajson = [ 'error'=>"", 'html'=>"" ]; + $atabel = []; + + if ($this->mode === "add") { + $atabel = $this->Data_Beli("", true); + } else if ($this->mode === "edit") { + $this->inv->Detail_Copy($this->no_beli, true); + $atabel = $this->Data_Beli($this->no_beli); + } else if ($this->mode === "save") { + $no_lama = $this->no_beli; + if ($this->is_baru) { + $this->no_beli = $this->inv->Nomor_Baru("R", Param::Get("Tgl_Beli"), true); + } + $this->inv->Detail_Save($this->no_beli, 4, $this->id_cab, Param::Get("Tgl_Beli"), $this->is_baru, $no_lama); + + $tot_retur = $this->db->fetchField("SELECT SUM(Qty*Harga_Beli) Retur_Beli FROM inv_detail WHERE No_Ref=?", [$this->no_beli]) ?? 0; + + $sql = new SQL($this->app); + $sql->set_table("inv_beli"); + $sql->add_param_date("Tgl_Beli"); + $sql->add_param("CabID"); + $sql->add_param("SupID"); + $sql->add_param("Total_Beli", $tot_retur); + $sql->add_param("Real_Beli", $tot_retur); + $sql->add_param("No_Faktur"); + $sql->add_param("Tgl_Faktur", "Tgl_Beli", true); + $sql->add_param("Data_Beli", 0); + $sql->add_param_stamp(); + $sql->add_param_userid(); + $sql->add_where("No_Beli", $this->no_beli); + $sql->UpdateDB(); + + $this->gel->Update_Lunas_Sup(Param::Int("SupID", 0)); + + // PROSES POSTING GL + $ainfo = $this->db->fetchRow("SELECT B.*,S.Nama_Sup,-B.Real_Beli Tagihan FROM (SELECT * FROM inv_beli WHERE No_Beli=?) B LEFT JOIN para_supplier S ON (S.SupID=B.SupID)", [$this->no_beli]); + if (count($ainfo) > 0) { + $ajurnal = [ + 'Kode_Jurnal' => $ainfo['No_Beli'], + 'TipeID' => 6, + 'CabID' => $ainfo['CabID'], + 'Tanggal' => tgl_sql2str($ainfo['Tgl_Beli']), + 'Kode_Ref' => $ainfo['No_Beli'], + 'Catatan' => "Retur Pembelian : ".$ainfo['No_Beli']." / ".$ainfo['Nama_Sup'] + ]; + $adetail = [ + [ 'Kode_Rek' => $this->app_gel['STOK'], 'DK' => "K", 'Jumlah' => $ainfo['Tagihan'] ], + [ 'Kode_Rek' => $this->app_gel['HUT_USAHA'], 'DK' => "D", 'Jumlah' => $ainfo['Tagihan'], 'SupID' => $ainfo['SupID'] ] + ]; + $this->gel->Jurnal_Post($ajurnal, $adetail); + } + $atabel = $this->Data_Beli($this->no_beli); + $this->mode = "view"; + + } else if ($this->mode === "cancel") { + $this->inv->Detail_Cancel($this->no_beli); + $atabel = $this->Data_Beli(); + } else { + $atabel = $this->Data_Beli($this->no_beli); + } + + $enable = in_array($this->mode, ["add","edit"]) ? true : false; + $form = new Form($this->app); + $tnota = $form->textbox("_", "No_Beli", $atabel['No_Beli'], !$enable, true, "text", "nomor transaksi"); + $ttglnota = $form->datebox("_", "Tgl_Beli", $atabel['Tgl_Beli'], $enable, true); + $tcab = $form->option_db("_", "CabID", $atabel['CabID'], $enable, false, "para_cabang", ["CabID","Nama_Cab"], "Aktif=1 ORDER BY Nama_Cab", [0," "]); + $tsup = $form->option_db("_", "SupID", $atabel['SupID'], $enable, false, "para_supplier", ["SupID","Nama_Sup"], "Aktif=1 ORDER BY Nama_Sup", [0," "]); + $tcatat = $form->textbox("_", "No_Faktur", $atabel['No_Faktur'], $enable, true, "text", "catatan"); + $ajson['html'] = ' +
+
+
+ +
'.$tnota.'
+
+
+ +
'.$ttglnota.'
+
+
+
+
+ +
'.$tcab.'
+
+
+ +
'.$tsup.'
+
+
+
+
+ +
'.$tcatat.'
+
+

+ + '; + $this->app->json($ajson); + } + + public function form_produk() { + $id = (int) Param::Get("ID", 0); + $atabel = [ 'ID'=>$id, 'InvID'=>$this->id_inv, 'SatuanID'=>$this->id_satuan, 'VarianID'=>$this->id_varian, 'Nama_Produk'=>"", 'Nama_Satuan'=>"", 'Qty2'=>0, 'Harga_Beli'=>0 ]; + if ($id > 0) { + $_row = $this->db->fetchRow("SELECT *,-Qty Qty2 FROM tmp_inv_detail WHERE No_Ref=? AND ID=?", [$this->no_beli, $id]); + if ($_row) $atabel = array_merge($atabel, $_row->getData()); + } + if ((int) $atabel['InvID'] > 0 && (int) $atabel['SatuanID'] > 0) { + $_row = $this->db->fetchRow("SELECT Nama_Produk,Nama_Satuan FROM vi_inv_produk WHERE InvID=? AND SatuanID=? AND VarianID=?", [$atabel['InvID'], $atabel['SatuanID'], $atabel['VarianID']]); + if ($_row) $atabel = array_merge($atabel, $_row->getData()); + } + + $form = new Form($this->app); + $tnama = $form->textauto("_", "Nama_Produk", ['value'=>$atabel['InvID'],'text'=>$atabel['Nama_Produk']], true, true, "ketik nama produk"); + $tvar = $form->option("_", "VarianID", $atabel['VarianID'], true, false, [$atabel['VarianID']=>"Tanpa Varian"]); + $tqty = $form->textbox("_", "Qty", $atabel['Qty2'], true, true, "double"); + $tbeli = $form->textbox("_", "Harga_Beli", $atabel['Harga_Beli'], true, true, "double"); + $ttot = $form->textbox("_", "Jumlah", 0, false, false, "double"); + $tsat = $form->textbox("_", "Nama_Satuan", $atabel['Nama_Satuan'], false, false, "text"); + $ajson['html'] = ' +
+ +
'.$tnama.'
+
+
+ +
'.$tvar.'
+
+
+ +
'.$tqty.$tsat.'
+
+
+ +
'.$tbeli.'
+
+
+ +
'.$ttot.'
+
+ + + + '; + $this->app->json($ajson); + } + + public function proses_delete() { + $this->db->runQuery("DELETE FROM inv_beli WHERE No_Beli=?", [$this->no_beli]); + $this->db->runQuery("DELETE FROM inv_detail WHERE No_Ref=?", [$this->no_beli]); + // PROSES POSTING GL + $this->db->runQuery("DELETE FROM gel_jurnal WHERE Kode_Jurnal=?", [$this->no_beli]); + $this->db->runQuery("DELETE FROM gel_jurnal_detail WHERE Kode_Jurnal=?", [$this->no_beli]); + $this->app->json([ 'status' => true ]); + } + + public function option_varian() { + $aoption = ['type' => "option", 'id' => "VarianID", 'value' => $this->id_varian, 'avalue' => [['value'=>0, 'html'=>"Tanpa Varian"]]]; + $avarian = $this->db->fetchAll("SELECT * FROM para_varian WHERE VarianID IN (SELECT VarianID FROM inv_produk_varian WHERE InvID=? AND SatuanID=?) ORDER BY Nama_Varian", [$this->id_inv, $this->id_satuan]); + foreach ($avarian as $varian) { + $aoption['avalue'][] = ['value'=>$varian['VarianID'], 'html'=>$varian['Nama_Varian']]; + } + $this->app->json([ $aoption ]); + } + + public function index() { + $this->app->json(['html' => ' +
+
+ +
+
+
 
+
 
+
+
+
+
' + ]); + } + + private function Data_Beli(string $nomor="", bool $baru=false): array { + $aparam = [ 'No_Beli'=>$nomor, 'Lunas'=>0 ]; + if (empty($nomor)) { + if ($baru) $aparam['No_Beli'] = "BERE".$this->web_app['SERVER_ID'].(string) $this->id_cab.$this->app->user()->id(3)."#00"; + $aparam['Tgl_Beli'] = tgl_ymd(); + $aparam['No_Faktur'] = ""; + $aparam['SupID'] = 0; + $aparam['CabID'] = $this->id_cab; + } else { + $row = $this->db->fetchRow("SELECT * FROM inv_beli WHERE Data_Beli=0 AND No_Beli=?", [$nomor]); + if ($row) $aparam = array_merge($aparam, $row->getData()); + } + return $aparam; + } +} diff --git a/app/Controller/Inv/CekhargaController.php b/app/Controller/Inv/CekhargaController.php new file mode 100644 index 0000000..418faeb --- /dev/null +++ b/app/Controller/Inv/CekhargaController.php @@ -0,0 +1,137 @@ +app = $app; + $this->db = $db; + $this->id_grup_member = $session->get('APP_INV')['ECERANID']; + $this->id_inv = Param::Int("InvID", 0); + } + + public function brow_produk() { + $tcari = Param::Get("Cari_Produk"); + $tsql = ''; $asql = [1, $this->id_grup_member]; + if (!empty($tcari)) { + $tsql .= " AND Barcode_Nama LIKE ?"; + $asql[] = '%' . $tcari . '%'; + } + + $obj = new Table($this->app); + $obj->set_table("inv_produk_join", "*", "Aktif=? AND Grup_MemberID=? AND Harga_Jual>0".$tsql, $asql); + $obj->add_field("InvID", "ID", "hid"); + $obj->add_field("Kode_SKU", "SKU", "c"); + $obj->add_field("Kode_Barcode", "Barcode", "c"); + $obj->add_field("Nama_Lengkap", "Nama Barang", "awr"); + $obj->add_field("Harga_Jual", "Harga Jual", "r", "rupiah"); + $obj->add_field("Satuan_Kemasan", "Satuan", "hid"); + $obj->set_field_order("Kode_SKU", "A"); + $obj->set_func_select("CekHargaJS.produk_select"); + $this->app->json([ $obj->db_table("divBrowProduk") ]); + } + + public function auto_produk() { + $tcari = Param::Get("Auto_Query", ""); + $ajson['autodata'] = []; + $bcode = 0; $arec = []; + + // Cari by SKU + Barcode + // Kode_SKU + Kode_Barcode : Satuan_Kemasan : Harga_Jual + $_row = $this->db->fetchRow("SELECT P.InvID,P.Nama_Produk_Varian,CONCAT(P.Kode_SKU,' / ',P.Kode_Barcode,':',P.Satuan_Kemasan,':',CONVERT(FORMAT(P.Harga_Jual,2) USING UTF8)) Data2 FROM (SELECT * FROM inv_produk_join WHERE Aktif=1 AND Harga_Jual>0 AND Grup_MemberID=? AND (Kode_SKU=? OR Kode_Barcode=?)) P", [$this->id_grup_member, $tcari, $tcari]); + if ($_row) { + $bcode = 1; + $arec = $_row->getData(); + } + if ($bcode === 1) { + $ajson['autodata'][] = ['value'=>$arec['InvID'], 'text'=>$arec['Nama_Produk_Varian'], 'data'=>$arec['Data2'], 'bc'=>1]; + } else { + $stat = $this->db->runQuery("SELECT P.InvID,P.Nama_Lengkap,P.Nama_Produk_Varian,P.Kode_SKU,P.Harga_Jual,CONCAT(P.Kode_SKU,' / ',P.Kode_Barcode,':',P.Satuan_Kemasan,':',CONVERT(FORMAT(P.Harga_Jual,2) USING UTF8)) Data2 FROM (SELECT * FROM inv_produk_join WHERE Barcode_Nama LIKE ? AND Aktif=1 AND Harga_Jual>0 AND Grup_MemberID=?) P ORDER BY P.Nama_Produk,P.Qty LIMIT 50", ['%'.$tcari.'%', $this->id_grup_member]); + while ($row = $stat->fetch(SimplePdo::FETCH_ASSOC)) { + $ajson['autodata'][] = ['value'=>$row['InvID'], 'text'=>$row['Nama_Produk_Varian'], 'html'=>''.$row['Kode_SKU'].' '.$row['Nama_Lengkap'].' - Rp'.rupiah($row['Harga_Jual']).'', 'data'=>$row['Data2'], 'bc'=>0]; + } + } + $this->app->json($ajson); + } + + public function scan_produk() { + $tcari = Param::Get("Cari_Produk", ""); + $scandata = ['Nama_Supplier'=>"BELUM ADA"]; + + // Cari by SKU + Barcode + // InvID : Kode_SKU + Kode_Barcode : Nama_Lengkap : Satuan_Kemasan : Harga_Jual + $_row = $this->db->fetchRow("SELECT P.InvID,CONCAT(K.Kode_SKU,' / ',K.Kode_Barcode) Kode_Barang,P.Nama_Produk_Varian Nama_Barang,P.Satuan_Kemasan Nama_Satuan,CONVERT(FORMAT(P.Harga_Jual,2) USING UTF8) Harga_Jual FROM (SELECT * FROM inv_produk_join WHERE Aktif=1 AND Harga_Jual>0 AND Grup_MemberID=? AND (Kode_SKU=? OR Kode_Barcode=?)) P", [$this->id_grup_member, $tcari, $tcari]); + if ($_row) $scandata = array_merge($scandata, $_row->getData()); + + if (isset($scandata['InvID']) && $scandata['InvID'] > 0) { + $_row = $this->db->fetchRow("SELECT Nama_Sup Nama_Supplier FROM para_supplier WHERE SupID=(SELECT SupID FROM inv_produk_sup WHERE InvID=? ORDER BY Aktif DESC LIMIT 1)", [$scandata['InvID']]); + if ($_row) $scandata = array_merge($scandata, $_row->getData()); + } + $this->app->json([ $scandata ]); + } + + public function update_sup() { + $n_sup = $this->db->fetchField("SELECT Nama_Sup FROM para_supplier WHERE SupID=(SELECT SupID FROM inv_produk_sup WHERE InvID=? ORDER BY Aktif DESC LIMIT 1)", [$this->id_inv]) ?? "BELUM ADA"; + $this->app->json([ ['type'=>"form", 'id'=>"Nama_Supplier", 'value'=>$n_sup] ]); + } + + public function index() { + $form = new Form($this->app); + $tbrg = $form->textauto("_", "Nama_Produk", ['value'=>0, 'text'=>""], true, true, "Scan SKU / Barcode / Ketik Nama Barang"); + $tkode = $form->textbox("_", "Kode_Barang", "KODE_SKU / KODE_BARCODE", false); + $tnama = $form->textbox("_", "Nama_Barang", "NAMA_BARANG", false); + $tsat = $form->textbox("_", "Nama_Satuan", "SATUAN", false); + $tharga = $form->textbox("_", "Harga_Jual", "", false); + $tsup = $form->textbox("_", "Nama_Supplier", "", false); + $ajson['html'] = ''; + if (isMobile()) { + $ajson['html'] .= ' +
+
+
Kode SKU / Barcode
'.$tkode.'
+ '; + } else { + $ajson['html'] .= ' +
Kunci Pencarian
'.$tbrg.'
+
+
Kode SKU / Barcode
'.$tkode.'
+ '; + } + + $ajson['html'] .= ' +
Nama Barang
'.$tnama.'
+
Satuan
'.$tsat.'
+
Harga Jual @
'.$tharga.'
+
Supplier
'.$tsup.'
+ '; + $this->app->json($ajson); + } + +} diff --git a/app/Controller/Inv/JualController.php b/app/Controller/Inv/JualController.php new file mode 100644 index 0000000..ace028d --- /dev/null +++ b/app/Controller/Inv/JualController.php @@ -0,0 +1,567 @@ +app = $app; + $this->db = $db; + $this->web_app = (array) $session->get('WEB_APP'); + $this->app_gel = (array) $session->get('APP_GEL'); + $this->id_cab = Param::Int("CabID", $session->get('APP_INV')['CABANGID']); + $this->id_member = Param::Int("MemberID", 0); + $this->id_grup_member = Param::Int("Grup_MemberID", $session->get('APP_INV')['ECERANID']); + $this->mode = Param::Get("mode", ""); + $this->mode_detail = Param::Get("mode_detail", ""); + $this->no_jual = Param::Get("No_Jual", ""); + $this->is_pend = str_contains($this->no_jual, "JUAL") === true; + $this->id_inv = Param::Int("InvID", 0); + $this->id_satuan = Param::Int("SatuanID", 0); + $this->id_varian = Param::Int("VarianID", 0); + $this->inv = new Inv($app); + $this->gel = new Gel($app); + } + + public function table_detail() { + if (in_array($this->mode_detail, ["insert","update","delete"])) { + $iqty = Param::Float("Qty", 0) * -1; + $disk_rp = Param::Float("Disk_Rupiah", 0); + $disk_psn = Param::Float("Disk_Persen", 0); + if ($disk_psn > 0) $disk_rp = Param::Float("Harga_Jual", 0) * $disk_psn * 0.01; + if ($iqty === 0) $disk_rp = 0; + + $sql = new SQL($this->app); + $sql->set_table("tmp_inv_detail"); + $sql->add_param("No_Ref", $this->no_jual); + $sql->add_param("InvID"); + $sql->add_param("SatuanID"); + $sql->add_param("VarianID"); + $sql->add_param("Qty", $iqty); + $sql->add_param("Harga_Beli"); + $sql->add_param("Harga_Jual"); + $sql->add_param("Disk_Rupiah", $disk_rp); + $sql->add_param("Total_Diskon", "Disk_Rupiah*-Qty", true); + $sql->add_param_unix(); + $sql->add_param_userid(); + $sql->add_where("ID"); + $sql->add_where("No_Ref", $this->no_jual); + + if ( $this->mode_detail === "insert" ) { + $sql->InsertDB(); + } else if ( $this->mode_detail === "update" ) { + $sql->UpdateDB(); + } else if ( $this->mode_detail === "delete" ) { + $sql->DeleteDB(); + } + } + + $tsql = ''; $asql = [$this->no_jual]; $qtabel = "inv_detail"; + if ($this->is_pend) $qtabel = "tmp_inv_detail"; + if (in_array($this->mode, ["add","edit"])) { + if ($this->mode === "add") { $tsql = " AND Unix=?"; $asql[] = $this->app->user()->unix(); } + $qtabel = "tmp_inv_detail"; + } + + $obj = new Table($this->app); + $obj->set_table("(SELECT * FROM ".$qtabel." WHERE No_Ref=?".$tsql.") D LEFT JOIN vi_inv_produk P ON (D.InvID=P.InvID AND D.SatuanID=P.SatuanID AND D.VarianID=P.VarianID)", "D.*,-D.Qty Qty2,P.Kode_SKU,P.Nama_Lengkap,(-D.Qty*D.Harga_Jual)-D.Total_Diskon Total", "", $asql); + $obj->set_footer("COUNT(*) Harga_Jual,SUM(D.Total_Diskon) Disk_Rupiah,SUM((-D.Qty*D.Harga_Jual)-D.Total_Diskon) Total"); + $obj->add_field("ID", "No", "c"); + $obj->add_field("InvID", "InvID", "hid"); + $obj->add_field("SatuanID", "SatuanID", "hid"); + $obj->add_field("VarianID", "VarianID", "hid"); + $obj->add_field("Kode_SKU", "SKU", "c"); + $obj->add_field("Nama_Lengkap", "Nama Barang", "awr"); + $obj->add_field("Qty2", "Qty", "r", "rupiah2"); + $obj->add_field("Harga_Jual", "Harga @", "r", "rupiah", "items"); + $obj->add_field("Disk_Rupiah", "Diskon @", "r", "rupiah", "rupiah"); + $obj->add_field("Total", "Jumlah", "r", "rupiah", "rupiah"); + $obj->add_field("Promo", "S", "c", [0=>"N",1=>"T",2=>"D",3=>"P",4=>"H"]); + $obj->set_field_order("ID", "D"); + if (in_array($this->mode, ["add","edit"])) { + $obj->add_row_btn("clipboard", "Ubah", "JualJS.detail_ubah"); + $obj->add_row_btn("trash", "Hapus", "JualJS.detail_hapus", "Unix", $this->app->user()->unix()); + $obj->set_func_btn("JualJS.produk_brow", ' Browse'); + } + $ajson[] = $obj->json_table("divDetailTabel"); + $this->app->json($ajson); + } + + public function brow_tx() { + $tcari = Param::Get("Cari_TX"); + $tsql1 = ''; $tsql2 = ''; $asql = [$this->id_cab]; + if (!empty($tcari)) { + $tsql2 .= "CONCAT(J.No_Jual,DATE_FORMAT(J.Tgl_Jual,'%d-%m-%Y'),B.Nama_Member) LIKE ?"; + array_push($asql, '%' . $tcari . '%'); + } + + $obj = new Table($this->app); + $obj->set_table("(SELECT *,Total_Jual-Total_Diskon Jumlah FROM inv_jual WHERE POS=0 AND CabID=?".$tsql1.") J LEFT JOIN para_member B ON (J.MemberID=B.MemberID)", "J.*,B.Nama_Member", $tsql2, $asql); + $obj->add_field("No_Jual", "No. Trans", "c"); + $obj->add_field("Tgl_Jual", "Tgl. Trans", "c", "sqltgl", "", "val-tgl"); + $obj->add_field("Nama_Member", "Nama Member", "awr"); + $obj->add_field("Total_Jual", "Sub. Total", "r", "rupiah2"); + $obj->add_field("Total_Diskon", "Diskon", "r", "rupiah2"); + $obj->add_field("Jumlah", "Jumlah", "r", "rupiah2"); + $obj->set_field_order("No_Jual", "D"); + $obj->set_func_select("JualJS.tx_select"); + $this->app->json([ $obj->db_table("divBrowTX") ]); + } + + public function brow_pending() { + $obj = new Table($this->app); + $obj->set_table("(SELECT *,Total_Jual-Total_Diskon Jumlah FROM inv_jual_pend WHERE POS=0 AND CabID=? AND UserID=?) J LEFT JOIN para_member B ON (J.MemberID=B.MemberID)", "J.*,B.Nama_Member", "", [$this->id_cab, $this->app->user()->id()]); + $obj->add_field("No_Jual", "No. Trans", "c"); + $obj->add_field("Tgl_Jual", "Tgl. Pending", "c", "sqltgl", "", "val-tgl"); + $obj->add_field("Nama_Member", "Nama Member", "awr"); + $obj->add_field("Total_Jual", "Sub. Total", "r", "rupiah2"); + $obj->add_field("Total_Diskon", "Diskon", "r", "rupiah2"); + $obj->add_field("Jumlah", "Jumlah", "r", "rupiah2"); + $obj->set_field_order("No_Jual", "D"); + $obj->add_row_btn("save", "Pilih", "JualJS.pending_select"); + if ($this->app->user()->is_level(1)) $obj->add_row_btn("trash", "Hapus", "JualJS.pending_delete", "UserID", $this->app->user()->id()); + $this->app->json([ $obj->db_table("divBrowPending") ]); + } + + public function brow_member() { + $tcari = Param::Get("Cari_Member"); + $tsql = ''; $asql = [1]; + if (!empty($tcari)) { + $tsql .= " AND CONCAT_WS(Kode_Member,Nama_Member,Alamat_Member,Telp_Member) LIKE ?"; + $asql[] = '%' . $tcari . '%'; + } + + $obj = new Table($this->app); + $obj->set_table("para_member", "*", "Aktif=?".$tsql, $asql); + $obj->add_field("MemberID", "ID", "hid"); + $obj->add_field("Grup_MemberID", "Grup ID", "hid"); + $obj->add_field("Kode_Member", "Kode", "c"); + $obj->add_field("Nama_Member", "Nama Member", "awr"); + $obj->add_field("Alamat_Member", "Alamat", "awr"); + $obj->add_field("Telp_Member", "Telp.", "awr"); + $obj->set_field_order("Nama_Member", "A"); + $obj->set_func_select("JualJS.member_select"); + $this->app->json([ $obj->db_table("divBrowMember") ]); + } + + public function brow_produk() { + $tcari = Param::Get("Cari_Produk"); + $tsql = ''; $asql = [1, $this->id_grup_member]; + if (!empty($tcari)) { + $tsql .= " AND Barcode_Nama LIKE ?"; + $asql[] = '%' . $tcari . '%'; + } + + $obj = new Table($this->app); + $obj->set_table("inv_produk_join", "*", "Aktif=? AND Grup_MemberID=? AND Harga_Jual>0".$tsql, $asql); + $obj->add_field("InvID", "ID", "hid"); + $obj->add_field("SatuanID", "ID", "hid"); + $obj->add_field("VarianID", "ID", "hid"); + $obj->add_field("Kode_SKU", "SKU", "c"); + $obj->add_field("Kode_Barcode", "Barcode", "c"); + $obj->add_field("Nama_Lengkap", "Nama Barang", "awr"); + $obj->add_field("Harga_Jual", "Harga Jual", "r", "rupiah"); + $obj->set_field_order("Kode_SKU", "A"); + $obj->set_func_select("JualJS.produk_select"); + $this->app->json([ $obj->db_table("divBrowProduk") ]); + } + + public function auto_member() { + $tcari = Param::Get("Auto_Query", ""); + $ajson['autodata'] = []; + + $stat = $this->db->runQuery("SELECT MemberID,Grup_MemberID,Kode_Member,Nama_Member,CONCAT(IF(Kode_Member='','',CONCAT(Kode_Member,' - ')),Nama_Member) Kode_Nama FROM para_member WHERE Aktif=1 AND CONCAT(Kode_Member,Nama_Member,Alamat_Member,Telp_Member) LIKE ? ORDER BY Nama_Member LIMIT 50", ['%'.$tcari.'%']); + while ($row = $stat->fetch(SimplePdo::FETCH_ASSOC)) { + $ajson['autodata'][] = ['value'=>$row['MemberID'], 'text'=>$row['Kode_Nama'], 'html'=>''.$row['Kode_Member'].' '.$row['Nama_Member'], 'data'=>$row['Grup_MemberID'], 'bc'=>0]; + } + $this->app->json($ajson); + } + + public function auto_produk() { + $tcari = Param::Get("Auto_Query", ""); + $ajson['autodata'] = []; + $bcode = 0; $arec = []; + + if (is_numeric($tcari) && strlen($tcari) === 8) { + // Cari by Member + // M : Grup_Member + $_row = $this->db->fetchRow("SELECT MemberID InvID,Nama_Member Nama_Lengkap,CONCAT('M:',Grup_MemberID) Data2 FROM para_member WHERE Aktif=1 AND Kode_Member=?", [$tcari]); + if ($_row) { + $bcode = 1; + $arec = $_row->getData(); + } + } + + // Cari by SKU + Barcode + // P : Satuan : Varian : Harga_Pokok : Harga_Jual : Stok + if ($bcode === 0) { + $_row = $this->db->fetchRow("SELECT P.InvID,P.Nama_Lengkap,CONCAT('P:',P.SatuanID,':',P.VarianID,':',CONVERT(P.Harga_Pokok USING UTF8),':',CONVERT(P.Harga_Jual USING UTF8),':',CONVERT(IFNULL(X.Stok,0) USING UTF8)) Data2 FROM (SELECT * FROM inv_produk_join WHERE Aktif=1 AND Harga_Jual>0 AND Grup_MemberID=? AND (Kode_SKU=? OR Kode_Barcode=?)) P LEFT JOIN inv_stok X ON (X.CabID=? AND X.InvID=P.InvID)", [$this->id_grup_member, $tcari, $tcari, $this->id_cab]); + if ($_row) { + $bcode = 1; + $arec = $_row->getData(); + } + } + if ($bcode === 1) { + $ajson['autodata'][] = ['value'=>$arec['InvID'], 'text'=>$arec['Nama_Lengkap'], 'data'=>$arec['Data2'], 'bc'=>1]; + } else { + $stat = $this->db->runQuery("SELECT P.InvID,P.Nama_Lengkap,P.Kode_SKU,IF(IFNULL(X.Stok,0)=0,'KOSONG',ROUND(X.Stok/P.Qty,2)) Sisa_Stok,P.Harga_Jual,CONCAT('P:',P.SatuanID,':',P.VarianID,':',CONVERT(P.Harga_Pokok USING UTF8),':',CONVERT(P.Harga_Jual USING UTF8),':',CONVERT(IFNULL(X.Stok,0) USING UTF8)) Data2 FROM (SELECT * FROM inv_produk_join WHERE Barcode_Nama LIKE ? AND Aktif=1 AND Harga_Jual>0 AND Grup_MemberID=?) P LEFT JOIN inv_stok X ON (X.CabID=? AND X.InvID=P.InvID) ORDER BY P.Nama_Produk,P.Qty LIMIT 50", ['%'.$tcari.'%', $this->id_grup_member, $this->id_cab]); + while ($row = $stat->fetch(SimplePdo::FETCH_ASSOC)) { + $ajson['autodata'][] = ['value'=>$row['InvID'], 'text'=>$row['Nama_Lengkap'], 'html'=>''.$row['Kode_SKU'].' '.$row['Nama_Lengkap'].' - Rp'.rupiah($row['Harga_Jual']).' ('.(string) $row['Sisa_Stok'].')', 'data'=>$row['Data2'], 'bc'=>0]; + } + } + $this->app->json($ajson); + } + + public function form_master() { + $ajson = [ 'error'=>"", 'html'=>"" ]; + $atabel = []; + + if ($this->mode === "pending-edit") { + $this->inv->Pending_Edit($this->no_jual); + $atabel = $this->Data_Jual($this->no_jual); + $this->mode = "edit"; + } else if ($this->mode === "pending-save") { + $b_baru = false; + if (str_ends_with($this->no_jual, "#00")) { + $b_baru = true; + $no_lama = $this->no_jual; + $this->no_jual = $this->Pending_Nomor(); + $this->inv->Pending_Save($no_lama, $this->no_jual); + } + $apending = $this->db->fetchRow("SELECT SUM(-Qty*Harga_Jual) Jual,SUM(Total_Diskon) Diskon FROM tmp_inv_detail WHERE No_Ref=?", [$this->no_jual]) ?? ['Jual'=>0, 'Diskon'=>0]; + + $sql = new SQL($this->app); + $sql->set_table("inv_jual_pend"); + $sql->add_param("No_Jual", $this->no_jual); + $sql->add_param_date("Tgl_Jual"); + $sql->add_param("CabID"); + $sql->add_param("MemberID"); + $sql->add_param("Total_Jual", $apending['Jual']); + $sql->add_param("Total_Diskon", $apending['Diskon']); + $sql->add_param("POS", 0); + $sql->add_param_userid(); + $sql->add_where("No_Jual", $this->no_jual); + if ($b_baru) $sql->InsertDB(); + else $sql->UpdateDB(); + $atabel = $this->Data_Jual(); + } else if ($this->mode === "pending-delete") { + $this->inv->Pending_Delete($this->no_jual); + $this->db->delete("inv_jual_pend", "No_Jual=?", [$this->no_jual]); + $atabel = $this->Data_Jual(); + } else if ($this->mode === "add") { + $atabel = $this->Data_Jual("", true); + } else if ($this->mode === "edit") { + $this->inv->Detail_Copy($this->no_jual, true); + $atabel = $this->Data_Jual($this->no_jual); + } else if ($this->mode === "save") { + $tgl_jual = Param::Get("Tgl_Jual", ""); + $no_lama = $this->no_jual; + if ($this->is_pend) { + $this->no_jual = $this->inv->Nomor_POS("FJ", $tgl_jual, true); + if (!str_ends_with($no_lama, "#00")) $this->db->delete("inv_jual_pend", "No_Jual=?", [$no_lama]); + } + + $this->inv->Detail_Save($this->no_jual, 5, $this->id_cab, $tgl_jual, $this->is_pend, $no_lama); + + $ajual = $this->db->fetchRow("SELECT SUM(-Qty*Harga_Jual) Jual, SUM(Total_Diskon) Diskon, SUM(-Qty*Harga_Beli) HPP FROM inv_detail WHERE No_Ref=?", [$this->no_jual]) ?? ['Jual'=>0, 'Diskon'=>0, 'HPP'=>0]; + + $sql = new SQL($this->app); + $sql->set_table("inv_jual"); + $sql->add_param_date("Tgl_Jual"); + $sql->add_param("CabID", $this->id_cab); + $sql->add_param("MemberID"); + $sql->add_param("Total_Jual", $ajual['Jual']); + $sql->add_param("Total_Diskon", $ajual['Diskon']); + $sql->add_param("Total_HPP", $ajual['HPP']); + $sql->add_param("POS", 0); + $sql->add_param_stamp(); + $sql->add_param_userid(); + $sql->add_where("No_Jual", $this->no_jual); + $sql->UpdateDB(); + + $this->gel->Update_Lunas_Buy($this->id_member); + + // PROSES MEMBER POINT + if ($this->id_member > 0) { + $apoint = $this->db->fetchColumn("SELECT Point_TipeID FROM inv_point_tipe WHERE Aktif=1 ORDER BY Point_TipeID") ?? []; + if (count($apoint) > 0) { + $amember = $this->db->fetchRow("SELECT Grup_MemberID,IM,Kode_Member FROM para_member WHERE MemberID=?", [$this->id_member]); + if ($amember && ($amember['IM'] === 1 || ($amember['IM'] === 0 && !empty($amember['Kode_Member'])))) { + $this->db->runQuery("DELETE FROM inv_point_tx WHERE No_TX=?", [$this->no_jual]); + foreach ($apoint as $id_tipe) { + if ($amember['IM'] === 0 && $id_tipe === 1) continue; + $tot_point = $this->inv->Point_Hitung($this->no_jual, $tgl_jual, $amember['Grup_MemberID'], 0, $id_tipe); + if ($tot_point > 0) $this->db->runQuery("INSERT INTO inv_point_tx (No_TX,Tgl_TX,Point_TipeID,CabID,MemberID,Point,Nilai_Point,DateStamp,UserID) VALUES (?, ?, ?, ?, ?, ?, ?, NOW(), ?)", [$this->no_jual, tgl_sql2str($tgl_jual), $id_tipe, $this->id_cab, $this->id_member, $tot_point, $tot_point, $this->app->user()->id()]); + } + } + } + } + + // PROSES POSTING GL + $ainfo = $this->db->fetchRow("SELECT J.*,B.Nama_Member,(J.Total_Jual-J.Total_Diskon) Tagihan FROM (SELECT * FROM inv_jual WHERE No_Jual=?) J LEFT JOIN para_member B ON (B.MemberID=J.MemberID)", [$this->no_jual]); + if (count($ainfo) > 0) { + $ajurnal = [ + 'Kode_Jurnal' => $ainfo['No_Jual'], + 'TipeID' => 8, + 'CabID' => $ainfo['CabID'], + 'Tanggal' => tgl_sql2str($ainfo['Tgl_Jual']), + 'Kode_Ref' => $ainfo['No_Jual'], + 'Catatan' => "Penjualan : ".$ainfo['No_Jual']." | ".$ainfo['Nama_Member']." | ".$this->app->user()->username() + ]; + $adetail = [ + [ 'Kode_Rek' => $this->app_gel['HPP'], 'DK' => "D", 'Jumlah' => $ainfo['Total_HPP'] ], + [ 'Kode_Rek' => $this->app_gel['STOK'], 'DK' => "K", 'Jumlah' => $ainfo['Total_HPP'] ], + [ 'Kode_Rek' => $this->app_gel['PIU_USAHA'], 'DK' => "D", 'Jumlah' => $ainfo['Tagihan'], 'MemberID' => $ainfo['MemberID'] ], + [ 'Kode_Rek' => $this->app_gel['JUAL'], 'DK' => "K", 'Jumlah' => $ainfo['Tagihan'] ] + ]; + $this->gel->Jurnal_Post($ajurnal, $adetail); + } + $atabel = $this->Data_Jual($this->no_jual); + $this->mode = "view"; + + } else if ($this->mode === "cancel") { + if (str_ends_with($this->no_jual, "#00") || !$this->is_pend) $this->inv->Detail_Cancel($this->no_jual); + $atabel = $this->Data_Jual(); + } else { + $atabel = $this->Data_Jual($this->no_jual); + } + + $enable = in_array($this->mode, ["add","edit"]) ? true : false; + $form = new Form($this->app); + $tnota = $form->textbox("_", "No_Jual", $atabel['No_Jual'], !$enable, true, "text", "nomor transaksi"); + $ttglnota = $form->datebox("_", "Tgl_Jual", $atabel['Tgl_Jual'], $enable, true); + $ttgllunas = $form->datebox("_", "Tgl_Lunas", $atabel['Tgl_Lunas'], false, false); + $tcab = $form->option_db("_", "CabID", $atabel['CabID'], $enable, false, "para_cabang", ["CabID","Nama_Cab"], "Aktif=1 ORDER BY Nama_Cab", [0," "]); + $tmember = $form->textauto("_", "Nama_Member", ['value'=>$atabel['MemberID'],'text'=>$atabel['Nama_Member']], true, true, "nama member"); + $tpiutang = $form->textbox("_", "Total_Piutang", 0, false, false, "double"); + $ajson['html'] = ' +
+
+
+ +
'.$tnota.'
+
+
+ +
'.$ttglnota.'
+
+
+ +
'.$ttgllunas.'
+
+
+
+
+ +
'.$tcab.'
+
+
+ +
'.$tmember.'
+
+
+ +
'.$tpiutang.'
+
+
+
+

+
+
+ +
+
+ +
+
+ + + + '; + $this->app->json($ajson); + } + + public function form_produk() { + $id = (int) Param::Get("ID", 0); + $atabel = [ 'ID'=>$id, 'InvID'=>$this->id_inv, 'SatuanID'=>$this->id_satuan, 'VarianID'=>$this->id_varian, 'Kode_SKU'=>"", 'Kode_Barcode'=>"", 'Nama_Lengkap'=>"", 'Satuan_Kemasan'=>"", 'Qty'=>0, 'Harga_Beli'=>0, 'Harga_Jual'=>0, 'Disk_Rupiah'=>0 ]; + if ($id > 0) { + $_row = $this->db->fetchRow("SELECT ID,-Qty Qty,Harga_Beli,Harga_Jual,Disk_Rupiah FROM tmp_inv_detail WHERE No_Ref=? AND ID=?", [$this->no_jual, $id]); + if ($_row) $atabel = array_merge($atabel, $_row->getData()); + } + if ($this->id_inv > 0 && $this->id_satuan > 0) { + $_row = $this->db->fetchRow("SELECT Kode_SKU,Kode_Barcode,Nama_Lengkap,Satuan_Kemasan,Harga_Pokok Harga_Beli,Harga_Jual FROM inv_produk_join WHERE InvID=? AND SatuanID=? AND VarianID=? AND Grup_MemberID=?", [$this->id_inv, $this->id_satuan, $this->id_varian, $this->id_grup_member]); + if ($_row) $atabel = array_merge($atabel, $_row->getData()); + } + + $form = new Form($this->app); + $tsku = $form->textbox("_", "Kode_SKU", $atabel['Kode_SKU']. " / " .$atabel['Kode_Barcode'], false); + $tnama = $form->textbox("_", "Nama_Lengkap", $atabel['Nama_Lengkap'], false); + $tqty = $form->textbox("_", "Qty", $atabel['Qty'], true, true, "double"); + $tjual = $form->textbox("_", "Harga_Jual", $atabel['Harga_Jual'], false, false, "double"); + $tdisrp = $form->textbox("_", "Disk_Rupiah", $atabel['Disk_Rupiah'], true, true, "double"); + $tdispn = $form->textbox("_", "Disk_Persen", 0, true, false, "double"); + $ttot = $form->textbox("_", "Jumlah", 0, false, false, "double"); + $tsat = $form->textbox("_", "Nama_Satuan", $atabel['Satuan_Kemasan'], false); + $ajson['html'] = ' +
+ +
'.$tsku.'
+
+
+ +
'.$tnama.'
+
+

+
+ +
'.$tqty.$tsat.'
+
+
+ +
'.$tjual.'
+
+
+ +
'.$tdisrp.'
+
≈
'.$tdispn.'
%
+
+
+ +
'.$ttot.'
+
+ + + + + + '; + $this->app->json($ajson); + } + + public function proses_delete() { + if ($this->is_pend === false) { + $this->db->runQuery("DELETE FROM inv_jual WHERE No_Jual=?", [$this->no_jual]); + $this->db->runQuery("DELETE FROM inv_detail WHERE No_Ref=?", [$this->no_jual]); + // PROSES POSTING GL + $this->db->runQuery("DELETE FROM gel_jurnal WHERE Kode_Jurnal=?", [$this->no_jual]); + $this->db->runQuery("DELETE FROM gel_jurnal_detail WHERE Kode_Jurnal=?", [$this->no_jual]); + // PROSES MEMBER POINT + if ($this->id_member > 0) $this->db->runQuery("DELETE FROM inv_point_tx WHERE No_TX=?", [$this->no_jual]); + } else { + $this->db->runQuery("DELETE FROM inv_jual_pend WHERE No_Jual=?", [$this->no_jual]); + $this->db->runQuery("DELETE FROM tmp_inv_detail WHERE No_Ref=?", [$this->no_jual]); + } + $this->app->json([ 'status' => true ]); + } + + public function update_piutang() { + $_piut = $this->db->fetchField("SELECT SUM(Total_Jual-Total_Diskon-Total_Bayar-Total_Potong) Jumlah FROM inv_jual WHERE MemberID=? AND Lunas=0", [$this->id_member]) ?? 0; + $this->app->json([ ['type'=>"form", 'id'=>"Total_Piutang", 'value'=>rupiah2($_piut)] ]); + } + + public function index() { + $this->app->json(['html' => ' +
+
+ +
+
+
 
+
 
+
+
+
+
' + ]); + } + + private function Data_Jual(string $nomor="", bool $baru=false): array { + $aparam = [ + 'No_Jual' => $nomor, + 'Tgl_Jual' => tgl_ymd(), + 'Tgl_Lunas' => "0000-00-00", + 'CabID' => $this->id_cab, + 'MemberID' => $this->id_member, + 'Grup_MemberID' => $this->id_grup_member, + 'Nama_Member' => "", + 'Lunas' => 0 + ]; + if ($baru) $aparam['No_Jual'] = "JUAL".$this->web_app['SERVER_ID'].(string) $this->id_cab.$this->app->user()->id(3)."#00"; + if (!empty($nomor)) { + $tabel_jual = (str_contains($nomor, "JUAL") === false) ? "inv_jual" : "inv_jual_pend"; + $row = $this->db->fetchRow("SELECT * FROM ".$tabel_jual." WHERE CabID=? AND No_Jual=?", [$this->id_cab, $nomor]); + if ($row) $aparam = array_merge($aparam, $row->getData()); + if ($aparam['MemberID'] > 0) { + $row = $this->db->fetchRow("SELECT Grup_MemberID,Nama_Member FROM para_member WHERE MemberID=?", [$aparam['MemberID']]); + if ($row) $aparam = array_merge($aparam, $row->getData()); + } + } + return $aparam; + } + + private function Pending_Nomor(): string { + $tno = "JUAL".$this->web_app['SERVER_ID'].(string) $this->id_cab.$this->app->user()->id(3)."#"; + $ino = (int) $this->db->fetchField("SELECT MAX(RIGHT(No_Jual,2)) FROM inv_jual_pend WHERE No_Jual LIKE ?", [$tno.'%']) ?? 0; + $tno .= isi_nol(++$ino, 2); + return $tno; + } +} diff --git a/app/Controller/Inv/MutasiController.php b/app/Controller/Inv/MutasiController.php new file mode 100644 index 0000000..f742938 --- /dev/null +++ b/app/Controller/Inv/MutasiController.php @@ -0,0 +1,373 @@ +app = $app; + $this->db = $db; + $this->web_app = (array) $session->get('WEB_APP'); + $this->id_cab_dari = Param::Int("Dari_CabID", $session->get('APP_INV')['CABANGID']); + $this->id_cab_ke = Param::Int("Ke_CabID", 0); + $this->mode = Param::Get("mode", ""); + $this->mode_detail = Param::Get("mode_detail", ""); + $this->no_mutasi = Param::Get("No_Mutasi", ""); + $this->is_baru = str_contains($this->no_mutasi, "MUTA") === true; + $this->id_inv = Param::Int("InvID", 0); + $this->id_satuan = Param::Int("SatuanID", 0); + $this->id_varian = Param::Int("VarianID", 0); + $this->inv = new Inv($app); + } + + public function table_detail() { + if (in_array($this->mode_detail, ["insert","update","delete"])) { + $iqty = Param::Float("Qty", 0); + + $sql = new SQL($this->app); + $sql->set_table("tmp_inv_detail"); + $sql->add_param("No_Ref", $this->no_mutasi); + $sql->add_param("InvID"); + $sql->add_param("SatuanID"); + $sql->add_param("VarianID"); + $sql->add_param("Qty", $iqty); + $sql->add_param("Harga_Beli"); + $sql->add_param("Harga_Jual", "Harga_Beli", true); + $sql->add_param_unix(); + $sql->add_param_userid(); + $sql->add_where("ID"); + $sql->add_where("No_Ref", $this->no_mutasi); + + if ( $this->mode_detail === "insert" ) { + $sql->InsertDB(); + } else if ( $this->mode_detail === "update" ) { + $sql->UpdateDB(); + } else if ( $this->mode_detail === "delete" ) { + $sql->DeleteDB(); + } + } + + $tsql = ' AND Qty>0'; $asql = [$this->no_mutasi]; $qtabel = "inv_detail"; + if (in_array($this->mode, ["add","edit"])) { + if ($this->mode === "add") { $tsql = " AND Unix=?"; array_push($asql, $this->app->user()->unix()); } + $qtabel = "tmp_inv_detail"; + } + + $obj = new Table($this->app); + $obj->set_table("(SELECT * FROM ".$qtabel." WHERE No_Ref=?".$tsql.") D LEFT JOIN vi_inv_produk P ON (D.InvID=P.InvID AND D.SatuanID=P.SatuanID AND D.VarianID=P.VarianID)", "D.*,P.Kode_SKU,P.Nama_Lengkap,(D.Qty*D.Harga_Beli) Total", "", $asql); + $obj->set_footer("COUNT(*) Harga_Beli,SUM(D.Qty*D.Harga_Beli) Total"); + $obj->add_field("ID", "No", "c"); + $obj->add_field("InvID", "InvID", "hid"); + $obj->add_field("SatuanID", "SatuanID", "hid"); + $obj->add_field("VarianID", "VarianID", "hid"); + $obj->add_field("Kode_SKU", "SKU", "c"); + $obj->add_field("Nama_Lengkap", "Nama Barang", "awr"); + $obj->add_field("Qty", "Qty", "r", "rupiah2"); + $obj->add_field("Harga_Beli", "Harga @", "r", "rupiah", "items"); + $obj->add_field("Total", "Jumlah", "r", "rupiah", "rupiah"); + $obj->set_field_order("ID", "D"); + if (in_array($this->mode, ["add","edit"])) { + $obj->add_row_btn("clipboard", "Ubah", "MutasiJS.detail_ubah"); + $obj->add_row_btn("trash", "Hapus", "MutasiJS.detail_hapus", "Unix", $this->app->user()->unix()); + $obj->set_func_btn("MutasiJS.produk_brow", ' Browse'); + } + $ajson[] = $obj->json_table("divDetailTabel"); + $this->app->json($ajson); + } + + public function brow_tx() { + $tcari = Param::Get("Cari_TX"); + $tsql = ''; $asql = []; + if (!empty($tcari)) { + $tsql .= " WHERE CONCAT(No_Mutasi,DATE_FORMAT(Tgl_Mutasi,'%d-%m-%Y')) LIKE ?"; + array_push($asql, '%' . $tcari . '%'); + } + + $obj = new Table($this->app); + $obj->set_table("(SELECT * FROM inv_mutasi".$tsql.") M LEFT JOIN para_cabang C1 ON (C1.CabID=M.Dari_CabID) LEFT JOIN para_cabang C2 ON (C2.CabID=M.Ke_CabID)", "M.*,C1.Nama_Cab Cab1,C2.Nama_Cab Cab2", "", $asql); + $obj->add_field("No_Mutasi", "No. Trans", "c"); + $obj->add_field("Tgl_Mutasi", "Tgl. Trans", "c", "sqltgl", "", "val-tgl"); + $obj->add_field("Cab1", "Dari Cab", "c"); + $obj->add_field("Cab2", "Ke Cab", "c"); + $obj->add_field("Total_Mutasi", "Total", "r", "rupiah2"); + $obj->set_field_order("No_Mutasi", "D"); + $obj->set_func_select("MutasiJS.tx_select"); + $this->app->json([ $obj->db_table("divBrowTX") ]); + } + + public function brow_produk() { + $tcari = Param::Get("Cari_Produk"); + $tsql = ''; $asql = []; + if (!empty($tcari)) { + $tsql .= " AND Barcode_Nama LIKE ?"; + array_push($asql, '%' . $tcari . '%'); + } + array_push($asql, $this->id_cab_dari); + + $obj = new Table($this->app); + $obj->set_table("(SELECT * FROM inv_produk_join WHERE Aktif=1".$tsql." GROUP BY InvID,SatuanID,VarianID) P LEFT JOIN inv_stok X ON (X.CabID=? AND X.InvID=P.InvID)", "P.InvID,P.SatuanID,P.VarianID,P.Kode_SKU,P.Kode_Barcode,P.Nama_Lengkap,IF(IFNULL(X.Stok,0)=0,0,ROUND(X.Stok/P.Qty,2)) Sisa_Stok", "", $asql); + $obj->add_field("InvID", "ID", "hid"); + $obj->add_field("SatuanID", "ID", "hid"); + $obj->add_field("VarianID", "ID", "hid"); + $obj->add_field("Kode_SKU", "SKU", "c"); + $obj->add_field("Kode_Barcode", "Barcode", "c"); + $obj->add_field("Nama_Lengkap", "Nama Barang", "awr"); + $obj->add_field("Sisa_Stok", "Stok", "r", "rupiah2"); + $obj->set_field_order("Kode_SKU", "A"); + $obj->set_func_select("MutasiJS.produk_select"); + $this->app->json([ $obj->db_table("divBrowProduk") ]); + } + + public function auto_produk() { + $tcari = Param::Get("Auto_Query", ""); + $ajson['autodata'] = []; + $bcode = 0; $arec = []; + + // Cari by SKU + Barcode + // Satuan : Varian : Harga_Pokok + $_row = $this->db->fetchRow("SELECT P.InvID,P.Nama_Lengkap,CONCAT(P.SatuanID,':',P.VarianID,':',CONVERT(P.Harga_Pokok USING UTF8)) Data2 FROM (SELECT * FROM inv_produk_join WHERE Aktif=1 AND (Kode_SKU=? OR Kode_Barcode=?) GROUP BY InvID,SatuanID,VarianID) P LEFT JOIN inv_stok X ON (X.CabID=? AND X.InvID=P.InvID)", [$tcari, $tcari, $this->id_cab_dari]); + if ($_row) { + $bcode = 1; + $arec = $_row->getData(); + } + if ($bcode === 1) { + $ajson['autodata'][] = ['value'=>$arec['InvID'], 'text'=>$arec['Nama_Lengkap'], 'data'=>$arec['Data2'], 'bc'=>1]; + } else { + $stat = $this->db->runQuery("SELECT P.InvID,P.Nama_Lengkap,P.Kode_SKU,IF(IFNULL(X.Stok,0)=0,'KOSONG',ROUND(X.Stok/P.Qty,2)) Sisa_Stok,CONCAT(P.SatuanID,':',P.VarianID,':',CONVERT(P.Harga_Pokok USING UTF8)) Data2 FROM (SELECT * FROM inv_produk_join WHERE Barcode_Nama LIKE ? AND Aktif=1 GROUP BY InvID,SatuanID,VarianID) P LEFT JOIN inv_stok X ON (X.CabID=? AND X.InvID=P.InvID) ORDER BY P.Nama_Produk,P.Qty LIMIT 50", ['%'.$tcari.'%', $this->id_cab_dari]); + while ($row = $stat->fetch(SimplePdo::FETCH_ASSOC)) { + $ajson['autodata'][] = ['value'=>$row['InvID'], 'text'=>$row['Nama_Lengkap'], 'html'=>''.$row['Kode_SKU'].' '.$row['Nama_Lengkap'].' ('.(string) $row['Sisa_Stok'].')', 'data'=>$row['Data2'], 'bc'=>0]; + } + } + $this->app->json($ajson); + } + + public function form_master() { + $ajson = [ 'error'=>"", 'html'=>"" ]; + $atabel = []; + + if ($this->mode === "add") { + $atabel = $this->Data_Mutasi("", true); + } else if ($this->mode === "edit") { + $this->inv->Detail_Copy($this->no_mutasi, true); + $atabel = $this->Data_Mutasi($this->no_mutasi); + } else if ($this->mode === "save") { + $no_lama = $this->no_mutasi; + $tgl_mutasi = Param::Get("Tgl_Mutasi"); + if ($this->is_baru) { + $this->no_mutasi = $this->inv->Nomor_Baru("M", $tgl_mutasi, true); + } + + $this->inv->Detail_Save($this->no_mutasi, 2, $this->id_cab_ke, $tgl_mutasi, $this->is_baru, $no_lama, 0, true, $this->id_cab_dari); + + $tot_mutasi = $this->db->fetchField("SELECT SUM(Qty*Harga_Beli) Beli FROM inv_detail WHERE No_Ref=? AND Qty>0", [$this->no_mutasi]) ?? 0; + + $sql = new SQL($this->app); + $sql->set_table("inv_mutasi"); + $sql->add_param_date("Tgl_Mutasi"); + $sql->add_param("Dari_CabID"); + $sql->add_param("Ke_CabID"); + $sql->add_param("Total_Mutasi", $tot_mutasi); + $sql->add_param("Catatan"); + $sql->add_param_stamp(); + $sql->add_param_userid(); + $sql->add_where("No_Mutasi", $this->no_mutasi); + $sql->UpdateDB(); + + $atabel = $this->Data_Mutasi($this->no_mutasi); + $this->mode = "view"; + + } else if ($this->mode === "cancel") { + $this->inv->Detail_Cancel($this->no_mutasi); + $atabel = $this->Data_Mutasi(); + } else { + $atabel = $this->Data_Mutasi($this->no_mutasi); + } + + $enable = in_array($this->mode, ["add","edit"]) ? true : false; + $form = new Form($this->app); + $tnota = $form->textbox("_", "No_Mutasi", $atabel['No_Mutasi'], !$enable, true, "text", "nomor transaksi"); + $ttglnota = $form->datebox("_", "Tgl_Mutasi", $atabel['Tgl_Mutasi'], $enable, true); + $tcab_dari = $form->option_db("_", "Dari_CabID", $atabel['Dari_CabID'], $enable, false, "para_cabang", ["CabID","Nama_Cab"], "Aktif=1 ORDER BY Nama_Cab", [0," "]); + $tcab_ke = $form->option_db("_", "Ke_CabID", $atabel['Ke_CabID'], $enable, false, "para_cabang", ["CabID","Nama_Cab"], "Aktif=1 ORDER BY Nama_Cab", [0," "]); + $tcatat = $form->textbox("_", "Catatan", $atabel['Catatan'], $enable, false, "text"); + $ajson['html'] = ' +
+
+
+ +
'.$tnota.'
+
+
+ +
'.$ttglnota.'
+
+
+
+
+ +
'.$tcab_dari.'
+
+
+ +
'.$tcab_ke.'
+
+
+
+
+ +
'.$tcatat.'
+
+

+
+
+ +
+
+ +
+
+ '; + $this->app->json($ajson); + } + + public function form_produk() { + $id = (int) Param::Get("ID", 0); + $atabel = [ 'ID'=>$id, 'InvID'=>$this->id_inv, 'SatuanID'=>$this->id_satuan, 'VarianID'=>$this->id_varian, 'Kode_SKU'=>"", 'Kode_Barcode'=>"", 'Nama_Lengkap'=>"", 'Satuan_Kemasan'=>"", 'Qty'=>0, 'Harga_Beli'=>0 ]; + if ($id > 0) { + $_row = $this->db->fetchRow("SELECT ID,Qty,Harga_Beli FROM tmp_inv_detail WHERE No_Ref=? AND ID=?", [$this->no_mutasi, $id]); + if ($_row) $atabel = array_merge($atabel, $_row->getData()); + } + if ($this->id_inv > 0 && $this->id_satuan > 0) { + $_row = $this->db->fetchRow("SELECT Kode_SKU,Kode_Barcode,Nama_Lengkap,Satuan_Kemasan,Harga_Pokok Harga_Beli FROM inv_produk_join WHERE InvID=? AND SatuanID=? AND VarianID=?", [$this->id_inv, $this->id_satuan, $this->id_varian]); + if ($_row) $atabel = array_merge($atabel, $_row->getData()); + } + + $form = new Form($this->app); + $tsku = $form->textbox("_", "Kode_SKU", $atabel['Kode_SKU']. " / " .$atabel['Kode_Barcode'], false); + $tnama = $form->textbox("_", "Nama_Lengkap", $atabel['Nama_Lengkap'], false); + $tqty = $form->textbox("_", "Qty", $atabel['Qty'], true, true, "double"); + $tbeli = $form->textbox("_", "Harga_Beli", $atabel['Harga_Beli'], false, false, "double"); + $ttot = $form->textbox("_", "Jumlah", 0, false, false, "double"); + $tsat = $form->textbox("_", "Nama_Satuan", $atabel['Satuan_Kemasan'], false); + $ajson['html'] = ' +
+ +
'.$tsku.'
+
+
+ +
'.$tnama.'
+
+

+
+ +
'.$tqty.$tsat.'
+
+
+ +
'.$tbeli.'
+
+
+ +
'.$ttot.'
+
+ + + + + '; + $this->app->json($ajson); + } + + public function proses_delete() { + $this->db->runQuery("DELETE FROM inv_mutasi WHERE No_Mutasi=?", [$this->no_mutasi]); + $this->db->runQuery("DELETE FROM inv_detail WHERE No_Ref=?", [$this->no_mutasi]); + $this->app->json([ 'status' => true ]); + } + + public function index() { + $this->app->json(['html' => ' +
+
+ +
+
+
 
+
 
+
+
+
+
' + ]); + } + + private function Data_Mutasi(string $nomor="", bool $baru=false): array { + $aparam = [ + 'No_Mutasi' => $nomor, + 'Tgl_Mutasi' => tgl_ymd(), + 'Dari_CabID' => $this->id_cab_dari, + 'Ke_CabID' => $this->id_cab_ke, + 'Catatan' => "" + ]; + if ($baru) $aparam['No_Mutasi'] = "MUTA".$this->web_app['SERVER_ID'].(string) $this->id_cab_dari.$this->app->user()->id(3)."#00"; + if (!empty($nomor)) { + $row = $this->db->fetchRow("SELECT * FROM inv_mutasi WHERE No_Mutasi=?", [$nomor]); + if ($row) $aparam = array_merge($aparam, $row->getData()); + } + return $aparam; + } + +} diff --git a/app/Controller/Inv/OpnameController.php b/app/Controller/Inv/OpnameController.php new file mode 100644 index 0000000..84a4dc1 --- /dev/null +++ b/app/Controller/Inv/OpnameController.php @@ -0,0 +1,376 @@ +app = $app; + $this->db = $db; + $this->web_app = (array) $session->get('WEB_APP'); + $this->app_gel = (array) $session->get('APP_GEL'); + $this->id_cab = Param::Int("CabID", $session->get('APP_INV')['CABANGID']); + $this->mode = Param::Get("mode", ""); + $this->mode_detail = Param::Get("mode_detail", ""); + $this->no_opname = Param::Get("No_Opname", ""); + $this->is_baru = str_contains($this->no_opname, "OPNA") === true; + $this->id_inv = Param::Int("InvID", 0); + $this->id_satuan = Param::Int("SatuanID", 0); + $this->id_varian = Param::Int("VarianID", 0); + $this->inv = new Inv($app); + $this->gel = new Gel($app); + } + + public function table_detail() { + if (in_array($this->mode_detail, ["insert","update","delete"])) { + $iqty = Param::Float("Qty", 0); + + $sql = new SQL($this->app); + $sql->set_table("tmp_inv_detail"); + $sql->add_param("No_Ref", $this->no_opname); + $sql->add_param("InvID"); + $sql->add_param("SatuanID"); + $sql->add_param("VarianID"); + $sql->add_param("Qty", $iqty); + $sql->add_param("Harga_Beli"); + $sql->add_param("Harga_Jual", "Harga_Beli", true); + $sql->add_param_unix(); + $sql->add_param_userid(); + $sql->add_where("ID"); + $sql->add_where("No_Ref", $this->no_opname); + + if ( $this->mode_detail === "insert" ) { + $sql->InsertDB(); + } else if ( $this->mode_detail === "update" ) { + $sql->UpdateDB(); + } else if ( $this->mode_detail === "delete" ) { + $sql->DeleteDB(); + } + } + + $tsql = ''; $asql = [$this->no_opname]; $qtabel = "inv_detail"; + if (in_array($this->mode, ["add","edit"])) { + if ($this->mode === "add") { $tsql = " AND Unix=?"; array_push($asql, $this->app->user()->unix()); } + $qtabel = "tmp_inv_detail"; + } + + $obj = new Table($this->app); + $obj->set_table("(SELECT *,(Qty*Harga_Beli) Total FROM ".$qtabel." WHERE No_Ref=?".$tsql.") D LEFT JOIN vi_inv_produk P ON (D.InvID=P.InvID AND D.SatuanID=P.SatuanID AND D.VarianID=P.VarianID)", "D.*,P.Kode_SKU,P.Nama_Lengkap", "", $asql); + $obj->set_footer("SUM(D.Total) Total"); + $obj->add_field("ID", "No", "c"); + $obj->add_field("InvID", "InvID", "hid"); + $obj->add_field("SatuanID", "SatuanID", "hid"); + $obj->add_field("VarianID", "VarianID", "hid"); + $obj->add_field("Kode_SKU", "SKU", "c"); + $obj->add_field("Nama_Lengkap", "Nama Barang", "awr"); + $obj->add_field("Qty", "Qty", "r", "rupiah2"); + $obj->add_field("Harga_Beli", "Harga @", "r", "rupiah"); + $obj->add_field("Total", "Jumlah", "r", "rupiah", "rupiah"); + $obj->set_field_order("ID", "D"); + if (in_array($this->mode, ["add","edit"])) { + $obj->add_row_btn("clipboard", "Ubah", "OpnameJS.detail_ubah"); + $obj->add_row_btn("trash", "Hapus", "OpnameJS.detail_hapus", "Unix", $this->app->user()->unix()); + $obj->set_func_btn("OpnameJS.detail_tambah", ' Barang'); + $obj->set_func_btn("OpnameJS.produk_brow", ' Browse'); + } + $ajson[] = $obj->json_table("divDetailTabel"); + $this->app->json($ajson); + } + + public function brow_tx() { + $tcari = Param::Get("Cari_TX"); + $tsql = ''; $asql = []; + if (!empty($tcari)) { + $tsql .= " WHERE CONCAT(No_Opname,DATE_FORMAT(Tgl_Opname,'%d-%m-%Y')) LIKE ?"; + array_push($asql, '%' . $tcari . '%'); + } + + $obj = new Table($this->app); + $obj->set_table("(SELECT * FROM inv_opname".$tsql.") O LEFT JOIN para_cabang C ON (C.CabID=O.CabID)", "O.*,C.Kode_Cab", "", $asql); + $obj->add_field("No_Opname", "No. Trans", "c"); + $obj->add_field("Tgl_Opname", "Tgl. Trans", "c", "sqltgl", "", "val-tgl"); + $obj->add_field("Kode_Cab", "Cabang", "c"); + $obj->add_field("Total_Opname", "Total", "r", "rupiah2"); + $obj->add_field("Catatan", "Catatan", "awr"); + $obj->set_field_order("No_Opname", "D"); + $obj->set_func_select("OpnameJS.tx_select"); + $this->app->json([ $obj->db_table("divBrowTX") ]); + } + + public function brow_produk() { + $tcari = Param::Get("Cari_Produk"); + $tsql = ''; $asql = []; + if (!empty($tcari)) { + $tsql .= " AND Barcode_Nama LIKE ?"; + array_push($asql, '%' . $tcari . '%'); + } + array_push($asql, $this->id_cab); + + $obj = new Table($this->app); + $obj->set_table("(SELECT * FROM inv_produk_join WHERE Aktif=1".$tsql." GROUP BY InvID,SatuanID,VarianID) P LEFT JOIN inv_stok X ON (X.CabID=? AND X.InvID=P.InvID)", "P.*,IF(IFNULL(X.Stok,0)=0,0,ROUND(X.Stok/P.Qty,2)) Sisa_Stok", "", $asql); + $obj->add_field("InvID", "ID", "hid"); + $obj->add_field("SatuanID", "ID", "hid"); + $obj->add_field("VarianID", "ID", "hid"); + $obj->add_field("Kode_SKU", "SKU", "c"); + $obj->add_field("Kode_Barcode", "Barcode", "c"); + $obj->add_field("Nama_Lengkap", "Nama Barang", "awr"); + $obj->add_field("Sisa_Stok", "Stok", "r", "rupiah2"); + $obj->set_field_order("Kode_SKU", "A"); + $obj->set_func_select("OpnameJS.produk_select"); + $this->app->json([ $obj->db_table("divBrowProduk") ]); + } + + public function auto_produk() { + $tcari = Param::Get("Auto_Query", ""); + $ajson['autodata'] = []; + $bcode = 0; $arec = []; + + // Cari by SKU + Barcode + // Satuan : Varian : Harga_Pokok : Satuan : Stok + if ($bcode === 0) { + $_row = $this->db->fetchRow("SELECT P.InvID,P.Nama_Lengkap,CONCAT(P.SatuanID,':',P.VarianID,':',CONVERT(FORMAT(P.Harga_Pokok,2) USING UTF8),':',P.Satuan_Kemasan,':',CONVERT(FORMAT(IF(IFNULL(X.Stok,0)=0,0,ROUND(X.Stok/P.Qty,2)),2) USING UTF8)) Data2 FROM (SELECT * FROM inv_produk_join WHERE Aktif=1 AND (Kode_SKU=? OR Kode_Barcode=?) GROUP BY InvID,SatuanID,VarianID) P LEFT JOIN inv_stok X ON (X.CabID=? AND X.InvID=P.InvID)", [$tcari, $tcari, $this->id_cab]); + if ($_row) { + $bcode = 1; + $arec = $_row->getData(); + } + } + + if ($bcode === 1) { + $ajson['autodata'][] = ['value'=>$arec['InvID'], 'text'=>$arec['Nama_Lengkap'], 'data'=>$arec['Data2'], 'bc'=>1]; + } else { + $stat = $this->db->runQuery("SELECT P.InvID,P.Nama_Lengkap,P.Kode_SKU,IF(IFNULL(X.Stok,0)=0,'KOSONG',ROUND(X.Stok/P.Qty,2)) Sisa_Stok,CONCAT(P.SatuanID,':',P.VarianID,':',CONVERT(FORMAT(P.Harga_Pokok,2) USING UTF8),':',P.Satuan_Kemasan,':',CONVERT(FORMAT(IF(IFNULL(X.Stok,0)=0,0,ROUND(X.Stok/P.Qty,2)),2) USING UTF8)) Data2 FROM (SELECT * FROM inv_produk_join WHERE Barcode_Nama LIKE ? AND Aktif=1 GROUP BY InvID,SatuanID,VarianID) P LEFT JOIN inv_stok X ON (X.CabID=? AND X.InvID=P.InvID) ORDER BY P.Nama_Produk,P.Qty LIMIT 50", ['%'.$tcari.'%', $this->id_cab]); + while ($row = $stat->fetch(SimplePdo::FETCH_ASSOC)) { + $ajson['autodata'][] = ['value'=>$row['InvID'], 'text'=>$row['Nama_Lengkap'], 'html'=>''.$row['Kode_SKU'].' '.$row['Nama_Lengkap'].' ('.(string) $row['Sisa_Stok'].')', 'data'=>$row['Data2'], 'bc'=>0]; + } + } + $this->app->json($ajson); + } + + public function form_master() { + $ajson = [ 'error'=>"", 'html'=>"" ]; + $atabel = []; + + if ($this->mode === "add") { + $atabel = $this->Data_Opname("", true); + } else if ($this->mode === "edit") { + $this->inv->Detail_Copy($this->no_opname, true); + $atabel = $this->Data_Opname($this->no_opname); + } else if ($this->mode === "save") { + $no_lama = $this->no_opname; + if ($this->is_baru) { + $this->no_opname = $this->inv->Nomor_Baru("O", Param::Get("Tgl_Opname"), true); + } + $this->inv->Detail_Save($this->no_opname, 1, $this->id_cab, Param::Get("Tgl_Opname"), $this->is_baru, $no_lama); + + $tot_opname = $this->db->fetchField("SELECT SUM(Qty*Harga_Beli) Opname FROM inv_detail WHERE No_Ref=?", [$this->no_opname]) ?? 0; + + $sql = new SQL($this->app); + $sql->set_table("inv_opname"); + $sql->add_param_date("Tgl_Opname"); + $sql->add_param("CabID"); + $sql->add_param("Total_Opname", $tot_opname); + $sql->add_param("Catatan"); + $sql->add_param_stamp(); + $sql->add_param_userid(); + $sql->add_where("No_Opname", $this->no_opname); + $sql->UpdateDB(); + + // PROSES POSTING GL + $ainfo = $this->db->fetchRow("SELECT * FROM inv_opname WHERE No_Opname=?", [$this->no_opname]); + if (count($ainfo) > 0) { + $ajurnal = [ + 'Kode_Jurnal' => $ainfo['No_Opname'], + 'TipeID' => 12, + 'CabID' => $ainfo['CabID'], + 'Tanggal' => tgl_sql2str($ainfo['Tgl_Opname']), + 'Kode_Ref' => $ainfo['No_Opname'], + 'Catatan' => "Opname Stok / Penyesuaian : ".$ainfo['No_Opname']." - ".tgl_sql2str($ainfo['Tgl_Opname']) + ]; + $_dkD = ($ainfo['Total_Opname'] > 0) ? "K" : "D"; + $_dkK = ($ainfo['Total_Opname'] < 0) ? "K" : "D"; + $adetail = [ + [ 'Kode_Rek' => $this->app_gel['HPP'], 'DK' => $_dkD, 'Jumlah' => $ainfo['Total_Opname'] ], + [ 'Kode_Rek' => $this->app_gel['STOK'], 'DK' => $_dkK, 'Jumlah' => $ainfo['Total_Opname'] ] + ]; + $this->gel->Jurnal_Post($ajurnal, $adetail); + } + $atabel = $this->Data_Opname($this->no_opname); + $this->mode = "view"; + + } else if ($this->mode === "cancel") { + $this->inv->Detail_Cancel($this->no_opname); + $atabel = $this->Data_Opname(); + } else { + $atabel = $this->Data_Opname($this->no_opname); + } + + $enable = in_array($this->mode, ["add","edit"]) ? true : false; + $form = new Form($this->app); + $tnota = $form->textbox("_", "No_Opname", $atabel['No_Opname'], !$enable, true, "text", "nomor transaksi"); + $ttglnota = $form->datebox("_", "Tgl_Opname", $atabel['Tgl_Opname'], $enable, true); + $tcab = $form->option_db("_", "CabID", $atabel['CabID'], $enable, false, "para_cabang", ["CabID","Nama_Cab"], "Aktif=1 ORDER BY Nama_Cab", [0," "]); + $tcatat = $form->textbox("_", "Catatan", $atabel['Catatan'], $enable, true, "text", "catatan"); + $ajson['html'] = ' +
+
+
+ +
'.$tnota.'
+
+
+ +
'.$ttglnota.'
+
+
+
+
+ +
'.$tcab.'
+
+
+ +
'.$tcatat.'
+
+
+
+

+ '; + $this->app->json($ajson); + } + + public function form_produk() { + $id = (int) Param::Get("ID", 0); + $atabel = [ 'ID'=>$id, 'InvID'=>$this->id_inv, 'SatuanID'=>$this->id_satuan, 'VarianID'=>$this->id_varian, 'Nama_Lengkap'=>"", 'Nama_Satuan'=>"", 'Qty'=>0, 'Stok'=>0, 'Harga_Beli'=>0, 'Kali'=>1 ]; + if ($id > 0) { + $_row = $this->db->fetchRow("SELECT ID,Qty,Harga_Beli FROM tmp_inv_detail WHERE No_Ref=? AND ID=?", [$this->no_opname, $id]); + if ($_row) $atabel = array_merge($atabel, $_row->getData()); + } + if ((int) $atabel['InvID'] > 0 && (int) $atabel['SatuanID'] > 0) { + $_row = $this->db->fetchRow("SELECT Nama_Lengkap,Nama_Satuan,Harga_Pokok Harga_Beli,Qty Kali FROM vi_inv_produk WHERE InvID=? AND SatuanID=? AND VarianID=?", [$atabel['InvID'], $atabel['SatuanID'], $atabel['VarianID']]); + if ($_row) $atabel = array_merge($atabel, $_row->getData()); + $_stok = $this->db->fetchField("SELECT Stok FROM inv_stok WHERE CabID=? AND InvID=?", [$this->id_cab, $atabel['InvID']]) ?? 1; + $atabel['Stok'] = $_stok / ($atabel['Kali'] ?? 1); + } + + $form = new Form($this->app); + $tnama = $form->textauto("_", "Nama_Produk", ['value'=>$atabel['InvID'],'text'=>$atabel['Nama_Lengkap']], true, true, "ketik nama produk"); + $tqty = $form->textbox("_", "Qty", $atabel['Qty'], true, true, "double"); + $tstok = $form->textbox("_", "Stok", $atabel['Stok'], false, false, "double"); + $tbeli = $form->textbox("_", "Harga_Beli", $atabel['Harga_Beli'], false, false, "double"); + $tsat1 = $form->textbox("_", "Nama_Satuan1", $atabel['Nama_Satuan'], false); + $tsat2 = $form->textbox("_", "Nama_Satuan2", $atabel['Nama_Satuan'], false); + $ajson['html'] = ' +
+ +
'.$tnama.'
+
+
+ +
'.$tbeli.'
+
+

+
+ +
'.$tqty.$tsat1.'
+
+
+ +
'.$tstok.$tsat2.'
+
+ + + + + '; + $this->app->json($ajson); + } + + public function proses_delete() { + $this->db->runQuery("DELETE FROM inv_opname WHERE No_Opname=?", [$this->no_opname]); + $this->db->runQuery("DELETE FROM inv_detail WHERE No_Ref=?", [$this->no_opname]); + // PROSES POSTING GL + $this->db->runQuery("DELETE FROM gel_jurnal WHERE Kode_Jurnal=?", [$this->no_opname]); + $this->db->runQuery("DELETE FROM gel_jurnal_detail WHERE Kode_Jurnal=?", [$this->no_opname]); + $this->app->json([ 'status' => true ]); + } + + public function index() { + $this->app->json(['html' => ' +
+
+ +
+
+
 
+
 
+
+
+
+
' + ]); + } + + private function Data_Opname(string $nomor="", bool $baru=false): array { + $aparam = [ 'No_Opname'=>$nomor, 'Catatan'=>"" ]; + if (empty($nomor)) { + if ($baru) $aparam['No_Opname'] = "OPNA".$this->web_app['SERVER_ID'].(string) $this->id_cab.$this->app->user()->id(3)."#00"; + $aparam['Tgl_Opname'] = tgl_ymd(); + $aparam['CabID'] = $this->id_cab; + } else { + $row = $this->db->fetchRow("SELECT * FROM inv_opname WHERE No_Opname=?", [$nomor]); + if ($row) $aparam = array_merge($aparam, $row->getData()); + } + return $aparam; + } +} diff --git a/app/Controller/Inv/OpnamebarangController.php b/app/Controller/Inv/OpnamebarangController.php new file mode 100644 index 0000000..0417e41 --- /dev/null +++ b/app/Controller/Inv/OpnamebarangController.php @@ -0,0 +1,206 @@ +app = $app; + $this->db = $db; + $this->app_gel = (array) $session->get('APP_GEL'); + $this->id_cab = $session->get('APP_INV')['CABANGID']; + $this->inv = new Inv($app); + $this->gel = new Gel($app); + } + + public function brow_produk() { + $tcari = Param::Get("Cari_Produk"); + $tsql = ''; $asql = []; + if (!empty($tcari)) { + $tsql .= " AND Barcode_Nama LIKE ?"; + array_push($asql, '%' . $tcari . '%'); + } + array_push($asql, $this->id_cab); + + $obj = new Table($this->app); + $obj->set_table("(SELECT * FROM inv_produk_join WHERE Aktif=1".$tsql." GROUP BY InvID,SatuanID,VarianID) P LEFT JOIN inv_stok X ON (X.CabID=? AND X.InvID=P.InvID)", "P.*,IF(IFNULL(X.Stok,0)=0,0,ROUND(X.Stok/P.Qty,2)) Sisa_Stok", "", $asql); + $obj->add_field("InvID", "ID", "hid"); + $obj->add_field("SatuanID", "ID", "hid"); + $obj->add_field("VarianID", "ID", "hid"); + $obj->add_field("Kode_SKU", "SKU", "c"); + $obj->add_field("Kode_Barcode", "Barcode", "c"); + $obj->add_field("Nama_Lengkap", "Nama Barang", "awr"); + $obj->add_field("Satuan_Kemasan", "Satuan", "hid"); + $obj->add_field("Harga_Pokok", "HPP", "hid"); + $obj->add_field("Sisa_Stok", "Stok", "r", "rupiah2"); + $obj->add_field("PPN", "PPN", "hid"); + $obj->set_field_order("Kode_SKU", "A"); + $obj->set_func_select("OpnameBarangJS.produk_select"); + $this->app->json([ $obj->db_table("divBrowProduk") ]); + } + + public function auto_produk() { + $tcari = Param::Get("Auto_Query", ""); + $ajson['autodata'] = []; + $bcode = 0; $arec = []; + + // Cari by SKU + Barcode + // Satuan : Varian : SKU + Barcode : Harga_Pokok : Satuan : PPN : Stok + if ($bcode === 0) { + $_row = $this->db->fetchRow("SELECT P.InvID,P.Nama_Lengkap,CONCAT(P.SatuanID,':',P.VarianID,':',P.Kode_SKU,' / ',P.Kode_Barcode,':',CONVERT(P.Harga_Pokok USING UTF8),':',P.Satuan_Kemasan,':',P.PPN,':',CONVERT(FORMAT(IF(IFNULL(X.Stok,0)=0,0,ROUND(X.Stok/P.Qty,2)),2) USING UTF8)) Data2 FROM (SELECT * FROM inv_produk_join WHERE Aktif=1 AND (Kode_SKU=? OR Kode_Barcode=?) GROUP BY InvID,SatuanID,VarianID) P LEFT JOIN inv_stok X ON (X.CabID=? AND X.InvID=P.InvID)", [$tcari, $tcari, $this->id_cab]); + if ($_row) { + $bcode = 1; + $arec = $_row->getData(); + } + } + + if ($bcode === 1) { + $ajson['autodata'][] = ['value'=>$arec['InvID'], 'text'=>$arec['Nama_Lengkap'], 'data'=>$arec['Data2'], 'bc'=>1]; + } else { + $stat = $this->db->runQuery("SELECT P.InvID,P.Nama_Lengkap,P.Kode_SKU,IF(IFNULL(X.Stok,0)=0,'KOSONG',ROUND(X.Stok/P.Qty,2)) Sisa_Stok,CONCAT(P.SatuanID,':',P.VarianID,':',P.Kode_SKU,' / ',P.Kode_Barcode,':',CONVERT(P.Harga_Pokok USING UTF8),':',P.Satuan_Kemasan,':',P.PPN,':',CONVERT(FORMAT(IF(IFNULL(X.Stok,0)=0,0,ROUND(X.Stok/P.Qty,2)),2) USING UTF8)) Data2 FROM (SELECT * FROM inv_produk_join WHERE Barcode_Nama LIKE ? AND Aktif=1 GROUP BY InvID,SatuanID,VarianID) P LEFT JOIN inv_stok X ON (X.CabID=? AND X.InvID=P.InvID) ORDER BY P.Nama_Produk,P.Qty LIMIT 50", ['%'.$tcari.'%', $this->id_cab]); + while ($row = $stat->fetch(SimplePdo::FETCH_ASSOC)) { + $ajson['autodata'][] = ['value'=>$row['InvID'], 'text'=>$row['Nama_Lengkap'], 'html'=>''.$row['Kode_SKU'].' '.$row['Nama_Lengkap'].' ('.(string) $row['Sisa_Stok'].')', 'data'=>$row['Data2'], 'bc'=>0]; + } + } + $this->app->json($ajson); + } + + public function scan_produk() { + $tcari = Param::Get("Cari_Produk", ""); + $scandata = ['Nama_Supplier'=>"BELUM ADA"]; + + // Cari by SKU + Barcode + // Satuan : Varian : SKU + Barcode : Harga_Pokok : Satuan : PPN : Stok + $_row = $this->db->fetchRow("SELECT P.InvID,P.SatuanID,P.VarianID,P.Nama_Lengkap Nama_Barang,CONCAT(P.Kode_SKU,' / ',P.Kode_Barcode) Kode_Barang,P.Harga_Pokok Harga_Beli,P.Satuan_Kemasan Nama_Satuan,P.PPN,FORMAT(IFNULL(X.Stok,0),2) Stok_Sistem FROM (SELECT * FROM inv_produk_join WHERE Aktif=1 AND (Kode_SKU=? OR Kode_Barcode=?) GROUP BY InvID,SatuanID,VarianID) P LEFT JOIN inv_stok X ON (X.CabID=? AND X.InvID=P.InvID)", [$tcari, $tcari, $this->id_cab]); + if ($_row) $scandata = array_merge($scandata, $_row->getData()); + $this->app->json([ $scandata ]); + } + + public function proses_simpan() { + $no_opname = ""; + $id_inv = Param::Int("InvID", 0); + $id_satuan = Param::Int("SatuanID", 0); + $qty = Param::Float("Stok_Fisik", 0); + $hpp = Param::Float("Harga_Beli", 0); + + $no_opname = $this->db->fetchField("SELECT No_Opname FROM inv_opname WHERE Tgl_Opname=CURDATE() AND CabID=? AND UserID=? ORDER BY No_Opname DESC", [$this->id_cab, $this->app->user()->id()]) ?? ''; + if (empty($no_opname)) { + $no_opname = $this->inv->Nomor_Baru("O", tgl_dmy(), true); + $this->db->runQuery("UPDATE inv_opname SET Tgl_Opname=CURDATE(), CabID=?, Catatan=?, UserID=? WHERE No_Opname=?", [$this->id_cab, 'OPNAME USER : '.$this->app->user()->username().' - '.$this->app->user()->nama(), $this->app->user()->id(), $no_opname]); + } + + $_qty = $this->db->fetchField("SELECT SUM(Stok) Stok FROM inv_detail WHERE Tgl_Ref<=? AND CabID=? AND InvID=?", [tgl_ymd(), $this->id_cab, $id_inv]) ?? 0; + $qty -= $_qty; + + $_stok = (float) $this->db->fetchField("SELECT Qty FROM inv_produk_kemasan WHERE InvID=? AND SatuanID=?", [$id_inv, $id_satuan]) ?? 1; + $stok = $_stok * $qty; + + $sql = new SQL($this->app); + $sql->set_table("inv_detail"); + $sql->add_param("No_Ref", $no_opname); + $sql->add_param("Tgl_Ref", "CURDATE()", true); + $sql->add_param("NotaID", 1); + $sql->add_param("CabID", $this->id_cab); + $sql->add_param("InvID"); + $sql->add_param("SatuanID"); + $sql->add_param("VarianID"); + $sql->add_param("Qty", $qty); + $sql->add_param("Stok", $stok); + $sql->add_param("Harga_Beli", $hpp); + $sql->add_param("Harga_Jual", "Harga_Beli", true); + $sql->add_param("PPN"); + $sql->add_param_userid(); + $sql->InsertDB(); + + $tot_opname = $this->db->fetchField("SELECT SUM(Qty*Harga_Beli) Opname FROM inv_detail WHERE No_Ref=?", [$no_opname]) ?? 0; + if ($tot_opname > 0) { + $this->db->runQuery("UPDATE inv_opname SET Total_Opname=? WHERE No_Opname=?", [$tot_opname, $no_opname]); + + // PROSES POSTING GL + $ajurnal = [ + 'Kode_Jurnal' => $no_opname, + 'TipeID' => 12, + 'CabID' => $this->id_cab, + 'Tanggal' => tgl_dmy(), + 'Kode_Ref' => $no_opname, + 'Catatan' => "Opname Stok / Penyesuaian : ".$no_opname." - ".tgl_dmy() + ]; + $_dkD = ($tot_opname > 0) ? "K" : "D"; + $_dkK = ($tot_opname < 0) ? "K" : "D"; + $adetail = [ + [ 'Kode_Rek' => $this->app_gel['HPP'], 'DK' => $_dkD, 'Jumlah' => $tot_opname ], + [ 'Kode_Rek' => $this->app_gel['STOK'], 'DK' => $_dkK, 'Jumlah' => $tot_opname ] + ]; + $this->gel->Jurnal_Post($ajurnal, $adetail); + } + $this->app->json([ 'status' => true ]); + } + + public function index() { + $form = new Form($this->app); + $tbrg = $form->textauto("_", "Nama_Produk", ['value'=>0, 'text'=>""], true, true, "Scan SKU / Barcode / Ketik Nama Barang"); + $tkode = $form->textbox("_", "Kode_Barang", "KODE_SKU / KODE_BARCODE", false); + $tnama = $form->textbox("_", "Nama_Barang", "NAMA_BARANG", false); + $tsat = $form->textbox("_", "Nama_Satuan", "SATUAN", false); + $tssis = $form->textbox("_", "Stok_Sistem", "0", false, false, "double"); + $tsfis = $form->textbox("_", "Stok_Fisik", "0", true, false, "double"); + $ajson['html'] = ''; + if (isMobile()) { + $ajson['html'] .= ' +
+
+
Kode SKU / Barcode
'.$tkode.'
+ '; + } else { + $ajson['html'] .= ' +
Kunci Pencarian
'.$tbrg.'
+
+
Kode SKU / Barcode
'.$tkode.'
+ '; + } + + $ajson['html'] .= ' +
Nama Barang
'.$tnama.'
+
Satuan
'.$tsat.'
+
Stok Sistem
'.$tssis.'
+
Stok Fisik
'.$tsfis.'
+ + + + + '; + $this->app->json($ajson); + } + +} diff --git a/app/Controller/Inv/PosController.php b/app/Controller/Inv/PosController.php new file mode 100644 index 0000000..bf86513 --- /dev/null +++ b/app/Controller/Inv/PosController.php @@ -0,0 +1,645 @@ +app = $app; + $this->db = $db; + $this->web_app = (array) $session->get('WEB_APP'); + $this->app_gel = (array) $session->get('APP_GEL'); + $this->app_inv = (array) $session->get('APP_INV'); + $this->id_cab = $session->get('APP_INV')['CABANGID']; + $this->id_member_def = $session->get('APP_INV')['MEMBERID']; + $this->id_member = Param::Int("MemberID", $this->id_member_def); + $this->id_grup_member = Param::Int("Grup_MemberID", $session->get('APP_INV')['ECERANID']); + $this->mode = Param::Get("mode", ""); + $this->mode_detail = Param::Get("mode_detail", ""); + $this->no_jual = Param::Get("No_Jual", ""); + $this->is_pend = str_contains($this->no_jual, "POS") === true; + $this->id_inv = Param::Int("InvID", 0); + $this->id_satuan = Param::Int("SatuanID", 0); + $this->id_varian = Param::Int("VarianID", 0); + $this->inv = new Inv($app); + $this->gel = new Gel($app); + } + + public function table_detail() { + if ( in_array($this->mode_detail, ["insert","update"]) ) { + $iqty = Param::Float("Qty", 0) * -1; + $disk_rp = Param::Float("Disk_Rupiah", 0); + $disk_psn = Param::Float("Disk_Persen", 0); + if ($disk_psn > 0) $disk_rp = Param::Float("Harga_Jual", 0) * $disk_psn * 0.01; + + $sql = new SQL($this->app); + $sql->set_table("tmp_inv_detail"); + $sql->add_param("No_Ref", $this->no_jual); + $sql->add_param("InvID"); + $sql->add_param("SatuanID"); + $sql->add_param("VarianID"); + $sql->add_param("Qty", $iqty); + $sql->add_param("Harga_Beli"); + $sql->add_param("Harga_Jual"); + $sql->add_param("Disk_Rupiah", $disk_rp); + $sql->add_param("Total_Diskon", "Disk_Rupiah*-Qty", true); + $sql->add_param_unix(); + $sql->add_param_userid(); + $sql->add_where("ID"); + $sql->add_where("No_Ref", $this->no_jual); + + if ( $this->mode_detail === "insert" ) { + $sql->InsertDB(); + } else if ( $this->mode_detail === "update" ) { + $sql->UpdateDB(); + } + } else if ( $this->mode_detail === "delete" ) { + $this->db->runQuery("UPDATE tmp_inv_detail SET Qty=0,Stok=0,Disk_Rupiah=0,Total_Diskon=0 WHERE No_Ref=? AND ID=?", [$this->no_jual, Param::Int("ID", 0)]); + } + + $asql = [$this->no_jual, $this->app->user()->unix()]; + + $obj = new Table($this->app); + $obj->set_css("tabel-pos"); + $obj->set_table("(SELECT * FROM tmp_inv_detail WHERE No_Ref=? AND Unix=? AND Promo<2) D LEFT JOIN vi_inv_produk P ON (D.InvID=P.InvID AND D.SatuanID=P.SatuanID AND D.VarianID=P.VarianID)", "D.*,-D.Qty Qty2,P.Kode_SKU,P.Nama_Lengkap,-D.Qty*(D.Harga_Jual-D.Disk_Rupiah) Total,IF(D.Qty=0,0,1) IDEL", "", $asql); + $obj->set_footer("CONCAT('Q: ',FORMAT(SUM(-D.Qty),2),' / I: ',FORMAT(COUNT(DISTINCT D.InvID),0)) Harga_Jual,SUM(-D.Qty*D.Disk_Rupiah) Disk_Rupiah,SUM(-D.Qty*(D.Harga_Jual-D.Disk_Rupiah)) Total"); + $obj->add_field("ID", "No", "c"); + $obj->add_field("InvID", "InvID", "hid"); + $obj->add_field("SatuanID", "SatuanID", "hid"); + $obj->add_field("VarianID", "VarianID", "hid"); + $obj->add_field("Kode_SKU", "SKU", "c"); + $obj->add_field("Nama_Lengkap", "Nama Barang", "awr"); + $obj->add_field("Qty2", "Qty", "r", "rupiah2"); + $obj->add_field("Harga_Jual", "Harga @", "r", "rupiah"); + $obj->add_field("Disk_Rupiah", "Diskon @", "r", "rupiah", "rupiah"); + $obj->add_field("Total", "Jumlah", "r", "rupiah", "rupiah"); + $obj->add_field("Promo", "S", "c", [0=>"N",1=>"T",2=>"D",3=>"P",4=>"H"]); + $obj->set_field_order("ID", "D"); + $obj->set_row_color("IDEL", "0", "rcoret"); + $obj->add_row_btn("clipboard", "Ubah", "POSJS.detail_ubah"); + $obj->add_row_btn("trash", "Hapus", "POSJS.detail_hapus", "IDEL", "1"); + $ajson[] = $obj->json_table("divPOS1", 8); + + $ainfo = ['Total'=>0, 'Item'=>0]; + $_info = $this->db->fetchRow("SELECT SUM(-Qty*(Harga_Jual-Disk_Rupiah)) Total,COUNT(*) Item FROM tmp_inv_detail WHERE No_Ref=? AND Unix=? AND Promo<2", $asql); + if ($_info) $ainfo = $_info->getData(); + $ajson[] = ['type'=>"form", 'id'=>"Total_Nota", 'value'=>$ainfo['Total']]; + $ajson[] = ['type'=>"form", 'id'=>"Total_Item", 'value'=>$ainfo['Item']]; + if ($ainfo['Item'] > 0) $ajson[] = ['type'=>"html", 'id'=>"Total_Disp", 'value'=>rupiah($ainfo['Total'])]; + $this->app->json($ajson); + } + + public function brow_nota() { + $tcari = Param::Get("Cari_Nota"); + $tsql = ''; $asql = [$this->id_cab]; + if (empty($tcari)) { + $tsql .= " AND UserID=? AND Tgl_Jual=?"; + array_push($asql, $this->app->user()->id(), tgl_ymd()); + } else { + $tsql .= " AND CONCAT(No_Jual,DATE_FORMAT(Tgl_Jual,'%d-%m-%Y')) LIKE ?"; + array_push($asql, '%' . $tcari . '%'); + } + + $obj = new Table($this->app); + $obj->set_table("(SELECT * FROM inv_jual WHERE POS=1 AND CabID=?".$tsql.") J LEFT JOIN para_rek_pos P ON (J.KartuID=P.KartuID) LEFT JOIN para_member M ON (J.MemberID=M.MemberID)", "J.*,DATE_FORMAT(J.DateStamp,'%H:%i:%s') Tgl_Jual2,J.Total_Jual-J.Total_Diskon Total,IFNULL(M.Nama_Member,'') Nama_Member,IF(ISNULL(P.Kode_Kartu),'Tunai',P.Kode_Kartu) Kartu", "", $asql); + $obj->set_footer("SUM(Total_Jual) Total_Jual,SUM(Total_Diskon) Total_Diskon,SUM(Total_Jual-Total_Diskon) Total"); + $obj->add_field("No_Jual", "No. Nota", "c"); + $obj->add_field("Tgl_Jual", "Tanggal", "c", "sqltgl", "", "val-tgl"); + $obj->add_field("Tgl_Jual2", "Jam", "c"); + $obj->add_field("Nama_Member", "Member", "awr"); + $obj->add_field("Total_Jual", "Sub. Total", "r", "rupiah2", "rupiah2"); + $obj->add_field("Total_Diskon", "Diskon", "r", "rupiah2", "rupiah2"); + $obj->add_field("Total", "Jumlah", "r", "rupiah2", "rupiah2"); + $obj->add_field("Kartu", "C / D", "l"); + if (empty($tcari)) { + $obj->set_field_order("Tgl_Jual2", "D"); + } else { + $obj->set_field_order("Tgl_Jual", "D"); + } + $obj->add_row_btn("printer", "Cetak", "POSJS.nota_print"); + $obj->add_row_btn("clipboard", "Ubah", "POSJS.nota_select"); + if ($this->app->user()->is_level(1)) $obj->add_row_btn("trash", "Hapus", "POSJS.nota_delete", "CabID", $this->id_cab); + else $obj->add_row_btn("trash", "Hapus", "POSJS.nota_delete", "UserID", $this->app->user()->id()); + $this->app->json([ $obj->db_table("divBrowNota") ]); + } + + public function brow_pending() { + $obj = new Table($this->app); + $obj->set_table("(SELECT *,Total_Jual-Total_Diskon Jumlah FROM inv_jual_pend WHERE POS=1 AND CabID=? AND UserID=?) J LEFT JOIN para_member B ON (J.MemberID=B.MemberID)", "J.*,B.Nama_Member", "", [$this->id_cab, $this->app->user()->id()]); + $obj->add_field("No_Jual", "No. Nota", "c"); + $obj->add_field("Tgl_Jual", "Tgl. Pending", "c", "sqltgl", "", "val-tgl"); + $obj->add_field("Nama_Member", "Nama Member", "awr"); + $obj->add_field("Total_Jual", "Sub. Total", "r", "rupiah2"); + $obj->add_field("Total_Diskon", "Diskon", "r", "rupiah2"); + $obj->add_field("Jumlah", "Jumlah", "r", "rupiah2"); + $obj->set_field_order("No_Jual", "D"); + $obj->add_row_btn("save", "Pilih", "POSJS.pending_select"); + if ($this->app->user()->is_level(1)) $obj->add_row_btn("trash", "Hapus", "POSJS.pending_delete", "UserID", $this->app->user()->id()); + $this->app->json([ $obj->db_table("divBrowPending") ]); + } + + public function brow_member() { + $tcari = Param::Get("Cari_Member"); + $tsql = ''; $asql = [1]; + if (!empty($tcari)) { + $tsql .= " AND CONCAT_WS(Kode_Member,Nama_Member,Alamat_Member,Telp_Member) LIKE ?"; + $asql[] = '%' . $tcari . '%'; + } + + $obj = new Table($this->app); + $obj->set_table("para_member", "*,TRIM(CONCAT(Kode_Member,'\n',Kota_Member)) Info_Member", "Aktif=?".$tsql, $asql); + $obj->add_field("MemberID", "ID", "hid"); + $obj->add_field("Grup_MemberID", "Grup ID", "hid"); + $obj->add_field("Kode_Member", "Kode", "c"); + $obj->add_field("Nama_Member", "Nama Member", "awr"); + $obj->add_field("Alamat_Member", "Alamat", "awr"); + $obj->add_field("Telp_Member", "Telp.", "awr"); + $obj->add_field("Info_Member", "Info", "hid"); + $obj->set_field_order("Nama_Member", "A"); + $obj->set_func_select("POSJS.member_select"); + $this->app->json([ $obj->db_table("divBrowMember") ]); + } + + public function brow_produk() { + $tcari = Param::Get("Cari_Produk"); + $tsql = ''; $asql = [1, $this->id_grup_member]; + if (!empty($tcari)) { + $tsql .= " AND Barcode_Nama LIKE ?"; + $asql[] = '%' . $tcari . '%'; + } + + $obj = new Table($this->app); + $obj->set_table("inv_produk_join", "*", "Aktif=? AND Grup_MemberID=? AND Harga_Jual>0".$tsql, $asql); + $obj->add_field("InvID", "ID", "hid"); + $obj->add_field("SatuanID", "ID", "hid"); + $obj->add_field("VarianID", "ID", "hid"); + $obj->add_field("Kode_SKU", "SKU", "c"); + $obj->add_field("Kode_Barcode", "Barcode", "c"); + $obj->add_field("Nama_Lengkap", "Nama Barang", "awr"); + $obj->add_field("Harga_Jual", "Harga Jual", "r", "rupiah"); + $obj->set_field_order("Kode_SKU", "A"); + $obj->set_func_select("POSJS.produk_select"); + $this->app->json([ $obj->db_table("divBrowProduk") ]); + } + + public function auto_member() { + $tcari = Param::Get("Auto_Query", ""); + $ajson['autodata'] = []; + + $stat = $this->db->runQuery("SELECT MemberID,Grup_MemberID,Kode_Member,Nama_Member,TRIM(CONCAT(Kode_Member,'\n',Kota_Member)) Info_Member FROM para_member WHERE Aktif=1 AND CONCAT(Kode_Member,Nama_Member,Alamat_Member,Telp_Member) LIKE ? ORDER BY Nama_Member LIMIT 50", ['%'.$tcari.'%']); + while ($row = $stat->fetch(SimplePdo::FETCH_ASSOC)) { + $ajson['autodata'][] = ['value'=>$row['MemberID'], 'text'=>$row['Nama_Member'], 'html'=>''.$row['Kode_Member'].' '.$row['Nama_Member'], 'data'=>$row['Grup_MemberID'].':'.$row['Info_Member'], 'bc'=>0]; + } + $this->app->json($ajson); + } + + public function auto_produk() { + $tcari = Param::Get("Auto_Query", ""); + $ajson['autodata'] = []; + $bcode = 0; $arec = []; + + if (is_numeric($tcari) && strlen($tcari) === 8) { + // Cari by Member + // M : Grup_Member : Info_Member + $_row = $this->db->fetchRow("SELECT MemberID InvID,Nama_Member Nama_Lengkap,CONCAT('M:',Grup_MemberID,':',TRIM(CONCAT(Kode_Member,'\n',Kota_Member))) Data2 FROM para_member WHERE Aktif=1 AND Kode_Member=?", [$tcari]); + if ($_row) { + $bcode = 1; + $arec = $_row->getData(); + } + } + + // Cari by SKU + Barcode + // P : Satuan : Varian : Harga_Pokok : Harga_Jual : Stok + if ($bcode === 0) { + $_row = $this->db->fetchRow("SELECT P.InvID,P.Nama_Lengkap,CONCAT('P:',P.SatuanID,':',P.VarianID,':',CONVERT(P.Harga_Pokok USING UTF8),':',CONVERT(P.Harga_Jual USING UTF8),':',CONVERT(IFNULL(X.Stok,0) USING UTF8)) Data2 FROM (SELECT * FROM inv_produk_join WHERE Aktif=1 AND Harga_Jual>0 AND Grup_MemberID=? AND (Kode_SKU=? OR Kode_Barcode=?)) P LEFT JOIN inv_stok X ON (X.CabID=? AND X.InvID=P.InvID)", [$this->id_grup_member, $tcari, $tcari, $this->id_cab]); + if ($_row) { + $bcode = 1; + $arec = $_row->getData(); + } + } + if ($bcode === 1) { + $ajson['autodata'][] = ['value'=>$arec['InvID'], 'text'=>$arec['Nama_Lengkap'], 'data'=>$arec['Data2'], 'bc'=>1]; + } else { + $stat = $this->db->runQuery("SELECT P.InvID,P.Nama_Lengkap,P.Kode_SKU,IF(IFNULL(X.Stok,0)=0,'KOSONG',ROUND(X.Stok/P.Qty,2)) Sisa_Stok,P.Harga_Jual,CONCAT('P:',P.SatuanID,':',P.VarianID,':',CONVERT(P.Harga_Pokok USING UTF8),':',CONVERT(P.Harga_Jual USING UTF8),':',CONVERT(IFNULL(X.Stok,0) USING UTF8)) Data2 FROM (SELECT * FROM inv_produk_join WHERE Barcode_Nama LIKE ? AND Aktif=1 AND Harga_Jual>0 AND Grup_MemberID=?) P LEFT JOIN inv_stok X ON (X.CabID=? AND X.InvID=P.InvID) ORDER BY P.Nama_Produk,P.Qty LIMIT 50", ['%'.$tcari.'%', $this->id_grup_member, $this->id_cab]); + while ($row = $stat->fetch(SimplePdo::FETCH_ASSOC)) { + $ajson['autodata'][] = ['value'=>$row['InvID'], 'text'=>$row['Nama_Lengkap'], 'html'=>''.$row['Kode_SKU'].' '.$row['Nama_Lengkap'].' - Rp'.rupiah($row['Harga_Jual']).' ('.(string) $row['Sisa_Stok'].')', 'data'=>$row['Data2'], 'bc'=>0]; + } + } + $this->app->json($ajson); + } + + public function form_master() { + $ajson = [ 'error'=>"", 'html'=>"" ]; + $atabel = []; + + if ($this->mode === "pending-edit") { + $this->inv->Pending_Edit($this->no_jual); + $atabel = $this->Data_Jual($this->no_jual); + $this->mode = "edit"; + } else if ($this->mode === "pending-save") { + $b_baru = false; + if (str_ends_with($this->no_jual, "#00")) { + $b_baru = true; + $no_lama = $this->no_jual; + $this->no_jual = $this->Pending_Nomor(); + $this->inv->Pending_Save($no_lama, $this->no_jual); + } + $apending = $this->db->fetchRow("SELECT SUM(-Qty*Harga_Jual) Jual,SUM(-Qty*Disk_Rupiah) Diskon FROM tmp_inv_detail WHERE No_Ref=?", [$this->no_jual]) ?? ['Jual'=>0, 'Diskon'=>0]; + + $sql = new SQL($this->app); + $sql->set_table("inv_jual_pend"); + $sql->add_param("No_Jual", $this->no_jual); + $sql->add_param_date("Tgl_Jual"); + $sql->add_param("CabID", $this->id_cab); + $sql->add_param("MemberID"); + $sql->add_param("Total_Jual", $apending['Jual']); + $sql->add_param("Total_Diskon", $apending['Diskon']); + $sql->add_param_userid(); + $sql->add_where("No_Jual", $this->no_jual); + if ($b_baru) $sql->InsertDB(); + else $sql->UpdateDB(); + $atabel = $this->Data_Jual(); + } else if ($this->mode === "pending-delete") { + $this->inv->Pending_Delete($this->no_jual); + $this->db->delete("inv_jual_pend", "No_Jual=?", [$this->no_jual]); + $atabel = $this->Data_Jual(); + } else if ($this->mode === "edit") { + $this->inv->Detail_Copy($this->no_jual, true); + $atabel = $this->Data_Jual($this->no_jual); + } else if ($this->mode === "save") { + $no_lama = $this->no_jual; + if ($this->is_pend) { + $this->no_jual = $this->inv->Nomor_POS("", tgl_dmy(), true); + if (!str_ends_with($no_lama, "#00")) $this->db->delete("inv_jual_pend", "No_Jual=?", [$no_lama]); + } + + // PROSES PROMO + $this->inv->Promo_Barang($no_lama, tgl_dmy(), $this->id_grup_member); + $tot_potong = $this->inv->Promo_Total($no_lama, tgl_dmy(), $this->id_grup_member); + + $this->inv->Detail_Save($this->no_jual, 6, $this->id_cab, tgl_dmy(), $this->is_pend, $no_lama); + + $ajual = $this->db->fetchRow("SELECT SUM(-Qty*Harga_Jual) Jual, SUM(-Qty*Disk_Rupiah) Diskon, SUM(-Qty*Harga_Beli) HPP FROM inv_detail WHERE No_Ref=?", [$this->no_jual]) ?? ['Jual'=>0, 'Diskon'=>0, 'HPP'=>0]; + + $id_kartu = Param::Int("KartuID", 0); + $no_kartu = ""; $nama_kartu = ""; $rek_debit = $this->app_gel['KAS_TUNAI']; + if ($id_kartu > 0) { + $no_kartu = Param::Get("No_Kartu", ""); + $nama_kartu = Param::Get("Nama_Kartu", ""); + $rek_debit = $this->db->fetchField("SELECT Kode_Rek FROM para_rek_pos WHERE KartuID=?", [$id_kartu]) ?? $rek_debit; + } + + $sql = new SQL($this->app); + $sql->set_table("inv_jual"); + $sql->add_param("Tgl_Jual", tgl_ymd()); + $sql->add_param("Tgl_Lunas", tgl_ymd()); + $sql->add_param("CabID", $this->id_cab); + $sql->add_param("MemberID"); + $sql->add_param("Total_Jual", $ajual['Jual']); + $sql->add_param("Total_Diskon", $ajual['Diskon']); + $sql->add_param("Total_Potong", $tot_potong); + $sql->add_param("Total_HPP", $ajual['HPP']); + $sql->add_param("Total_Bayar"); + $sql->add_param("Total_Kartu"); + $sql->add_param("KartuID", $id_kartu); + $sql->add_param("No_Kartu", $no_kartu); + $sql->add_param("Nama_Kartu", $nama_kartu); + $sql->add_param("Lunas", 1); + $sql->add_param_stamp(); + $sql->add_param_userid(); + $sql->add_where("No_Jual", $this->no_jual); + $sql->UpdateDB(); + + // PROSES MEMBER POINT + if ($this->id_member > 0) { + $apoint = $this->db->fetchColumn("SELECT Point_TipeID FROM inv_point_tipe WHERE Aktif=1 ORDER BY Point_TipeID") ?? []; + if (count($apoint) > 0) { + $amember = $this->db->fetchRow("SELECT Grup_MemberID,IM,Kode_Member FROM para_member WHERE MemberID=?", [$this->id_member]); + if ($amember && ($amember['IM'] === 1 || ($amember['IM'] === 0 && !empty($amember['Kode_Member'])))) { + $this->db->runQuery("DELETE FROM inv_point_tx WHERE No_TX=?", [$this->no_jual]); + foreach ($apoint as $id_tipe) { + if ($amember['IM'] === 0 && $id_tipe === 1) continue; + $tot_point = $this->inv->Point_Hitung($this->no_jual, tgl_dmy(), $amember['Grup_MemberID'], $id_kartu, $id_tipe); + if ($tot_point > 0) $this->db->runQuery("INSERT INTO inv_point_tx (No_TX,Tgl_TX,Point_TipeID,CabID,MemberID,Point,Nilai_Point,DateStamp,UserID) VALUES (?, ?, ?, ?, ?, ?, ?, NOW(), ?)", [$this->no_jual, tgl_ymd(), $id_tipe, $this->id_cab, $this->id_member, $tot_point, $tot_point, $this->app->user()->id()]); + } + } + } + } + + // PROSES POSTING GL + $ainfo = $this->db->fetchRow("SELECT J.*,B.Nama_Member,(J.Total_Jual-J.Total_Diskon) Tagihan FROM (SELECT * FROM inv_jual WHERE No_Jual=?) J LEFT JOIN para_member B ON (B.MemberID=J.MemberID)", [$this->no_jual]); + if (count($ainfo) > 0) { + $ajurnal = [ + 'Kode_Jurnal' => $ainfo['No_Jual'], + 'TipeID' => 7, + 'CabID' => $ainfo['CabID'], + 'Tanggal' => tgl_sql2str($ainfo['Tgl_Jual']), + 'Kode_Ref' => $ainfo['No_Jual'], + 'Catatan' => "Penjualan POS : ".$ainfo['No_Jual']." | ".$ainfo['Nama_Member']." | ".$this->app->user()->username() + ]; + $_rek_d = "D"; $_rek_k = "K"; + if ($ainfo['Tagihan'] < 0) { $_rek_d = "K"; $_rek_k = "D"; } + $adetail = [ + [ 'Kode_Rek' => $this->app_gel['HPP'], 'DK' => $_rek_d, 'Jumlah' => $ainfo['Total_HPP'] ], + [ 'Kode_Rek' => $this->app_gel['STOK'], 'DK' => $_rek_k, 'Jumlah' => $ainfo['Total_HPP'] ], + [ 'Kode_Rek' => $rek_debit, 'DK' => $_rek_d, 'Jumlah' => $ainfo['Tagihan'] ], + [ 'Kode_Rek' => $this->app_gel['JUAL'], 'DK' => $_rek_k, 'Jumlah' => $ainfo['Tagihan']+$ainfo['Total_Potong'] ] + ]; + if ($ainfo['Total_Potong'] > 0) array_push($adetail, [ 'Kode_Rek' => $this->app_gel['POT_JUAL'], 'DK' => "D", 'Jumlah' => $ainfo['Total_Potong'] ]); + $this->gel->Jurnal_Post($ajurnal, $adetail); + } + + $atabel = $this->Data_Jual(); + $atabel['No_Cetak'] = $this->no_jual; + $_kembali = (float) $this->db->fetchField("SELECT (Total_Jual-Total_Diskon-Total_Potong-Total_Bayar) Sisa FROM inv_jual WHERE No_Jual=?", [$this->no_jual]) ?? 0; + if ($_kembali !== 0) $atabel['Kembali'] = ''.rupiah($_kembali).''; + + //MONITOR DISPLAY + if ($this->app_inv['MON_ENABLE']) { + $this->db->runQuery("UPDATE disp_login SET No_Cetak=? WHERE CabID=? AND UserID=? AND Unix=?", [$this->no_jual, $this->id_cab, $this->app->user()->id(), $this->app->user()->unix()]); + } + + if ($this->app_inv['PRINT_AUTO'] === 1) { + $this->mode = "print"; + } else { + $this->mode = ($this->app_inv['PRINT_OPENCD'] === 1) ? "opencd" : "saveonly"; + } + + } else if ($this->mode === "delete") { + // PROSES UPDATE PROMO + $ajual = $this->db->fetchRow("SELECT J.*,M.Grup_MemberID FROM (SELECT MemberID,Tgl_Jual FROM inv_jual WHERE No_Jual=?) J LEFT JOIN para_member M ON (M.MemberID=J.MemberID)", [$this->no_jual]); + if ($ajual) $this->inv->Promo_Hapus($this->no_jual, tgl_sql2str($ajual['Tgl_Jual']), $ajual['Grup_MemberID']); + + // PROSES MEMBER POINT + if ($ajual['MemberID'] > 0) $this->db->runQuery("DELETE FROM inv_point_tx WHERE No_TX=?", [$this->no_jual]); + // PROSES POSTING GL + $this->db->runQuery("DELETE FROM gel_jurnal WHERE Kode_Jurnal=?", [$this->no_jual]); + $this->db->runQuery("DELETE FROM gel_jurnal_detail WHERE Kode_Jurnal=?", [$this->no_jual]); + + $this->db->runQuery("DELETE FROM inv_jual WHERE No_Jual=?", [$this->no_jual]); + $this->db->runQuery("DELETE FROM inv_detail WHERE No_Ref=?", [$this->no_jual]); + $atabel = $this->Data_Jual(); + + } else if ($this->mode === "cancel") { + if (str_ends_with($this->no_jual, "#00") || !$this->is_pend) $this->inv->Detail_Cancel($this->no_jual); + $atabel = $this->Data_Jual(); + } else { + $atabel = $this->Data_Jual(); + } + + //MONITOR DISPLAY + if ($this->app_inv['MON_ENABLE']) { + $this->db->runQuery("UPDATE disp_login SET No_Pos=? WHERE CabID=? AND UserID=? AND Unix=?", [$atabel['No_Jual'], $this->id_cab, $this->app->user()->id(), $this->app->user()->unix()]); + } + + $form = new Form($this->app); + $tno_jual = $form->textbox("_", "No_Jual", $atabel['No_Jual'], false); + $tn_member = $form->textauto("_", "Nama_Member", ['value'=>$atabel['MemberID'],'text'=>$atabel['Nama_Member']], true, true, "cari member"); + $ti_member = $form->textarea("_", "Info_Member", $atabel['Info_Member'], false); + $tinfo = '
'; + $ajson['html'] = ' +
+
'.$atabel['Kembali'].'
+
+
'.$tinfo.'
+
+
'.$tno_jual.'
+
+
+
'.$tn_member.'
+
+
'.$ti_member.'
+
+ + +
+
+ + +
+ + + + + + + + + + + + + '; + $this->app->json($ajson); + } + + public function form_produk() { + $id = (int) Param::Get("ID", 0); + $atabel = [ 'ID'=>$id, 'InvID'=>$this->id_inv, 'SatuanID'=>$this->id_satuan, 'VarianID'=>$this->id_varian, 'Kode_SKU'=>"", 'Kode_Barcode'=>"", 'Nama_Lengkap'=>"", 'Satuan_Kemasan'=>"", 'Qty'=>0, 'Harga_Beli'=>0, 'Harga_Jual'=>0, 'Disk_Rupiah'=>0 ]; + if ($id > 0) { + $_row = $this->db->fetchRow("SELECT ID,-Qty Qty,Harga_Beli,Harga_Jual,Disk_Rupiah FROM tmp_inv_detail WHERE No_Ref=? AND ID=?", [$this->no_jual, $id]); + if ($_row) $atabel = array_merge($atabel, $_row->getData()); + } + if ($this->id_inv > 0 && $this->id_satuan > 0) { + $_row = $this->db->fetchRow("SELECT Kode_SKU,Kode_Barcode,Nama_Lengkap,Satuan_Kemasan,Harga_Pokok Harga_Beli,Harga_Jual FROM inv_produk_join WHERE InvID=? AND SatuanID=? AND VarianID=? AND Grup_MemberID=?", [$this->id_inv, $this->id_satuan, $this->id_varian, $this->id_grup_member]); + if ($_row) $atabel = array_merge($atabel, $_row->getData()); + } + + $form = new Form($this->app); + $tsku = $form->textbox("_", "Kode_SKU", $atabel['Kode_SKU']. " / " .$atabel['Kode_Barcode'], false); + $tnama = $form->textbox("_", "Nama_Lengkap", $atabel['Nama_Lengkap'], false); + $tqty = $form->textbox("_", "Qty", $atabel['Qty'], true, true, "double"); + $tjual = $form->textbox("_", "Harga_Jual", $atabel['Harga_Jual'], false, false, "double"); + $tdisrp = $form->textbox("_", "Disk_Rupiah", $atabel['Disk_Rupiah'], true, false, "double"); + $tdispn = $form->textbox("_", "Disk_Persen", 0, true, false, "double"); + $ttot = $form->textbox("_", "Jumlah", 0, false, false, "double"); + $tsat = $form->textbox("_", "Nama_Satuan", $atabel['Satuan_Kemasan'], false); + $ajson['html'] = ' +
+ +
'.$tsku.'
+
+
+ +
'.$tnama.'
+
+

+
+ +
'.$tqty.$tsat.'
+
+
+ +
'.$tjual.'
+
+
+ +
'.$tdisrp.'
+
≈
'.$tdispn.'
%
+
+
+ +
'.$ttot.'
+
+ + + + + + '; + $this->app->json($ajson); + } + + public function form_kasir() { + $tot_jual = Param::Float("Total_Nota", 0); + $tot_jual -= $this->inv->Promo_Hitung($this->no_jual, tgl_dmy(), $this->id_grup_member); + + $form = new Form($this->app); + $tjual = $form->textbox("_", "popTotal_Jual", uang($tot_jual), false, false, "double"); + $ttunai = $form->textbox("_", "popTotal_Tunai", 0, true, false, "double"); + $tkartu = $form->textbox("_", "popTotal_Kartu", 0, true, false, "double"); + $tsisa = $form->textbox("_", "popTotal_Sisa", 0, false, false, "double"); + $okartu = $form->option_db("_", "popKartuID", 0, true, false, "para_rek_pos", ["KartuID","Kode_Kartu"], "Aktif=1", [0,"Pilihan Non Tunai"]); + $tnokartu = $form->textbox("_", "popNo_Kartu", "", true, false, "text"); + $tnamakartu = $form->textbox("_", "popNama_Kartu", "", true, false, "text"); + $ajson['html'] = ' +
Total Nota Rp.
'.$tjual.'
+
Tunai Rp.
'.$ttunai.'
+
'.$okartu.'
'.$tkartu.'
+
Kembali Rp.
'.$tsisa.'
+
+
Nomor Kartu
'.$tnokartu.'
+
Nama Pemilik
'.$tnamakartu.'
+
+
+
+
 
+
+
+
+ '; + $ajson['Total_Disp'] = rupiah($tot_jual); + $this->app->json($ajson); + } + + public function config_pole() { + $apole = []; + $_pole = $this->db->fetchRow("SELECT * FROM disp_config WHERE REG_ID=?", [$this->web_app['APP_CODE']]); + if ($_pole) { + foreach ($_pole->getData() as $_key => $_val) { + if (str_contains($_key, "POLE")) { + if (str_contains($_key, "ENABLE")) $_val = (int) $_val; + $apole[str_replace("POLE_","",$_key)] = $_val; + } + } + } + $this->app->json([ 'pole'=> $apole ]); + } + + public function index() { + $this->app->json(['html' => ' +
+
+
+
+
+
+ +
+
+ +
+
+
 
+
+
+
 
+
+
+
' + ]); + } + + private function Data_Jual(string $nomor=""): array { + $aparam = [ + 'No_Jual' => "POS".$this->web_app['SERVER_ID'].(string) $this->id_cab.$this->app->user()->id(3)."#00", + 'No_Cetak' => "", + 'Tgl_Jual' => tgl_ymd(), + 'MemberID' => $this->id_member, + 'Grup_MemberID' => $this->id_grup_member, + 'Nama_Member' => "", + 'Info_Member' => "", + 'Total_Nota' => 0, + 'Total_Item' => 0, + 'Total_Tunai' => 0, + 'Total_Kartu' => 0, + 'Total_Bayar' => 0, + 'KartuID' => 0, + 'No_Kartu' => "", + 'Nama_Kartu' => "", + 'Kembali' => "0" + ]; + if (empty($nomor)) { + $aparam['MemberID'] = $this->id_member_def; + } else { + $tabel_jual = (str_contains($nomor, "POS") === false) ? "inv_jual" : "inv_jual_pend"; + $row = $this->db->fetchRow("SELECT * FROM ".$tabel_jual." WHERE CabID=? AND No_Jual=?", [$this->id_cab, $nomor]); + if ($row) $aparam = array_merge($aparam, $row->getData()); + } + if ($aparam['MemberID'] > 0) { + $row = $this->db->fetchRow("SELECT Grup_MemberID,Nama_Member,TRIM(CONCAT(Kode_Member,'\n',Kota_Member)) Info_Member FROM para_member WHERE MemberID=?", [$aparam['MemberID']]); + if ($row) $aparam = array_merge($aparam, $row->getData()); + } + return $aparam; + } + + private function Pending_Nomor(): string { + $tno = "POS".$this->web_app['SERVER_ID'].(string) $this->id_cab.$this->app->user()->id(3)."#"; + $ino = (int) $this->db->fetchField("SELECT MAX(RIGHT(No_Jual,2)) FROM inv_jual_pend WHERE No_Jual LIKE ?", [$tno.'%']) ?? 0; + $tno .= isi_nol(++$ino, 2); + return $tno; + } +} diff --git a/app/Controller/Member/BaruController.php b/app/Controller/Member/BaruController.php new file mode 100644 index 0000000..be4df95 --- /dev/null +++ b/app/Controller/Member/BaruController.php @@ -0,0 +1,112 @@ +app = $app; + $this->db = $db; + $this->id_grup_member = $session->get('APP_INV')['ECERANID']; + $this->mode = Param::Get("mode", ""); + } + + public function form_master() { + $atabel = [ 'Kode_Member'=>"", 'Nama_Member'=>"", 'Alamat_Member'=>"", 'Kota_Member'=>"", 'Telp_Member'=>"", 'KTP_Member'=>"", 'Tgl_Lahir'=>"00-00-0000", 'Tgl_Daftar'=>tgl_ymd(), 'Grup_MemberID'=>$this->id_grup_member ]; + + $benable = ($this->mode === 'add') ? true : false; + $form = new Form($this->app); + $tkode = $form->textbox("_", "Kode_Member", $atabel['Kode_Member'], $benable, true, "text", "kode / id member"); + $tnama = $form->textbox("_", "Nama_Member", $atabel['Nama_Member'], $benable, true, "text", "nama member"); + $talamat = $form->textarea("_", "Alamat_Member", $atabel['Alamat_Member'], $benable, true, 2, "alamat member"); + $tkota = $form->textbox("_", "Kota_Member", $atabel['Kota_Member'], $benable, true, "text", "kota member"); + $ttelp = $form->textbox("_", "Telp_Member", $atabel['Telp_Member'], $benable, true, "text", "hp member"); + $tktp = $form->textbox("_", "KTP_Member", $atabel['KTP_Member'], $benable, true, "text", "ktp member"); + $ttgld = $form->datebox("_", "Tgl_Daftar", $atabel['Tgl_Daftar'], $benable, true); + $ttgll = $form->datebox("_", "Tgl_Lahir", $atabel['Tgl_Lahir'], $benable, true); + $tgrup = $form->option_db("_", "Grup_MemberID", $atabel['Grup_MemberID'], $benable, false, "para_member_grup", ["Grup_MemberID","Nama_Grup"], "Aktif=1 ORDER BY Nama_Grup"); + + $ajson['html'] = ' +
+ +
'.$tkode.Invesa::Form_Info("Kode / ID Barcode Member (Scan dari Kartu Member). Contoh : 17000017").'
+ +
'.$ttgld.'
+
+
+ +
'.$tktp.'
+ +
'.$ttgll.'
+
+
+ +
'.$tnama.'
+
+
+ +
'.$talamat.'
+
+
+ +
'.$tkota.'
+ +
'.$ttelp.'
+
+

+
+ +
'.$tgrup.'
+
+ '; + $this->app->json($ajson); + } + + public function proses_simpan() { + $sql = new SQL($this->app); + $sql->set_table("para_member"); + $sql->add_param("Grup_MemberID"); + $sql->add_param("Kode_Member"); + $sql->add_param("Nama_Member"); + $sql->add_param("Alamat_Member"); + $sql->add_param("Kota_Member"); + $sql->add_param("Telp_Member"); + $sql->add_param("KTP_Member"); + $sql->add_param_date("Tgl_Lahir"); + $sql->add_param_date("Tgl_Daftar"); + $sql->add_param_userid(); + $sql->InsertDB(); + $this->app->json([ 'status' => true ]); + } + + public function index() { + $this->app->json(['html' => '
']); + } +} diff --git a/app/Controller/Member/PointController.php b/app/Controller/Member/PointController.php new file mode 100644 index 0000000..c9a65ae --- /dev/null +++ b/app/Controller/Member/PointController.php @@ -0,0 +1,136 @@ +app = $app; + $this->db = $db; + $this->id_member = Param::Int("MemberID", 0); + } + + public function table_point() { + $obj = new Table($this->app); + $obj->set_table("(SELECT * FROM inv_point_tipe WHERE Aktif=1) P LEFT JOIN (SELECT Point_TipeID,SUM(IF(Nilai_Point>0,Nilai_Point,0)) Tambah_Point,SUM(IF(Nilai_Point<0,-Nilai_Point,0)) Kurang_Point,SUM(Nilai_Point) Sisa_Point FROM inv_point_tx WHERE MemberID=? GROUP BY Point_TipeID ORDER BY Point_TipeID) S ON (S.Point_TipeID=P.Point_TipeID)", "S.*,P.Nama_Tipe", "", [$this->id_member]); + $obj->add_field("Nama_Tipe", "Tipe Point", "l"); + $obj->add_field("Tambah_Point", "Pengumpulan", "r", "rupiah"); + $obj->add_field("Kurang_Point", "Penukaran", "r", "rupiah"); + $obj->add_field("Sisa_Point", "Sisa Point", "r", "rupiah"); + $obj->set_field_order("Point_TipeID", "A"); + $this->app->json([ $obj->json_table("divPOINT", 5) ]); + } + + public function brow_member() { + $tcari = Param::Get("Cari_Member"); + $tsql = ''; $asql = []; + if (!empty($tcari)) { + $tsql .= " AND CONCAT(Kode_Member,Nama_Member,Alamat_Member,Telp_Member) LIKE ?"; + array_push($asql, '%' . $tcari . '%'); + } + + $obj = new Table($this->app); + $obj->set_table("(SELECT * FROM para_member WHERE Aktif=1 AND IM=1".$tsql.") M LEFT JOIN para_member_grup G ON (M.Grup_MemberID=G.Grup_MemberID)", "M.*,G.Nama_Grup", "", $asql); + $obj->add_field("MemberID", "ID", "hid"); + $obj->add_field("Kode_Member", "Kode", "c"); + $obj->add_field("Nama_Member", "Nama Member", "awr"); + $obj->add_field("Alamat_Member", "Alamat", "awr"); + $obj->add_field("Telp_Member", "Telp.", "awr"); + $obj->add_field("Nama_Grup", "Grup", "hid"); + $obj->set_field_order("Kode_Member", "A"); + $obj->set_func_select("MemberPointJS.member_select"); + $this->app->json([ $obj->db_table("divBrowMember") ]); + } + + public function auto_member() { + $tcari = Param::Get("Auto_Query", ""); + $ajson['autodata'] = []; + $bcode = 0; $arec = []; + + if (is_numeric($tcari) && strlen($tcari) === 8) { + // Cari by Barcode + // Kode_Member : Grup_Member + $_row = $this->db->fetchRow("SELECT M.MemberID,M.Nama_Member,CONCAT(M.Kode_Member,':',G.Nama_Grup) Data2 FROM (SELECT * FROM para_member WHERE Aktif=1 AND IM=1 AND Kode_Member=?) M LEFT JOIN para_member_grup G ON (M.Grup_MemberID=G.Grup_MemberID)", [$tcari]); + if ($_row) { + $bcode = 1; + $arec = $_row->getData(); + } + } + if ($bcode === 1) { + $ajson['autodata'][] = ['value'=>$arec['MemberID'], 'text'=>$arec['Nama_Member'], 'data'=>$arec['Data2'], 'bc'=>1]; + } else { + $stat = $this->db->runQuery("SELECT M.MemberID,M.Kode_Member,M.Nama_Member,CONCAT(M.Kode_Member,':',G.Nama_Grup) Data2 FROM (SELECT * FROM para_member WHERE Aktif=1 AND IM=1 AND CONCAT(Kode_Member,Nama_Member,Alamat_Member,Telp_Member) LIKE ?) M LEFT JOIN para_member_grup G ON (M.Grup_MemberID=G.Grup_MemberID) ORDER BY M.Kode_Member LIMIT 50", ['%'.$tcari.'%']); + while ($row = $stat->fetch(SimplePdo::FETCH_ASSOC)) { + $ajson['autodata'][] = ['value'=>$row['MemberID'], 'text'=>$row['Nama_Member'], 'html'=>''.$row['Kode_Member'].' '.$row['Nama_Member'], 'data'=>$row['Data2'], 'bc'=>0]; + } + } + $this->app->json($ajson); + } + + public function scan_member() { + $tcari = Param::Get("Cari_Member", ""); + $scandata = []; + + // Cari by Barcode + // Kode_Member : Grup_Member + $_row = $this->db->fetchRow("SELECT M.MemberID,M.Kode_Member,M.Nama_Member Nama_Lengkap,G.Nama_Grup FROM (SELECT * FROM para_member WHERE Aktif=1 AND IM=1 AND Kode_Member=?) M LEFT JOIN para_member_grup G ON (M.Grup_MemberID=G.Grup_MemberID)", [$tcari]); + if ($_row) $scandata = array_merge($scandata, $_row->getData()); + $this->app->json([ $scandata ]); + } + + public function index() { + $form = new Form($this->app); + $tmem = $form->textauto("_", "Nama_Member", ['value'=>0, 'text'=>""], true, true, "Scan Barcode / Ketik Nama Member"); + $tkode = $form->textbox("_", "Kode_Member", "KODE_MEMBER", false); + $tnama = $form->textbox("_", "Nama_Lengkap", "NAMA_MEMBER", false); + $tgrup = $form->textbox("_", "Nama_Grup", "GRUP_MEMBER", false); + $ajson['html'] = ''; + if (isMobile()) { + $ajson['html'] .= ' +
+
+
Kode Member
'.$tkode.'
+ '; + } else { + $ajson['html'] .= ' +
Kunci Pencarian
'.$tmem.'
+
+
Kode Member
'.$tkode.'
+ '; + } + + $ajson['html'] .= ' +
Nama Member
'.$tnama.'
+
Grup Member
'.$tgrup.'
+ +
+
'; + $this->app->json($ajson); + } + +} diff --git a/app/Controller/Member/TukarController.php b/app/Controller/Member/TukarController.php new file mode 100644 index 0000000..08725ca --- /dev/null +++ b/app/Controller/Member/TukarController.php @@ -0,0 +1,281 @@ +app = $app; + $this->db = $db; + $this->web_app = (array) $session->get('WEB_APP'); + $this->id_cab = Param::Int("CabID", $session->get('APP_INV')['CABANGID']); + $this->mode = Param::Get("mode", ""); + $this->mode_detail = Param::Get("mode_detail", ""); + $this->no_tx = Param::Get("No_TX", ""); + $this->is_baru = str_contains($this->no_tx, "POIN") === true; + $this->id_tipe_point = Param::Int("Point_TipeID", 0); + $this->inv = new Inv($app); + } + + public function brow_tx() { + $tcari = Param::Get("Cari_TX"); + $tsql = ''; $asql = []; + if (!empty($tcari)) { + $tsql .= "CONCAT(J.No_TX,B.Nama_Member,DATE_FORMAT(J.Tgl_TX,'%d-%m-%Y')) LIKE ?"; + array_push($asql, '%' . $tcari . '%'); + } + + $obj = new Table($this->app); + $obj->set_table("(SELECT * FROM inv_point_tx WHERE InvPID>0) J LEFT JOIN para_member B ON (J.MemberID=B.MemberID)", "J.*,B.Nama_Member", $tsql, $asql); + $obj->add_field("No_TX", "No. Trans", "c"); + $obj->add_field("Tgl_TX", "Tgl. Trans", "c", "sqltgl", "", "val-tgl"); + $obj->add_field("Nama_Member", "Nama Member", "awr"); + $obj->set_field_order("No_TX", "D"); + $obj->set_func_select("MemberTukarJS.tx_select"); + $this->app->json([ $obj->db_table("divBrowTX") ]); + } + + public function brow_member() { + $tcari = Param::Get("Cari_Member"); + $tsql = ''; $asql = [1]; + if (!empty($tcari)) { + $tsql .= " AND CONCAT_WS(Kode_Member,Nama_Member,Alamat_Member,Telp_Member) LIKE ?"; + array_push($asql, '%' . $tcari . '%'); + } + array_push($asql, $this->id_tipe_point); + + $obj = new Table($this->app); + $obj->set_table("(SELECT * FROM para_member WHERE Aktif=?".$tsql.") M LEFT JOIN (SELECT MemberID,SUM(Nilai_Point) Sisa_Point FROM inv_point_tx WHERE Point_TipeID=? GROUP BY MemberID) P ON (M.MemberID=P.MemberID)", "M.*,IFNULL(P.Sisa_Point,0) Sisa_Point", "", $asql); + $obj->add_field("MemberID", "ID", "hid"); + $obj->add_field("Grup_MemberID", "Grup ID", "hid"); + $obj->add_field("Kode_Member", "Kode", "c"); + $obj->add_field("Nama_Member", "Nama Member", "awr"); + $obj->add_field("Alamat_Member", "Alamat", "awr"); + $obj->add_field("Telp_Member", "Telp.", "awr"); + $obj->add_field("Sisa_Point", "Point.", "hid"); + $obj->set_field_order("Nama_Member", "A"); + $obj->set_func_select("MemberTukarJS.member_select"); + $this->app->json([ $obj->db_table("divBrowMember") ]); + } + + public function brow_barang() { + $tcari = Param::Get("Cari_Barang"); + $tsql = ''; $asql = [1, $this->id_tipe_point]; + if (!empty($tcari)) { + $tsql .= " AND Nama_Barang LIKE ?"; + array_push($asql, '%' . $tcari . '%'); + } + + $obj = new Table($this->app); + $obj->set_table("inv_point_barang", "*", "Aktif=? AND Point_TipeID=?".$tsql, $asql); + $obj->add_field("InvPID", "ID", "hid"); + $obj->add_field("SatuanID", "ID", "hid"); + $obj->add_field("Nama_Barang", "Nama Barang", "awr"); + $obj->add_field("Nilai_Barang", "Nilai Barang", "hid"); + $obj->add_field("Nilai_Point", "Nilai Point", "r", "uang"); + $obj->set_field_order("Nama_Barang", "A"); + $obj->set_func_select("MemberTukarJS.barang_select"); + $this->app->json([ $obj->db_table("divBrowBarang") ]); + } + + public function auto_member() { + $tcari = Param::Get("Auto_Query", ""); + $ajson['autodata'] = []; + + $stat = $this->db->runQuery("SELECT M.MemberID,M.Kode_Member,M.Nama_Member,M.Kode_Nama,IFNULL(P.Sisa_Point,0) Sisa_Point FROM (SELECT *,CONCAT(IF(Kode_Member='','',CONCAT(Kode_Member,' - ')),Nama_Member) Kode_Nama FROM para_member WHERE Aktif=1 AND CONCAT(Kode_Member,Nama_Member,Alamat_Member,Telp_Member) LIKE ?) M LEFT JOIN (SELECT MemberID,SUM(Nilai_Point) Sisa_Point FROM inv_point_tx WHERE Point_TipeID=? GROUP BY MemberID) P ON (M.MemberID=P.MemberID) ORDER BY M.Nama_Member LIMIT 50", ['%'.$tcari.'%', $this->id_tipe_point]); + while ($row = $stat->fetch(SimplePdo::FETCH_ASSOC)) { + $ajson['autodata'][] = ['value'=>$row['MemberID'], 'text'=>$row['Kode_Nama'], 'html'=>''.$row['Kode_Member'].' '.$row['Nama_Member'], 'data'=>$row['Sisa_Point'], 'bc'=>0]; + } + $this->app->json($ajson); + } + + public function auto_barang() { + $tcari = Param::Get("Auto_Query", ""); + $ajson['autodata'] = []; + + $stat = $this->db->runQuery("SELECT P.InvPID,P.Nama_Barang,CONCAT(P.SatuanID,':',P.Nilai_Barang,':',P.Nilai_Point) Data2 FROM inv_point_barang P WHERE P.Aktif=1 AND P.Point_TipeID=? AND P.Nama_Barang LIKE ? ORDER BY P.Nama_Barang LIMIT 50", [$this->id_tipe_point, '%'.$tcari.'%']); + while ($row = $stat->fetch(SimplePdo::FETCH_ASSOC)) { + $ajson['autodata'][] = ['value'=>$row['InvPID'], 'text'=>$row['Nama_Barang'], 'data'=>$row['Data2'], 'bc'=>0]; + } + $this->app->json($ajson); + } + + public function form_master() { + $ajson = [ 'error'=>"", 'html'=>"" ]; + $atabel = []; + + if ($this->mode === "add") { + $atabel = $this->Data_Point("", true); + } else if ($this->mode === "edit") { + $atabel = $this->Data_Point($this->no_tx); + } else if ($this->mode === "save") { + if ($this->is_baru) { + $this->no_tx = $this->inv->Point_Baru("B", Param::Get("Tgl_TX")); + } + + $sql = new SQL($this->app); + $sql->set_table("inv_point_tx"); + $sql->add_param_date("Tgl_TX"); + $sql->add_param("CabID", $this->id_cab); + $sql->add_param("Point_TipeID"); + $sql->add_param("MemberID"); + $sql->add_param("InvPID"); + $sql->add_param("Point", Param::Float("Point")*-1); + $sql->add_param("Qty"); + $sql->add_param("Nilai_Point", "Qty*Point", true); + $sql->add_param("Nilai_Barang"); + $sql->add_param_stamp(); + $sql->add_param_userid(); + $sql->add_where("No_TX", $this->no_tx); + $sql->UpdateDB(); + + $atabel = $this->Data_Point($this->no_tx); + $this->mode = "view"; + + } else if ($this->mode === "cancel") { + $atabel = $this->Data_Point(); + } else { + $atabel = $this->Data_Point($this->no_tx); + } + + $enable = in_array($this->mode, ["add","edit"]) ? true : false; + $form = new Form($this->app); + $tnota = $form->textbox("_", "No_TX", $atabel['No_TX'], !$enable, true, "text", "nomor transaksi"); + $ttgl = $form->datebox("_", "Tgl_TX", $atabel['Tgl_TX'], $enable, true); + $ttipe = $form->option_db("_", "Point_TipeID", $atabel['Point_TipeID'], $enable, false, "inv_point_tipe", ["Point_TipeID","Nama_Tipe"], "Aktif=1 ORDER BY Point_TipeID", [0," "], null, "MemberTukarJS.oc_Tipe"); + $tmemb = $form->textauto("_", "Nama_Member", ['value'=>$atabel['MemberID'],'text'=>$atabel['Nama_Member']], $enable, true, "ketik nama member"); + $tbarg = $form->textauto("_", "Nama_Barang", ['value'=>$atabel['InvPID'],'text'=>$atabel['Nama_Barang']], $enable, true, "ketik nama barang"); + $tqty = $form->textbox("_", "Qty", $atabel['Qty'], $enable, true, "double"); + $tsisa = $form->textbox("_", "Sisa_Point", $atabel['Sisa_Point'], false, false, "double"); + $tnilai = $form->textbox("_", "Nilai_Point", $atabel['Nilai_Point'], false, false, "double"); + $tpoint = $form->textbox("_", "Point", $atabel['Point'], false, false, "double"); + $ajson['html'] = ' +
+ +
'.$tnota.'
+
+
+ +
'.$ttgl.'
+
Tipe Point
'.$ttipe.'
+
+

+
+ +
'.$tmemb.'
+
+
+ +
'.$tsisa.'
+
+

+
+ +
'.$tbarg.'
+
+
+ +
'.$tqty.'
@
'.$tpoint.'
+
+
+ +
'.$tnilai.'
+
+ + + + '; + $this->app->json($ajson); + } + + public function proses_delete() { + $this->db->runQuery("DELETE FROM inv_point_tx WHERE No_TX=?", [$this->no_tx]); + $this->app->json([ 'status' => true ]); + } + + public function index() { + $this->app->json(['html' => ' +
 
+

+
+
+ + + + +
+
+ + +
+
' + ]); + } + + private function Data_Point(string $nomor="", bool $baru=false): array { + $aparam = [ + 'No_TX' => $nomor, + 'Tgl_TX' => tgl_ymd(), + 'Point_TipeID' => 0, + 'MemberID' => 0, + 'Nama_Member' => "", + 'InvPID' => 0, + 'Nama_Barang' => "", + 'Qty' => 0, + 'Sisa_Point' => 0, + 'Nilai_Point' => 0, + 'Point' => 0, + 'Nilai_Barang' => 0, + ]; + if ($baru) $aparam['No_TX'] = "POIN".$this->web_app['SERVER_ID'].(string) $this->id_cab.$this->app->user()->id(3)."#00"; + if (!empty($nomor)) { + $row = $this->db->fetchRow("SELECT * FROM inv_point_tx WHERE InvPID>0 AND No_TX=?", [$nomor]); + if ($row) $aparam = array_merge($aparam, $row->getData()); + if ($aparam['MemberID'] > 0) { + $aparam['Nama_Member'] = $this->db->fetchField("SELECT Nama_Member FROM para_member WHERE MemberID=?", [$aparam['MemberID']]) ?? ''; + $aparam['Sisa_Point'] = (float) $this->db->fetchField("SELECT SUM(Nilai_Point) Sisa_Point FROM inv_point_tx WHERE Point_TipeID=? AND MemberID=?", [$aparam['Point_TipeID'], $aparam['MemberID']]) ?? 0; + $aparam['Sisa_Point'] -= $aparam['Nilai_Point']; + } + if ($aparam['InvPID'] > 0) { + $aparam['Nama_Barang'] = $this->db->fetchField("SELECT Nama_Barang FROM inv_point_barang WHERE InvPID=?", [$aparam['InvPID']]) ?? ''; + } + + } + return $aparam; + } + +} diff --git a/app/Controller/MonitorController.php b/app/Controller/MonitorController.php new file mode 100644 index 0000000..bebbe1c --- /dev/null +++ b/app/Controller/MonitorController.php @@ -0,0 +1,184 @@ +app = $app; + $this->db = $db; + $this->web_app = $session->get('WEB_APP'); + $this->id_cab = (int) $session->get('APP_INV')['CABANGID']; + } + + public function info_iklan() { + $info_iklan = ''; + $this->app->json([ 'html' => $info_iklan ]); + } + + public function info_promo() { + $info_promo = '"; + $this->app->json([ 'html' => $info_promo ]); + } + + public function count_delay() { //todo: ganti ke socket-io + $apos = $this->get_pos(); + $ajson = []; + $ajson['total'] = $this->db->fetchField("SELECT SUM(-Qty*(Harga_Jual-Disk_Rupiah)) Total FROM tmp_inv_detail WHERE No_Ref=? AND Unix=?", [$apos['No_Pos'], $apos['Unix']]) ?? 0; + $ajson['thank'] = $this->db->fetchField("SELECT IF(No_Cetak='',0,1) Ada FROM disp_login WHERE UserID=? AND Unix=?", [$apos['UserID'], $apos['Unix']]) ?? 0; + $this->app->json($ajson); + } + + public function shop() { + $this->app->json(['html' => ' +
+
+
+
+
+
+
+
0
+
+
+
+
' + ]); + } + + public function info_shop() { + $apos = $this->get_pos(); + $ashop = ['Total'=>0, 'Item'=>0, 'Qty'=>0]; + $row = $this->db->fetchRow("SELECT SUM(-Qty*(Harga_Jual-Disk_Rupiah)) Total,COUNT(*) Item, SUM(-Qty) Qty FROM tmp_inv_detail WHERE No_Ref=? AND Unix=?", [$apos['No_Pos'], $apos['Unix']]); + if ($row) $ashop = $row->getData(); + + $info_barang = ''; + if ($ashop['Item'] > 0) { + $row = $this->db->fetchRow("SELECT * FROM (SELECT -D.Qty Qty2,D.Harga_Jual,P.Nama_Lengkap FROM tmp_inv_detail D LEFT JOIN vi_inv_produk P ON (D.InvID=P.InvID AND D.SatuanID=P.SatuanID) WHERE D.No_Ref=? AND D.Unix=? AND D.Promo<2 ORDER BY D.ID DESC LIMIT 1) A", [$apos['No_Pos'], $apos['Unix']]); + if ($row) { + $info_barang = '
'.substr($row['Nama_Lengkap'], 0, 26).'
Qty : '.rupiah($row['Qty2']).' / Rp. '.rupiah($row['Harga_Jual']).'
'; + } + } + + $ajson['Info_Barang'] = $info_barang; + $ajson['Total_Harga'] = rupiah($ashop['Total']); + $ajson['Info_Qty'] = rupiah($ashop['Item'])." Items
".rupiah($ashop['Qty'])." Qty"; + $this->app->json($ajson); + } + + public function thank() { + $apos = $this->get_pos(); + $anota = $this->db->fetchRow("SELECT J.*,(J.Total_Bayar-J.Total_Jual+J.Total_Diskon+J.Total_Potong) Total_Sisa,UCASE(LEFT(B.Nama_Kartu,23)) Kode_Kartu2,UCASE(J.Nama_Kartu) Nama_Kartu2,RIGHT(J.No_Kartu,4) No_Kartu2 FROM inv_jual J LEFT JOIN para_rek_pos B ON (J.KartuID=B.KartuID) WHERE J.No_Jual=?", [$apos['No_Cetak']]); + $html = ' +
+
+ '.$this->web_app['REG_NAME'].' +
+
+ '; + if ($anota) { + $nhemat = $anota['Total_Diskon'] + $anota['Total_Potong']; + + $html .= 'Jumlah Belanja Anda Rp. '.rupiah($anota['Total_Jual']-$anota['Total_Diskon']).'
'; + if ($anota['Total_Diskon'] > 0) $html .= 'Anda Mendapatkan Diskon Rp. '.rupiah($anota['Total_Diskon']).'
'; + if ($anota['Total_Potong'] > 0) $html .= 'Anda Mendapatkan Potongan Promo Rp. '.rupiah($anota['Total_Potong']).'
'; + + $html .= 'Jumlah Pembayaran Anda Rp. '.rupiah($anota['Total_Bayar']).'

'; + + if ($anota['KartuID'] === 0) { + $html .= 'Sisa Pembayaran Rp. '.rupiah($anota['Total_Sisa']).'
'; + } else { + $html .= 'Anda Melakukan Pembayaran Dengan :
'.$anota['Kode_Kartu2']." - ".$anota['No_Kartu2'].'

'; + } + + if ($nhemat > 0) $html .= 'Anda Mendapatkan Penghematan Sebesar Rp. '.rupiah($nhemat).'
'; + } + $html .= '
Terima Kasih Telah Berbelanja di Toko Kami
Selamat Berbelanja Kembali :)
'; + $this->app->json([ 'html' => $html ]); + } + + public function close_thank() { + $apos = $this->get_pos(); + $this->db->runQuery("UPDATE disp_login SET No_Cetak='' WHERE UserID=? AND Unix=?", [$apos['UserID'], $apos['Unix']]); + } + + public function config() { + $ajson = ['BANNER_TEXT' => "", 'PROMO_IDLE' => 0, 'PROMO_DURASI' => 1000]; + $ainfo = $this->db->fetchRow("SELECT * FROM disp_config WHERE REG_ID=?", [$this->web_app['REG_ID']]); + if ($ainfo) { + $ajson['BANNER_TEXT'] = '
'.$ainfo['Text_Run'].'
'; + $ajson['PROMO_IDLE'] = $ainfo['Promo_Idle']; + $ajson['PROMO_DURASI'] = (int) $ainfo['Promo_Durasi'] * 1000; + $ajson['ID_CABANG'] = $this->id_cab; + } + $this->app->json($ajson); + } + + public function index() { + $this->app->json(['html' => ' +
+
+
 
+
+ +
+
 
+ +
 
+
+ +
+ +
' + ]); + } + + private function get_pos(): array { + $pos = ['No_Pos' => "", 'UserID' => 0, 'Unix' => ""]; + $row = $this->db->fetchRow("SELECT * FROM disp_login WHERE IP=? AND CabID=? ORDER BY Date DESC", [$this->app->request()->ip, $this->id_cab]); + if ($row) $pos = $row->getData(); + return $pos; + } + +} diff --git a/app/Controller/Ppob/PpobtxController.php b/app/Controller/Ppob/PpobtxController.php new file mode 100644 index 0000000..df888a8 --- /dev/null +++ b/app/Controller/Ppob/PpobtxController.php @@ -0,0 +1,208 @@ +app = $app; + $this->db = $db; + $this->id_cab = Param::Int("CabID", (int) $session->get('APP_INV')['CABANGID']); + $this->id_agen = (int) $session->get('APP_PPOB')['API_AGENID']; + $this->mode_detail = Param::Get("mode_detail", ""); + $this->tgl_from = Param::Get("Tgl_From", tgl_dmy()); + $this->tgl_to = Param::Get("Tgl_To", tgl_dmy()); + $this->no_tx = Param::Get("No_TX", ""); + $this->ppob = new PPOBClient($app); + } + + public function table_tx() { + $ajson = []; + if (in_array($this->mode_detail, ["reproc","delete"])) { + $adetail = $this->db->fetchRow("SELECT * FROM ppob_tx WHERE No_TX=?", [$this->no_tx]) ?? []; + if ($this->mode_detail === "delete") { + if (count($adetail) > 0 && (int) $adetail['Status'] === 0) { + $this->db->runQuery("DELETE FROM ppob_tx WHERE No_TX=? AND Status=0 LIMIT 1", [$this->no_tx]); + $ajson[] = ['type'=>"msg", 'mode'=>"info", 'wait'=>2000, 'value'=>"Proses Hapus sukses !"]; + } else { + $ajson[] = ['type'=>"msg", 'mode'=>"error", 'wait'=>2000, 'value'=>"Ada masalah dalam Proses Hapus !"]; + } + } else if ($this->mode_detail === "reproc") { + if (count($adetail) > 0 && (int) $adetail['Proses'] === 0) { + // PROSES API TRIFONIA PULSA + $appob = $this->ppob->TopUp($adetail['Kode'], $adetail['Tujuan'], $adetail['No_TX'], $adetail['No_HP']); + if (count($appob) > 0) { + $ajson[] = ['type'=>"msg", 'mode'=>"info", 'wait'=>2000, 'value'=>$appob['Message']]; + } + } else { + $ajson[] = ['type'=>"msg", 'mode'=>"error", 'wait'=>2000, 'value'=>"Ada masalah dalam Proses !"]; + } + } + } + + $saldo_ppob = (float) $this->db->fetchField("SELECT API_SALDO FROM ppob_config WHERE API_AGENID=?", [$this->id_agen]) ?? 0; + + $cari = Param::Get("Cari_TX", ""); + $tsql = 'CabID=?'; $asql = [$this->id_cab]; + if (empty($cari)) { + $tgl_from = tgl_sql2str($this->tgl_from); + $tgl_to = tgl_sql2str($this->tgl_to); + $tsql .= " AND (Tgl_TX BETWEEN ? AND ?)"; + array_push($asql, $tgl_from, $tgl_to); + } else { + $tsql .= " AND CONCAT(No_TX,DATE_FORMAT(Tgl_TX,'%d-%m-%Y'),Tujuan,No_HP) LIKE ?"; + $asql[] = '%' . $cari . '%'; + } + + $obj = new Table($this->app); + $obj->set_table("(SELECT *,CONCAT(DATE_FORMAT(DateStamp,'%d-%m-%Y %H:%i:%s'),' - ',Kode,'
',Tujuan,'',IF(No_HP='','',CONCAT('
HP : ',No_HP,''))) Info_TX FROM ppob_tx WHERE ".$tsql.") T LEFT JOIN (SELECT ProdukID, KateID FROM ppob_produk) P ON (P.ProdukID=T.ProdukID)", "T.*,IFNULL(P.KateID,0) KateID", "", $asql); + $obj->set_footer("SUM(Harga_Jual) Harga_Jual"); + $obj->add_field("No_TX", "No. TX", "c"); + $obj->add_field("KateID", "Kate", "c", "App\Utils\PPOBClient::Icon_Kate"); + $obj->add_field("Info_TX", "Informasi Transaksi", "l"); + $obj->add_field("Harga_Jual", "Harga", "r", "rupiah", "rupiah"); + $obj->add_field("Proses", "P", "c", "checkbox"); + $obj->add_field("Status", "Status", "c", "App\Utils\PPOBClient::Badge_Status"); + $obj->set_field_order("No_TX", "D"); + $obj->add_row_btn("printer", "Cetak Nota", "PPOBTXJS.nota_print", "Proses", 1); + $obj->add_row_btn("arrow-left-right", "Proses Ulang", "PPOBTXJS.nota_reproc", "Proses", 0); + $obj->add_row_btn("clipboard", "Detail", "PPOBTXJS.nota_detail", "Proses", 1); + if ($this->app->user()->is_level(1)) $obj->add_row_btn("trash", "Hapus", "PPOBTXJS.nota_delete", "Status", 0); + $obj->set_func_btn("PPOBTXJS.saldo_ppob", 'Saldo Rp. '.rupiah($saldo_ppob)); + $ajson[] = $obj->db_table("divDetailTabel"); + $this->app->json($ajson); + } + + public function form_tx() { + $ainfo = $this->db->fetchRow("SELECT T.*,DATE_FORMAT(T.DateStamp,'%d-%m-%Y %H:%i:%s') Tgl_TX1,IFNULL(P.KateID,0) KateID,P.Nama_Produk FROM (SELECT * FROM ppob_tx WHERE No_TX=? LIMIT 1) T LEFT JOIN ppob_produk P ON (P.ProdukID=T.ProdukID)", [$this->no_tx]) ?? []; + $atoken = $this->ppob->SN_PLN($ainfo['SN']); + + $ajson['html'] = ' +
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
'; + if ((int) $ainfo['Status'] === 4) { + $ajson['html'] .= '

'; + if ((int) $ainfo['KateID'] === 5) { + $ajson['html'] .= ' +
+ + +
+
+ + +
+
+ + +
+
+ + +
'; + } else { + $ajson['html'] .= ' +
+ + +
'; + } + } + $this->app->json($ajson); + } + + public function form_saldo() { + $asaldo = $this->ppob->Balance(); + $ajson['Saldo'] = (count($asaldo) > 0 && (int) $asaldo['Status'] === 4) ? rupiah($asaldo['Saldo']) : 0; + $this->app->json($ajson); + } + + public function index() { + $hari_ini = tgl_dmy(); + $this->app->json(['html' => ' +
+
+ +
+
+
 
+
+
+
+
' + ]); + } + +} diff --git a/app/Controller/Ppob/PrabayarController.php b/app/Controller/Ppob/PrabayarController.php new file mode 100644 index 0000000..1e4cf51 --- /dev/null +++ b/app/Controller/Ppob/PrabayarController.php @@ -0,0 +1,381 @@ +app = $app; + $this->db = $db; + $this->web_app = (array) $session->get('WEB_APP'); + $this->id_cab = Param::Int("CabID", (int) $session->get('APP_INV')['CABANGID']); + $this->mode = Param::Get("mode", ""); + $this->mode_detail = Param::Get("mode_detail", ""); + $this->no_tx = Param::Get("No_TX", ""); + $this->id_kate = Param::Int("KateID", 0); + $this->id_ope = Param::Int("OpeID", 0); + $this->id_produk = Param::Int("ProdukID", 0); + $this->tujuan = Param::Get("Tujuan", ""); + $this->no_hp = Param::Get("No_HP", ""); + $this->ppob = new PPOBClient($app); + } + + public function table_tx() { + if (in_array($this->mode_detail, ["reproc","delete"])) { + $adetail = $this->db->fetchRow("SELECT * FROM ppob_tx WHERE No_TX=?", [$this->no_tx]); + $proses = (int) $adetail['Proses'] ?? 0; + + if ($this->mode_detail === "delete") { + if ($proses === 0) { + $this->db->delete("ppob_tx", "No_TX=?", [$this->no_tx]); + $ajson[] = ['type'=>"msg", 'mode'=>"info", 'wait'=>2000, 'value'=>"Transaksi sukses dihapus !"]; + } else { + $ajson[] = ['type'=>"msg", 'mode'=>"error", 'wait'=>2000, 'value'=>"Ada masalah dalam proses transaksi !"]; + } + } else if ($this->mode_detail === "reproc") { + if ($proses === 0) { + // PROSES API TRIFONIA PULSA + $appob = $this->ppob->TopUp($adetail['Kode'], $adetail['Tujuan'], $adetail['No_TX'], $adetail['No_HP']); + if (count($appob) > 0) { + $ajson[] = ['type'=>"msg", 'mode'=>"info", 'wait'=>2000, 'value'=>$appob['Message']]; + } + } else { + $ajson[] = ['type'=>"msg", 'mode'=>"error", 'wait'=>2000, 'value'=>"Ada masalah dalam Proses !"]; + } + } + } + + $tcari = Param::Get("Cari_PPOB", ""); + $tsql = 'CabID=?'; $asql = [$this->id_cab]; + if (empty($tcari)) { + $tsql .= " AND UserID=? AND Tgl_TX=?"; + array_push($asql, $this->app->user()->id(), tgl_ymd()); + } else { + $tsql .= " AND CONCAT(No_TX,Tujuan,No_HP,DATE_FORMAT(Tgl_TX,'%d-%m-%Y')) LIKE ?"; + $asql[] = '%' . $tcari . '%'; + } + + $obj = new Table($this->app); + $obj->set_table("(SELECT *,CONCAT(DATE_FORMAT(DateStamp,'%d-%m-%Y %H:%i:%s'),' - ',Kode,'
',Tujuan,'',IF(No_HP='','',CONCAT('
HP : ',No_HP,''))) Info_TX FROM ppob_tx WHERE ".$tsql.") T LEFT JOIN (SELECT ProdukID,KateID FROM ppob_produk) P ON (P.ProdukID=T.ProdukID)", "T.*,IFNULL(P.KateID,0) KateID", "", $asql); + $obj->set_footer("SUM(Harga_Jual) Harga_Jual"); + $obj->add_field("No_TX", "No. TX", "c"); + $obj->add_field("KateID", "Kate", "c", "App\Utils\PPOBClient::Icon_Kate"); + $obj->add_field("Info_TX", "Informasi Transaksi", "l"); + $obj->add_field("Harga_Jual", "Harga", "r", "rupiah", "rupiah"); + $obj->add_field("Proses", "P", "c", "checkbox"); + $obj->add_field("Status", "Status", "c", "App\Utils\PPOBClient::Badge_Status"); + $obj->set_field_order("No_TX", "D"); + $obj->add_row_btn("printer", "Cetak Nota", "PrabayarJS.nota_print", "Status", 4); + $obj->add_row_btn("arrow-left-right", "Proses Ulang", "PrabayarJS.nota_reproc", "Proses", 0); + $obj->add_row_btn("clipboard", "Detail", "PrabayarJS.nota_detail", "Proses", 1); + if ($this->app->user()->is_level(1)) $obj->add_row_btn("trash", "Hapus", "PrabayarJS.nota_delete", "Status", 0); + $this->app->json([ $obj->json_table("divPOS1", 5) ]); + } + + public function form_master() { + $tkembali = "0"; + if ($this->mode === "save") { + $this->no_tx = $this->ppob->Nomor_Baru("P", tgl_dmy()); + $no_seq = $this->db->fetchField("SELECT COALESCE(MAX(Counter),0)+1 Seq_TX FROM ppob_tx WHERE Tgl_TX=? AND ProdukID=? AND Tujuan=?", [tgl_ymd(), $this->id_produk, $this->tujuan]) ?? 1; + + $id_kartu = Param::Int("KartuID", 0); + $no_kartu = ""; $nama_kartu = ""; + if ($id_kartu > 0) { + $no_kartu = Param::Get("No_Kartu", ""); + $nama_kartu = Param::Get("Nama_Kartu", ""); + } + + $apul = $this->db->fetchRow("SELECT * FROM ppob_produk WHERE ProdukID=?", [$this->id_produk]); + + $sql = new SQL($this->app); + $sql->set_table("ppob_tx"); + $sql->add_param("No_TX", $this->no_tx); + $sql->add_param_date("Tgl_TX", tgl_dmy()); + $sql->add_param("CabID", $this->id_cab); + $sql->add_param("ProdukID"); + $sql->add_param("Kode", $apul['Kode']); + $sql->add_param("Tujuan"); + $sql->add_param("No_HP"); + $sql->add_param("Counter", $no_seq); + $sql->add_param("Harga_Beli", $apul['Harga_Pokok']); + $sql->add_param("Harga_Jual", $apul['Harga_Jual']); + $sql->add_param("Total_Bayar"); + $sql->add_param("KartuID", $id_kartu); + $sql->add_param("No_Kartu", $no_kartu); + $sql->add_param("Nama_Kartu", $nama_kartu); + $sql->add_param_userid(); + $sql->InsertDB(); + $this->mode = "reproc"; + $tkembali = ''.rupiah($apul['Harga_Jual']-Param::Get("Total_Bayar",0)).''; + + //jika token pln + if (($apul['KateID'] ?? 0) === 5) { + $this->db->runQuery("INSERT IGNORE INTO ppob_pend (No_TX,CabID,UserID) VALUES (?, ?, ?)", [$this->no_tx, $this->id_cab, $this->app->user()->id()]); + } + } + + $form = new Form($this->app); + $tkate = $form->option_que("_", "KateID", $this->id_kate, true, false, "SELECT * FROM ppob_kategori WHERE KateID IN (SELECT KateID FROM ppob_produk WHERE Status=1 AND Harga_Jual>0)", ["KateID","N_Kate"], null, null, "PrabayarJS.oc_KateID"); + $tope = $form->option("_", "OpeID", 0, true, false, [0=>""], null, "PrabayarJS.oc_OpeID"); + $tproduk = $form->option("_", "ProdukID", 0, true, false, [0=>""], null, "PrabayarJS.oc_ProdukID"); + $ttujuan = $form->textbox("_", "Tujuan", "", true, true, "phone", "Ketik Nomor Tujuan"); + $tno_hp = $form->textbox("_", "No_HP", "", true, true, "phone", "no hp untuk pengiriman kode token"); + $ajson['html'] = ' +
+
+
+
+
+
'.$tkembali.'
+
+
+
+ +
'.$tkate.'
+
+
+ +
'.$ttujuan.'
+
+
+ +
'.$tno_hp.'
+
+
+ +
'.$tope.'
+
+
+ +
'.$tproduk.'
+
+
+
+
+
+ +
+
+ +
+
+ + + + + + + + + '; + $this->app->json($ajson); + } + + public function form_tx() { + $ainfo = $this->db->fetchRow("SELECT T.*,DATE_FORMAT(T.DateStamp,'%d-%m-%Y %H:%i:%s') Tgl_TX1,IFNULL(P.KateID,0) KateID,P.Nama_Produk FROM (SELECT * FROM ppob_tx WHERE No_TX=? LIMIT 1) T LEFT JOIN ppob_produk P ON (P.ProdukID=T.ProdukID)", [$this->no_tx]) ?? ['No_TX'=>$this->no_tx, 'Tgl_TX1'=>tgl_dmy(true), 'Tujuan'=>"", 'No_HP'=>"", 'Nama_Produk'=>"", 'Harga_Jual'=>0, 'Status'=>0, 'KateID'=>0]; + $atoken = $this->ppob->SN_PLN($ainfo['SN']); + + $ajson['html'] = ' +
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
'; + if ((int) $ainfo['KateID'] === 5 && (int) $ainfo['Status'] === 4) { + $ajson['html'] .= ' +

+
+ + +
+
+ + +
+
+ + +
+
+ + +
'; + } + $this->app->json($ajson); + } + + public function form_kasir() { + $tot_jual = Param::Float("Harga_Jual", 0); + $form = new Form($this->app); + $tjual = $form->textbox("_", "popTotal_Jual", uang($tot_jual), false, false, "double"); + $ttunai = $form->textbox("_", "popTotal_Tunai", 0, true, false, "double"); + $tkartu = $form->textbox("_", "popTotal_Kartu", 0, true, false, "double"); + $tsisa = $form->textbox("_", "popTotal_Sisa", 0, false, false, "double"); + $okartu = $form->option_db("_", "popKartuID", 0, true, false, "para_rek_pos", ["KartuID","Kode_Kartu"], "Aktif=1", [0,"Pilihan Non Tunai"]); + $tnokartu = $form->textbox("_", "popNo_Kartu", "", true, false, "text"); + $tnamakartu = $form->textbox("_", "popNama_Kartu", "", true, false, "text"); + $ajson['html'] = ' +
Total PPOB Rp.
'.$tjual.'
+
Tunai Rp.
'.$ttunai.'
+
'.$okartu.'
'.$tkartu.'
+
Kembali Rp.
'.$tsisa.'
+
+
Nomor Kartu
'.$tnokartu.'
+
Nama Pemilik
'.$tnamakartu.'
+
+
+
 
+
+
+
+ '; + $ajson['Total_Disp'] = rupiah($tot_jual); + $this->app->json($ajson); + } + + public function option_operator() { + $aoption = ['type' => "option", 'id' => "OpeID", 'value' => 0, 'avalue' => []]; + if ($this->id_kate === 5) {//token + $aoption['avalue'][] = ['value'=>10, 'html'=>"PLN Prabayar"]; + } else if ($this->id_kate === 6) {//emoney & ojek + //todo: di update database, sesuaikan dg pola baru ! + $aoption['avalue'][] = ['value'=>11, 'html'=>"OVO"]; + $aoption['avalue'][] = ['value'=>12, 'html'=>"GoPay"]; + $aoption['avalue'][] = ['value'=>13, 'html'=>"Gojek Driver"]; + $aoption['avalue'][] = ['value'=>14, 'html'=>"Grab"]; + $aoption['avalue'][] = ['value'=>15, 'html'=>"Dana"]; + } else if ($this->id_kate === 8) {//voucher + $aoption['avalue'][] = ['value'=>0, 'html'=>""]; + } else {//pulsa, data, sms, transfer + $tsql = (strlen($this->tujuan) >= 4) ? " AND Prefix_Ope LIKE '%".substr($this->tujuan,0,4)."%'" : ""; + $aope = $this->db->fetchAll("SELECT * FROM ppob_operator WHERE OpeID IN (SELECT OpeID FROM ppob_produk WHERE Status=1 AND Harga_Jual>0 AND KateID<5)".$tsql); + if (count($aope) > 1) $aoption['avalue'][] = ['value'=>0, 'html'=>""]; + foreach ($aope as $ope) { + if (count($aope) === 1) $aoption['value'] = $ope['OpeID']; + $aoption['avalue'][] = ['value'=>$ope['OpeID'], 'html'=>$ope['N_Ope']]; + } + } + $this->app->json([ $aoption ]); + } + + public function option_produk() { + $aoption = ['type' => "option", 'id' => "ProdukID", 'value' => 0, 'avalue' => [['value'=>0, 'label'=>0, 'html'=>""]]]; + $aproduk = $this->db->fetchAll("SELECT * FROM ppob_produk WHERE Status=1 AND KateID=? AND OpeID=? AND Harga_Jual>0 ORDER BY Harga_Jual", [$this->id_kate, $this->id_ope]); + foreach ($aproduk as $produk) { + $aoption['avalue'][] = ['value'=>$produk['ProdukID'], 'label'=>$produk['Harga_Jual'], 'html'=>$produk['Nama_Produk'].' - Rp. '.rupiah($produk['Harga_Jual'])]; + } + $this->app->json([ $aoption ]); + } + + public function config_pole() { + $ajson['pole'] = []; + $apole = $this->db->fetchRow("SELECT * FROM disp_config WHERE REG_ID=?", [$this->web_app['APP_CODE']]); + foreach ($apole as $_key => $_val) { + if (str_contains($_key, "POLE")) { + if (str_contains($_key, "ENABLE")) $_val = (int) $_val; + $ajson['pole'][str_replace("POLE_","",$_key)] = $_val; + } + } + $this->app->json($ajson); + } + + public function index() { + $this->app->json(['html' => ' +
+
+ +
+
+
+
+
+
+
+
+ + + +
+
+
+
 
+
+
+
+
+
 
+
+
+
+
+
+
+
' + ]); + } + +} diff --git a/app/Controller/Ppob/TopupController.php b/app/Controller/Ppob/TopupController.php new file mode 100644 index 0000000..9904c08 --- /dev/null +++ b/app/Controller/Ppob/TopupController.php @@ -0,0 +1,125 @@ +app = $app; + $this->db = $db; + $this->mode_detail = Param::Get("mode_detail", ""); + $this->ppob = new PPOBClient($app); + } + + public function table_detail() { + $ajson = []; + if ($this->mode_detail === "insert") { + // PROSES API TRIFONIA PULSA + $appob = $this->ppob->Depo(Param::Get("Bank", ""), Param::Float("Jumlah", 0)); + if (count($appob)>0 && (int) $appob['Status'] === 4) { + $ajson[] = ['type'=>"msg", 'mode'=>"info", 'wait'=>2000, 'value'=>$appob['Message']]; + } else { + $ajson[] = ['type'=>"msg", 'mode'=>"error", 'wait'=>2000, 'value'=>$appob['Message']]; + } + } + + $cari = Param::Get("Cari_Topup", ""); + $tsql = ''; $asql = []; + if (!empty($cari)) { + $tsql = "CONCAT(No_Depo,DATE_FORMAT(Tgl_Depo,'%d-%m-%Y')) LIKE ?"; + $asql[] = '%' . $cari . '%'; + } + + $obj = new Table($this->app); + $obj->set_table("ppob_depo", "*,IF(Proses=1,2,IF(DATEDIFF(Tgl_Exp,NOW())<0,1,0)) IX", $tsql, $asql); + $obj->add_field("No_Depo", "Nomor", "c"); + $obj->add_field("Tgl_Depo", "Tanggal", "c", "sqltgl", "", "val-tgl"); + $obj->add_field("Tgl_Exp", "Expire", "c", "sqltgl", "", "val-tgl"); + $obj->add_field("Jumlah", "Jumlah", "r", "rupiah"); + $obj->add_field("Bank", "Bank", "l"); + $obj->add_field("Proses", "P", "c", "checkbox"); + $obj->add_field("Catatan", "Catatan", "hid", "App\Utils\PPOBClient::makeWAText"); + $obj->set_field_order("No_Depo", "D"); + $obj->set_row_color("IX", "1", "rdanger"); + $obj->set_row_color("IX", "2", "rsuccess"); + $obj->add_row_btn("clipboard", "Informasi", "TopupJS.tx_info"); + $ajson[] = $obj->db_table("divDetailTabel"); + $this->app->json($ajson); + } + + public function form_topup() { + $atabel = [ 'Tgl_Depo'=>tgl_ymd(), 'Bank'=>"BCA", 'Jumlah'=>0 ]; + + $form = new Form($this->app); + $ttgl = $form->datebox("_", "Tgl_Depo", $atabel['Tgl_Depo'], true, false); + $tbank = $form->radio("_", "Bank", $atabel['Bank'], true, false, ['BCA'=>"BCA",'BNI'=>"BNI",'Mandiri'=>"Mandiri",'BRI'=>"BRI"]); + $tjumlah = $form->textbox("_", "Jumlah", $atabel['Jumlah'], true, true, "double"); + + $ajson['html'] = ' +
+ +
'.$ttgl.'
+
+
+ +
'.$tbank.'
+
+
+ +
'.$tjumlah.'
+
'; + $this->app->json($ajson); + } + + public function index() { + $this->app->json(['html' => ' +
+
+ +
+
+
 
+
+
+
+
' + ]); + } + +} diff --git a/app/Controller/Promo/BarangController.php b/app/Controller/Promo/BarangController.php new file mode 100644 index 0000000..ad0a1d6 --- /dev/null +++ b/app/Controller/Promo/BarangController.php @@ -0,0 +1,222 @@ +app = $app; + $this->db = $db; + $this->mode_detail = Param::Get("mode_detail", ""); + $this->id_promo = (int) Param::Get("PromoID", 0); + $this->id_inv = (int) Param::Get("InvID", 0); + } + + public function table_promo() { + if (in_array($this->mode_detail, ["insert","update","delete"])) { + $sql = new SQL($this->app); + $sql->set_table("inv_promo"); + $sql->add_param("Nama_Promo"); + $sql->add_param("InvID"); + $sql->add_param("SatuanID"); + $sql->add_param("CabID"); + $sql->add_param("Grup_MemberID"); + $sql->add_param("Pilih_Qty"); + $sql->add_param("Qty_Min"); + $sql->add_param("Qty_Kali"); + $sql->add_param("Tipe_Promo"); + $sql->add_param("Promo_Disc"); + $sql->add_param("Promo_InvID"); + $sql->add_param("Promo_SatuanID"); + $sql->add_param("Promo_Qty"); + $sql->add_param("Jumlah_Promo"); + $sql->add_param_date("Tgl_Mulai"); + $sql->add_param_date("Tgl_Akhir"); + $sql->add_param("Aktif"); + $sql->add_param_userid(); + $sql->add_where("PromoID"); + + if ($this->mode_detail === "insert") { + $sql->InsertDB(); + } else if ($this->mode_detail === "update") { + $sql->UpdateDB(); + } else if ($this->mode_detail === "delete") { + $sql->DeleteDB(); + } + } + + $tcari = Param::Get("Cari_Promo"); + $tsql = ''; $asql = []; + if (!empty($tcari)) { + $tsql = 'CONCAT(B.Nama_Produk,P.Nama_Promo) LIKE ?'; + $asql[] = '%'. $tcari .'%'; + } + + $obj = new Table($this->app); + $obj->set_table("(SELECT * FROM inv_promo WHERE Tipe_Promo IN (1,2)) P LEFT JOIN inv_produk B ON (B.InvID=P.InvID) LEFT JOIN para_satuan S ON (S.SatuanID=P.SatuanID) LEFT JOIN para_cabang C ON (P.CabID=C.CabID) LEFT JOIN para_member_grup G ON (G.Grup_MemberID=P.Grup_MemberID)", "P.*,B.Nama_Produk,S.Nama_Satuan,IF(P.CabID=0,'SEMUA CAB',C.Nama_Cab) Nama_Cab,IF(P.Grup_MemberID=0,'SEMUA GRUP',G.Nama_Grup) Nama_Grup,(P.Jumlah_Promo-P.Jumlah_Proses) Jumlah_Sisa", $tsql, $asql); + $obj->add_field("PromoID", "ID", "hid"); + $obj->add_field("Nama_Cab", "Cabang", "l"); + $obj->add_field("Nama_Produk", "Nama Barang", "awr"); + $obj->add_field("Nama_Satuan", "Satuan", "l"); + $obj->add_field("Nama_Grup", "Grup Member", "l"); + $obj->add_field("Jumlah_Promo", "Qty Promo", "r", "rupiah"); + $obj->add_field("Jumlah_Sisa", "Qty Sisa", "r", "rupiah"); + $obj->add_field("Tgl_Akhir", "Tgl. Akhir", "c", "sqltgl", "", "val-tgl"); + $obj->add_field("Aktif", "Aktif", "c", "checkbox"); + $obj->set_field_order("Nama_Cab", "A"); + $obj->add_row_btn("clipboard", "Ubah", "PromoBarangJS.detail_ubah"); + $obj->add_row_btn("trash", "Hapus", "PromoBarangJS.detail_hapus"); + $obj->set_func_btn("PromoBarangJS.detail_tambah", "+ Promo Barang"); + $this->app->json([ $obj->json_table("divDetail") ]); + } + + public function brow_produk() { + $tcari = Param::Get("Cari_Produk"); + $tsql = ''; $asql = []; + if (!empty($tcari)) { + $tsql = ' AND Nama_Produk LIKE ?'; + $asql[] = '%'. $tcari .'%'; + } + + $obj = new Table($this->app); + $obj->set_table("inv_produk", "*", "Aktif=1".$tsql, $asql); + $obj->add_field("InvID", "ID", "hid"); + $obj->add_field("Nama_Produk", "Nama Barang", "awr"); + $obj->set_field_order("Nama_Produk", "A"); + $obj->set_func_select("PromoBarangJS.produk_select"); + $this->app->json([ $obj->db_table("divBrowProduk") ]); + } + + public function form_promo() { + $atabel = Invesa::A_Promo(1); + if ($this->id_promo > 0) { + $atabel = $this->db->fetchRow("SELECT P.*,B.Nama_Produk FROM (SELECT * FROM inv_promo WHERE PromoID=?) P LEFT JOIN inv_produk B ON (B.InvID=P.InvID)", [$this->id_promo]); + if ((int) $atabel['Promo_InvID'] > 0) { + $atabel['Promo_Produk'] = $this->db->fetchField("SELECT Nama_Produk FROM inv_produk WHERE InvID=?", [$atabel['Promo_InvID']]) ?? ''; + } + } + + $form = new Form($this->app); + $tpromo = $form->textbox("_", "Nama_Promo", $atabel['Nama_Promo'], true, false, "text"); + $tcab = $form->option_db("_", "CabID", $atabel['CabID'], true, false, "para_cabang", ["CabID","Nama_Cab"], "Aktif=1 ORDER BY Nama_Cab", [0,"SEMUA CABANG"]); + $ttipe = $form->radio("_", "Tipe_Promo", $atabel['Tipe_Promo'], true, false, ['1'=>"Promo Diskon",'2'=>"Promo Barang"], null, "PromoBarangJS.oc_PilihP"); + $tsatpro = $form->option("_", "Promo_SatuanID", $atabel['Promo_SatuanID'], true, false, [$atabel['Promo_SatuanID']=>$atabel['Promo_SatuanID']]); + $tqty = $form->textbox("_", "Promo_Qty", $atabel['Promo_Qty'], true, false, "double"); + $tproduk = $form->textbox("_", "Nama_Produk", $atabel['Nama_Produk'], false, false, "text"); + $tprodukpro = $form->textbox("_", "Promo_Produk", $atabel['Promo_Produk'], false, false, "text"); + $tsatuan = $form->option("_", "SatuanID", $atabel['SatuanID'], true, false, [$atabel['SatuanID']=>$atabel['SatuanID']]); + $tgrup = $form->option_db("_", "Grup_MemberID", $atabel['Grup_MemberID'], true, false, "para_member_grup", ["Grup_MemberID","Nama_Grup"], "Aktif=1 ORDER BY Nama_Grup", [0,"SEMUA GRUP"]); + $tpilqty = $form->radio("_", "Pilih_Qty", $atabel['Pilih_Qty'], true, false, ['1'=>"Minimum Qty",'2'=>"Kelipatan Qty"], null, "PromoBarangJS.oc_PilihQ"); + $tqty_min = $form->textbox("_", "Qty_Min", $atabel['Qty_Min'], true, false, "double"); + $tqty_kali = $form->textbox("_", "Qty_Kali", $atabel['Qty_Kali'], true, false, "double"); + $tpdisk = $form->textbox("_", "Promo_Disc", $atabel['Promo_Disc'], true, false, "double"); + $tjpromo = $form->textbox("_", "Jumlah_Promo", $atabel['Jumlah_Promo'], true, false, "double"); + $ttglmulai = $form->datebox("_", "Tgl_Mulai", $atabel['Tgl_Mulai'], true, false); + $ttglakhir = $form->datebox("_", "Tgl_Akhir", $atabel['Tgl_Akhir'], true, false); + $taktif = $form->radio("_", "Aktif", $atabel['Aktif'], true, false, ['1'=>"Ya",'0'=>"Tidak"]); + $ajson['html'] = ' +
+ +
'.$tpromo.'
+
+
+ +
'.$tcab.'
+ +
'.$tgrup.'
+
+

+
+ +
'.$tproduk.'
+
+
+ +
'.$tsatuan.'
+ +
'.$tpilqty.'
+
+
+ +
'.$tqty_min.Invesa::Form_Info("Jumlah Penjualan Minimum untuk mendapatkan promo. Contoh : 1 PCS").'
+ +
'.$tqty_kali.Invesa::Form_Info("Jumlah Kelipatan Penjualan untuk mendapatkan promo. Contoh : 5 PCS").'
+
+

+
+ +
'.$ttipe.'
+
+
+ +
'.$tpdisk.Invesa::Form_Info("Nilai Diskon Satuan Barang berdasarkan kriteria. Contoh : Rp 500 / PCS").'
+
+
+ +
'.$tprodukpro.'
+
+
+ +
'.$tsatpro.'
+ +
'.$tqty.Invesa::Form_Info("Jumlah Barang Promo yang diberikan sesuai kriteria. Contoh : 1 PCS").'
+
+

+
+ +
'.$tjpromo.Invesa::Form_Info("Jumlah Item Barang Promo Diskon / Promo Barang yang diberikan, jika Promo Diskon dan berdasarkan Kelipatan Qty maka Jumlah Item adalah sesuai Kelipatan Qty yang diberikan. Contoh : 500 PCS").'
+ +
'.$ttglmulai.'
+
+
+ +
'.$taktif.'
+ +
'.$ttglakhir.'
+
+ + + + '; + $this->app->json($ajson); + } + + public function item_detail () { + $ajson = $this->db->fetchAll("SELECT P.SatuanID value,S.Nama_Satuan label FROM (SELECT * FROM inv_produk_kemasan WHERE InvID=?) P LEFT JOIN para_satuan S ON (S.SatuanID=P.SatuanID)", [$this->id_inv]); + $this->app->json($ajson); + } + + public function index() { + $this->app->json(['html' => ' +
Daftar Promo Barang
 
' + ]); + } +} diff --git a/app/Controller/Promo/BelidiscController.php b/app/Controller/Promo/BelidiscController.php new file mode 100644 index 0000000..431b8bd --- /dev/null +++ b/app/Controller/Promo/BelidiscController.php @@ -0,0 +1,331 @@ +app = $app; + $this->db = $db; + $this->id_cab = Param::Int("CabID", 0); + $this->mode = Param::Get("mode", ""); + $this->mode_detail = Param::Get("mode_detail", ""); + $this->id_grup = Param::Int("Grup_PromoID", 0); + $this->id_inv = Param::Int("InvID", 0); + $this->id_satuan = Param::Int("SatuanID", 0); + } + + public function table_detail() { + if (in_array($this->mode_detail, ["insert","update","delete"])) { + $sql = new SQL($this->app); + $sql->set_table("inv_promo"); + $sql->add_param("Grup_PromoID"); + $sql->add_param("InvID"); + $sql->add_param("SatuanID"); + $sql->add_param("Jual_Grup", Param::Get("List_CB_VarianID", "0")); + $sql->add_param_userid(); + $sql->add_where("PromoID"); + + if ( $this->mode_detail === "insert" ) { + $sql->add_param("Tipe_Promo", 5); + $sql->InsertDB(); + } else if ( $this->mode_detail === "update" ) { + $sql->UpdateDB(); + } else if ( $this->mode_detail === "delete" ) { + $sql->DeleteDB(); + } + } + + $tsql = 'Tipe_Promo=? AND Grup_PromoID=?'; $asql = [5, $this->id_grup]; + + $obj = new Table($this->app); + $obj->set_table("(SELECT * FROM inv_promo WHERE ".$tsql.") D LEFT JOIN inv_produk P ON (D.InvID=P.InvID) LEFT JOIN para_satuan S ON (S.SatuanID=D.SatuanID)", "D.*,P.Nama_Produk,Nama_Varian(IF(ISNULL(D.Jual_Grup) OR D.Jual_Grup='','0',D.Jual_Grup)) Nama_Varian,S.Nama_Satuan", "", $asql); + $obj->add_field("PromoID", "ID", "hid"); + $obj->add_field("InvID", "InvID", "hid"); + $obj->add_field("SatuanID", "SatuanID", "hid"); + $obj->add_field("Jual_Grup", "Varian", "hid"); + $obj->add_field("Nama_Produk", "Nama Barang", "awr"); + $obj->add_field("Nama_Satuan", "Satuan", "l"); + $obj->add_field("Nama_Varian", "Varian", "awr"); + if (in_array($this->mode, ["add","edit"])) { + $obj->add_row_btn("clipboard", "Ubah", "PromoBeliDiscJS.detail_ubah"); + $obj->add_row_btn("trash", "Hapus", "PromoBeliDiscJS.detail_hapus", "Grup_PromoID", $this->id_grup); + $obj->set_func_btn("PromoBeliDiscJS.detail_tambah", ' Barang'); + $obj->set_func_btn("PromoBeliDiscJS.produk_brow", ' Browse'); + } + $ajson[] = $obj->json_table("divDetailTabel"); + $this->app->json($ajson); + } + + public function brow_promo() { + $tcari = Param::Get("Cari_Promo"); + $tsql = ''; $asql = []; + if (!empty($tcari)) { + $tsql .= "Promo_Nama LIKE ?"; + array_push($asql, '%' . $tcari . '%'); + } + + $obj = new Table($this->app); + $obj->set_table("inv_promo_grup", "*", $tsql, $asql); + $obj->add_field("Grup_PromoID", "ID", "hid"); + $obj->add_field("Promo_Nama", "Nama Promo", "awr"); + $obj->add_field("Tgl_Mulai", "Tgl. Mulai", "c", "sqltgl", "", "val-tgl"); + $obj->add_field("Tgl_Akhir", "Tgl. Akhir", "c", "sqltgl", "", "val-tgl"); + $obj->add_field("Aktif", "Aktif", "c", "checkbox"); + $obj->set_func_select("PromoBeliDiscJS.promo_select"); + $this->app->json([ $obj->db_table("divBrowPromo") ]); + } + + public function brow_produk() { + $tcari = Param::Get("Cari_Produk"); + $tsql = ''; $asql = []; + if (!empty($tcari)) { + $tsql .= " AND Nama_Produk LIKE ?"; + $asql[] = '%' . $tcari . '%'; + } + + $obj = new Table($this->app); + $obj->set_table("inv_produk", "*", $tsql, $asql); + $obj->add_field("InvID", "ID", "hid"); + $obj->add_field("NormalID", "ID", "hid"); + $obj->add_field("Nama_Produk", "Nama Barang", "awr"); + $obj->set_func_select("PromoBeliDiscJS.produk_select"); + $this->app->json([ $obj->db_table("divBrowProduk") ]); + } + + public function auto_produk() { + $tcari = Param::Get("Auto_Query", ""); + $ajson['autodata'] = []; + + // Cari by Nama_Produk + $stat = $this->db->runQuery("SELECT P.InvID,P.Nama_Produk,P.NormalID Data2 FROM inv_produk P WHERE P.Nama_Produk LIKE ? ORDER BY P.Nama_Produk LIMIT 50", ['%'.$tcari.'%']); + while ($row = $stat->fetch(SimplePdo::FETCH_ASSOC)) { + $ajson['autodata'][] = ['value'=>$row['InvID'], 'text'=>$row['Nama_Produk'], 'html'=>$row['Nama_Produk'], 'data'=>$row['Data2'], 'bc'=>0]; + } + $this->app->json($ajson); + } + + public function form_master() { + $ajson = [ 'error'=>"", 'html'=>"" ]; + $atabel = []; + + if ($this->mode === "add") { + $atabel = $this->Data_Promo(true); + } else if ($this->mode === "save") { + $sql = new SQL($this->app); + $sql->set_table("inv_promo_grup"); + $sql->add_param("CabID", $this->id_cab); + $sql->add_param("Grup_MemberID"); + $sql->add_param("Qty_Kali"); + $sql->add_param("Tipe_Promo"); + $sql->add_param("Promo_Nama"); + $sql->add_param("Promo_Minggu"); + $sql->add_param("Promo_Disc"); + $sql->add_param_date("Tgl_Mulai"); + $sql->add_param_date("Tgl_Akhir"); + $sql->add_param("Aktif"); + $sql->add_param_userid(); + $sql->add_where("Grup_PromoID"); + + if ($this->id_grup === 0) { + $sql->add_param("Pilih_Qty", 3); + $sql->InsertDB(); + } else { + $sql->UpdateDB(); + $this->db->runQuery("UPDATE inv_promo_grup a, inv_promo b SET b.CabID=a.CabID,b.Grup_MemberID=a.Grup_MemberID,b.Pilih_Qty=a.Pilih_Qty,b.Qty_Kali=a.Qty_Kali,b.Tipe_Promo=a.Tipe_Promo,b.Promo_Disc=a.Promo_Disc,b.Tgl_Mulai=a.Tgl_Mulai,b.Tgl_Akhir=a.Tgl_Akhir,b.Aktif=a.Aktif WHERE a.Grup_PromoID=a.Grup_PromoID"); + } + $this->mode = "view"; + } else if ($this->mode === "cancel") { + $this->db->runQuery("DELETE FROM inv_promo WHERE Tipe_Promo=5 AND Grup_PromoID=0"); + $atabel = $this->Data_Promo(); + } else { + $atabel = $this->Data_Promo(); + } + + $enable = in_array($this->mode, ["add","edit"]) ? true : false; + $form = new Form($this->app); + $tcab = $form->option_db("_", "CabID", $atabel['CabID'], $enable, false, "para_cabang", ["CabID","Nama_Cab"], "Aktif=1 ORDER BY Nama_Cab", [0,"SEMUA CABANG"]); + $tgrup_mem = $form->option_db("_", "Grup_MemberID", $atabel['Grup_MemberID'], $enable, false, "para_member_grup", ["Grup_MemberID","Nama_Grup"], "Aktif=1 ORDER BY Nama_Grup", [0,"SEMUA GRUP"]); + $tqty = $form->textbox("_", "Qty_Kali", $atabel['Qty_Kali'], $enable, true, "double"); + $tnama = $form->textbox("_", "Promo_Nama", $atabel['Promo_Nama'], $enable, true, "text", "nama promo"); + $tminggu = $form->textbox("_", "Promo_Minggu", $atabel['Promo_Minggu'], $enable, true, "text", "hari promo"); + $tdisc = $form->textbox("_", "Promo_Disc", $atabel['Promo_Disc'], $enable, true, "double"); + $ttglmulai = $form->datebox("_", "Tgl_Mulai", $atabel['Tgl_Mulai'], $enable, true); + $ttglakhir = $form->datebox("_", "Tgl_Akhir", $atabel['Tgl_Akhir'], $enable, true); + $taktif = $form->radio("_", "Aktif", $atabel['Aktif'], true, false, ['1'=>"Ya",'0'=>"Tidak"]); + $ajson['html'] = ' +
+ +
'.$tnama.'
+
+
+ +
'.$tcab.'
+ +
'.$tminggu.Invesa::Form_Info("Kode Hari dalam Angka. Contoh : 1 = Senin, 2 = Selasa, ... 0 = Minggu.").'
+
+
+ +
'.$tgrup_mem.'
+ +
'.$ttglmulai.'
+
+
+ +
'.$taktif.'
+ +
'.$ttglakhir.'
+
+

+
+ +
'.$tqty.Invesa::Form_Info("Jumlah Kelipatan Penjualan untuk mendapatkan promo. Contoh : Beli 2 PCS, item Ke-2 Disc 50%, Berarti = 2 PCS.").'
+ +
'.$tdisc.Invesa::Form_Info("Nilai Diskon Satuan Barang berdasarkan kriteria. Contoh : 50%, Berarti = 0.50.").'
+
+ + + '; + $this->app->json($ajson); + } + + public function form_produk() { + $id = (int) Param::Get("PromoID", 0); + $atabel = [ 'PromoID'=>$id, 'InvID'=>$this->id_inv, 'SatuanID'=>$this->id_satuan, 'Kode_Varian'=>Param::Get("Kode_Varian", "0"), 'Nama_Produk'=>"" ]; + if ($this->id_inv > 0) { + $_row = $this->db->fetchRow("SELECT Nama_Produk FROM inv_produk WHERE InvID=?", [$this->id_inv]); + if ($_row) $atabel = array_merge($atabel, $_row->getData()); + } + + $form = new Form($this->app); + $tnama = $form->textauto("_", "Nama_Produk", ['value'=>$this->id_inv,'text'=>$atabel['Nama_Produk']], true, true, "nama barang"); + $tsat = $form->option("_", "SatuanID", $atabel['SatuanID'], true, false, [0=>""]); + $ajson['html'] = ' +
+ +
'.$tnama.'
+
+
+ +
'.$tsat.'
+
+
+ + + + '; + $this->app->json($ajson); + } + + public function form_varian() { + $kode_varian = Param::Get("Kode_Varian", "0"); $avarian = explode(",", $kode_varian); + $obj = new Table($this->app); + $obj->set_table("(SELECT VarianID FROM inv_produk_varian WHERE InvID=? AND SatuanID=?) K LEFT JOIN para_varian V ON (K.VarianID=V.VarianID)", "K.VarianID,IFNULL(V.Nama_Varian,'Tanpa Varian') Nama_Varian,IF(K.VarianID IN (?),'Y','N') Cek", "", [$avarian, $this->id_inv, $this->id_satuan]); + $obj->add_field("VarianID", "ID", "hid"); + $obj->add_field("Nama_Varian", "Nama Varian", "awr"); + $obj->add_row_checkbox("VarianID", "Cek"); + $obj->set_field_order("Nama_Varian", "A"); + $this->app->json([ $obj->json_table("divBrowVarian") ]); + } + + public function proses_delete() { + $this->db->runQuery("DELETE FROM inv_promo_grup WHERE Grup_PromoID=?", [$this->id_grup]); + $this->db->runQuery("DELETE FROM inv_promo WHERE Grup_PromoID=?", [$this->id_grup]); + $this->app->json([ 'status' => true ]); + } + + public function option_satuan() { + $aoption = ['type' => "option", 'id' => "SatuanID", 'value' => $this->id_satuan, 'avalue' => []]; + $asatuan = $this->db->fetchAll("SELECT P.SatuanID,S.Nama_Satuan FROM (SELECT SatuanID,Qty FROM inv_produk_kemasan WHERE InvID=?) P LEFT JOIN para_satuan S ON (S.SatuanID=P.SatuanID) ORDER BY P.Qty DESC", [$this->id_inv]); + foreach ($asatuan as $satuan) { + $aoption['avalue'][] = ['value'=>$satuan['SatuanID'], 'html'=>$satuan['Nama_Satuan']]; + } + $this->app->json([ $aoption ]); + } + + public function index() { + $this->app->json(['html' => ' +
+
+ +
+
+
 
+
 
+
+
+
+
' + ]); + } + + private function Data_Promo(bool $is_new=false): array { + $aparam = [ + 'Grup_PromoID' => $this->id_grup, + 'CabID' => $this->id_cab, + 'Grup_MemberID' => 0, + 'Tipe_Promo' => 5, + 'Qty_Kali' => 0, + 'Promo_Nama' => "", + 'Promo_Minggu' => "", + 'Promo_Disc' => 0, + 'Tgl_Mulai' => tgl_ymd(), + 'Tgl_Akhir' => tgl_sql2str(tgl_operasi(tgl_dmy(), 0, 1, 0)), + 'Aktif' => 1, + ]; + if ($is_new) { + $aparam['Grup_PromoID'] = 0; + } else { + if ($this->id_grup > 0) { + $row = $this->db->fetchRow("SELECT * FROM inv_promo_grup WHERE Tipe_Promo IN (5) AND Grup_PromoID=?", [$this->id_grup]); + if ($row) $aparam = array_merge($aparam, $row->getData()); + } else { + $row = $this->db->fetchRow("SELECT * FROM inv_promo_grup WHERE Tipe_Promo IN (5) ORDER BY Grup_PromoID DESC", []); + if ($row) $aparam = array_merge($aparam, $row->getData()); + } + } + return $aparam; + } +} diff --git a/app/Controller/Promo/TotalController.php b/app/Controller/Promo/TotalController.php new file mode 100644 index 0000000..0398ec1 --- /dev/null +++ b/app/Controller/Promo/TotalController.php @@ -0,0 +1,220 @@ +app = $app; + $this->db = $db; + $this->mode_detail = Param::Get("mode_detail", ""); + $this->id_promo = (int) Param::Get("PromoID", 0); + $this->id_inv = (int) Param::Get("InvID", 0); + } + + public function table_promo() { + if (in_array($this->mode_detail, ["insert","update","delete"])) { + $sql = new SQL($this->app); + $sql->set_table("inv_promo"); + $sql->add_param("Nama_Promo"); + $sql->add_param("Jual_Min"); + $sql->add_param("Jual_Grup"); + $sql->add_param("CabID"); + $sql->add_param("Grup_MemberID"); + $sql->add_param("Tipe_Promo"); + $sql->add_param("Promo_Jual"); + $sql->add_param("Promo_InvID"); + $sql->add_param("Promo_SatuanID"); + $sql->add_param("Promo_Qty"); + $sql->add_param("Jumlah_Promo"); + $sql->add_param_date("Tgl_Mulai"); + $sql->add_param_date("Tgl_Akhir"); + $sql->add_param("Aktif"); + $sql->add_param_userid(); + $sql->add_where("PromoID"); + + if ($this->mode_detail === "insert") { + $sql->InsertDB(); + } else if ($this->mode_detail === "update") { + $sql->UpdateDB(); + } else if ($this->mode_detail === "delete") { + $sql->DeleteDB(); + } + } + + $tcari = Param::Get("Cari_Promo"); + $tsql = ''; $asql = []; + if (!empty($tcari)) { + $tsql = 'P.Nama_Promo LIKE ?'; + $asql[] = '%'. $tcari .'%'; + } + + $obj = new Table($this->app); + $obj->set_table("(SELECT * FROM inv_promo WHERE Tipe_Promo IN (3,4)) P LEFT JOIN para_cabang C ON (P.CabID=C.CabID) LEFT JOIN para_member_grup G ON (G.Grup_MemberID=P.Grup_MemberID)", "P.*,IF(P.CabID=0,'SEMUA CAB',C.Nama_Cab) Nama_Cab,IF(P.Grup_MemberID=0,'SEMUA GRUP',G.Nama_Grup) Nama_Grup,(P.Jumlah_Promo-P.Jumlah_Proses) Jumlah_Sisa", $tsql, $asql); + $obj->add_field("PromoID", "ID", "hid"); + $obj->add_field("Nama_Cab", "Cabang", "l"); + $obj->add_field("Nama_Grup", "Grup Member", "l"); + $obj->add_field("Nama_Promo", "Nama Promo", "awr"); + //$obj->add_field("Jual_Min", "Minimum", "r", "rupiah"); + $obj->add_field("Jumlah_Promo", "Qty Promo", "r", "rupiah"); + $obj->add_field("Jumlah_Sisa", "Qty Sisa", "r", "rupiah"); + $obj->add_field("Tgl_Akhir", "Tgl. Akhir", "c", "sqltgl", "", "val-tgl"); + $obj->add_field("Aktif", "Aktif", "c", "checkbox"); + $obj->set_field_order("Nama_Cab", "A"); + $obj->add_row_btn("clipboard", "Ubah", "PromoTotalJS.detail_ubah"); + $obj->add_row_btn("trash", "Hapus", "PromoTotalJS.detail_hapus"); + $obj->set_func_btn("PromoTotalJS.detail_tambah", "+ Promo Total"); + $this->app->json([ $obj->json_table("divDetail") ]); + } + + public function brow_produk() { + $tcari = Param::Get("Cari_Produk"); + $tsql = ''; $asql = []; + if (!empty($tcari)) { + $tsql = ' AND Nama_Produk LIKE ?'; + $asql[] = '%'. $tcari .'%'; + } + + $obj = new Table($this->app); + $obj->set_table("inv_produk", "*", "Aktif=1".$tsql, $asql); + $obj->add_field("InvID", "ID", "hid"); + $obj->add_field("Nama_Produk", "Nama Barang", "awr"); + $obj->set_field_order("Nama_Produk", "A"); + $obj->set_func_select("PromoTotalJS.produk_select"); + $this->app->json([ $obj->db_table("divBrowProduk") ]); + } + + public function form_promo() { + $atabel = Invesa::A_Promo(4); + if ($this->id_promo > 0) { + $atabel = $this->db->fetchRow("SELECT * FROM inv_promo WHERE PromoID=?", [$this->id_promo]); + if ((int) $atabel['Promo_InvID'] > 0) { + $atabel['Promo_Produk'] = $this->db->fetchField("SELECT Nama_Produk FROM inv_produk WHERE InvID=?", [$atabel['Promo_InvID']]) ?? ''; + } + } + + $form = new Form($this->app); + $tpromo = $form->textbox("_", "Nama_Promo", $atabel['Nama_Promo'], true, false, "text"); + $tcab = $form->option_db("_", "CabID", $atabel['CabID'], true, false, "para_cabang", ["CabID","Nama_Cab"], "Aktif=1 ORDER BY Nama_Cab", [0,"SEMUA CABANG"]); + $ttipe = $form->radio("_", "Tipe_Promo", $atabel['Tipe_Promo'], true, false, ['4'=>"Promo Potongan",'3'=>"Promo Barang"], null, "PromoTotalJS.oc_PilihP"); + $tsatpro = $form->option("_", "Promo_SatuanID", $atabel['Promo_SatuanID'], true, false, [$atabel['Promo_SatuanID']=>$atabel['Promo_SatuanID']]); + $tqty = $form->textbox("_", "Promo_Qty", $atabel['Promo_Qty'], true, false, "double"); + $tprodukpro = $form->textbox("_", "Promo_Produk", $atabel['Promo_Produk'], false, false, "text"); + $tgrup = $form->option_db("_", "Grup_MemberID", $atabel['Grup_MemberID'], true, false, "para_member_grup", ["Grup_MemberID","Nama_Grup"], "Aktif=1 ORDER BY Nama_Grup", [0,"SEMUA GRUP"]); + $tj_grup = $form->textbox("_", "Jual_Grup", $atabel['Jual_Grup'], false, false, "text"); + $tj_min = $form->textbox("_", "Jual_Min", $atabel['Jual_Min'], true, false, "double"); + $tpjual = $form->textbox("_", "Promo_Jual", $atabel['Promo_Jual'], true, false, "double"); + $tjpromo = $form->textbox("_", "Jumlah_Promo", $atabel['Jumlah_Promo'], true, false, "double"); + $ttglmulai = $form->datebox("_", "Tgl_Mulai", $atabel['Tgl_Mulai'], true, false); + $ttglakhir = $form->datebox("_", "Tgl_Akhir", $atabel['Tgl_Akhir'], true, false); + $taktif = $form->radio("_", "Aktif", $atabel['Aktif'], true, false, ['1'=>"Ya",'0'=>"Tidak"]); + $ajson['html'] = ' +
+ +
'.$tpromo.'
+
+
+ +
'.$tcab.'
+ +
'.$tgrup.'
+
+

+
+ +
'.$tj_grup.'
+
+
+ +
'.$tj_min.Invesa::Form_Info("Jumlah Minimal Penjualan untuk mendapatkan promo. Contoh : Rp 100.000").'
+
+

+
+ +
'.$ttipe.'
+
+
+ +
'.$tpjual.Invesa::Form_Info("Nilai Potongan Promo yang diberikan, jika Minimal Penjualan tercapai. Contoh : Rp 10.000").'
+
+
+ +
'.$tprodukpro.'
+
+
+ +
'.$tsatpro.'
+ +
'.$tqty.Invesa::Form_Info("Jumlah Barang Promo yang diberikan sesuai kriteria. Contoh : 1 PCS").'
+
+

+
+ +
'.$tjpromo.Invesa::Form_Info("Jumlah Item Promo Barang yang diberikan. Contoh : 500 PCS").'
+ +
'.$ttglmulai.'
+
+
+ +
'.$taktif.'
+ +
'.$ttglakhir.'
+
+ + + '; + $this->app->json($ajson); + } + + public function form_grup() { + $agrup = explode(",", Param::Get("Jual_Grup","0")); + $ajson['html'] = ''; + + $stat = $this->db->runQuery("SELECT * FROM inv_produk_grup ORDER BY Nama_Grup"); + while ($row = $stat->fetch(SimplePdo::FETCH_ASSOC)) { + $checked = (in_array($row['Grup_InvID'], $agrup)) ? "checked" : ""; + $ajson['html'] .= sprintf('', $row['Nama_Grup'], $row['Grup_InvID'], $checked); + } + $ajson['html'] .= '
Grup BarangAksi
%s
'; + $this->app->json($ajson); + } + + public function item_detail () { + $ajson = $this->db->fetchAll("SELECT P.SatuanID value,S.Nama_Satuan label FROM (SELECT * FROM inv_produk_kemasan WHERE InvID=?) P LEFT JOIN para_satuan S ON (S.SatuanID=P.SatuanID)", [$this->id_inv]); + $this->app->json($ajson); + } + + public function index() { + $this->app->json(['html' => ' +
Daftar Promo Total Penjualan
 
' + ]); + } +} diff --git a/app/Controller/QZController.php b/app/Controller/QZController.php new file mode 100644 index 0000000..f0861fd --- /dev/null +++ b/app/Controller/QZController.php @@ -0,0 +1,45 @@ +app = $app; + } + + public function getCert() { + $this->app->response()->header('Content-Type', 'text/plain'); + readfile(__DIR__ . '/../config/qz/cert.pem'); + } + + public function getSign(string $req) { + $privateKey = openssl_get_privatekey(file_get_contents(__DIR__ . '/../config/qz/key.pem')); + $signature = null; + openssl_sign($req, $signature, $privateKey); + + $this->app->response()->header('Content-Type', 'text/plain'); + if ($signature) { + echo base64_encode($signature); + } else echo '

Error signing message

'; + } + +} diff --git a/app/Controller/Report/Beli/AnalisaController.php b/app/Controller/Report/Beli/AnalisaController.php new file mode 100644 index 0000000..988a2a5 --- /dev/null +++ b/app/Controller/Report/Beli/AnalisaController.php @@ -0,0 +1,257 @@ +app = $app; + $this->db = $db; + $this->id_cab = Param::Int("CabID", 0); + $this->reg_name = $session->get('WEB_APP')['REG_NAME']; + } + + private function prepare() { + $apre = [ + 'tipe' => Param::Get("Tipe", "V"), // V or R + 'id_sup' => Param::Int("SupID", 0), + 'id_grup' => Param::Int("Grup_InvID", 0), + 'tgl_from' => Param::Get("Tgl_From"), + 'tgl_to' => Param::Get("Tgl_To"), + ]; + $apre['Hari'] = tgl_range_hari($apre['tgl_from'], $apre['tgl_to'], true); + + $apre['nama_sup'] = ($apre['id_sup'] > 0) ? ($this->db->fetchField("SELECT CONCAT(Nama_Sup,' (',Kode_Sup,')') Nama FROM para_supplier WHERE SupID=?", [$apre['id_sup']]) ?? '') : ''; + $apre['nama_grup'] = ($apre['id_grup'] > 0) ? ($this->db->fetchField("SELECT Nama_Grup FROM inv_produk_grup WHERE Grup_InvID=?", [$apre['id_grup']]) ?? '') : ''; + + // generate report header + $apre['periode'] = $apre['tgl_from'] . ($apre['tgl_from'] !== $apre['tgl_to'] ? ' s/d '.$apre['tgl_to'] : ''); + + $tsql1 = ''; $tsql2 = ''; $asql = [tgl_sql2str($apre['tgl_from']), tgl_sql2str($apre['tgl_to'])]; + if ($this->id_cab > 0) { + $tsql1 .= " AND CabID=?"; + array_push($asql, $this->id_cab); + } + if ($apre['id_sup'] > 0) { + $tsql1 .= " AND No_Ref IN (SELECT No_Beli FROM inv_beli WHERE SupID=? AND (Tgl_Beli BETWEEN ? AND ?))"; + array_push($asql, $apre['id_sup'], tgl_sql2str($apre['tgl_from']), tgl_sql2str($apre['tgl_to'])); + } + if ($apre['id_grup'] > 0) { + $tsql2 .= " WHERE P.Grup_InvID=?"; + array_push($asql, $apre['id_grup']); + } + + if ($apre['tipe'] === "V") { + $apre['query'] = $this->db->runQuery("SELECT P.*,D.Volume FROM (SELECT InvID,SUM(Stok) Volume FROM inv_detail WHERE Stok>0 AND NotaID IN (3,4) AND (Tgl_Ref BETWEEN ? AND ?)".$tsql1." GROUP BY InvID) D LEFT JOIN vi_inv_produk2 P ON (D.InvID=P.InvID)".$tsql2." ORDER BY P.Nama_Produk", $asql); + } else { + $apre['query'] = $this->db->runQuery("SELECT P.*,D.Rupiah FROM (SELECT InvID,SUM(Qty*Harga_Beli) Rupiah FROM inv_detail WHERE Stok>0 AND NotaID IN (3,4) AND (Tgl_Ref BETWEEN ? AND ?)".$tsql1." GROUP BY InvID) D LEFT JOIN inv_produk P ON (D.InvID=P.InvID)".$tsql2." ORDER BY P.Nama_Produk", $asql); + } + return $apre; + } + + public function print() { + $apre = $this->prepare(); + + $pre = new PrintHTML($this->app); + $pre->add_title([strtoupper($this->reg_name), "REKAP ".($apre['tipe']==="V"?"VOLUME":"RUPIAH")." PEMBELIAN", "Periode : ".$apre['periode']]); + + if ($apre['tipe'] === "V") { + $pre->add_field("No.",10,"C"); + $pre->add_field("Nama Barang",50,"L"); + $pre->add_field("Jumlah",20,"R"); + $pre->add_field("Mingguan",20,"R"); + + if ($apre['id_sup'] > 0) $pre->add_sub_title("Nama Supplier : ".$apre['nama_sup']); + if ($apre['id_grup'] > 0) $pre->add_sub_title("Grup Barang : ".$apre['nama_grup']); + + $pre->show_titles(); + $pre->show_headers(); + + $nomor = 0; + while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) { + $total = $row['Volume'] ?? 0; + $mg_total = $total / ($apre['Hari']/7); + $kali = $row['Qty'] ?? 0; + if ($kali > 0) { + $norm = floor($total / $kali); + $sisa = $total - ($norm * $kali); + $mg_norm = floor($mg_total / $kali); + $mg_sisa = $mg_total - ($mg_norm * $kali); + } else { + $norm = 0; + $sisa = $total; + $mg_norm = 0; + $mg_sisa = $mg_total; + } + $stok = rupiah($norm,0)." ".$row['Satuan_Normal']; + $mg_stok = rupiah($mg_norm,0)." ".$row['Satuan_Normal']; + if ($row['Satuan_Normal'] !== $row['Satuan_Stok']) { + $stok .= ", ".rupiah($sisa,0)." ".$row['Satuan_Stok']; + $mg_stok .= ", ".rupiah($mg_sisa,0)." ".$row['Satuan_Stok']; + } + $pre->add_row([ ++$nomor, $row['Nama_Produk'], $stok, $mg_stok ]); + } + + } else { + $pre->add_field("No.",10,"C"); + $pre->add_field("Nama Barang",50,"L"); + $pre->add_field("Jumlah",20,"R","rupiah"); + $pre->add_field("Mingguan",20,"R","rupiah"); + + if ($apre['id_sup'] > 0) $pre->add_sub_title("Nama Supplier : ".$apre['nama_sup']); + if ($apre['id_grup'] > 0) $pre->add_sub_title("Grup Barang : ".$apre['nama_grup']); + + $pre->show_titles(); + $pre->show_headers(); + + $nomor = 0; $tot_rup = 0; $tot_mg = 0; + while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) { + $mg_avg = ($row['Rupiah'] > 0) ? $row['Rupiah'] / ($apre['Hari'] / 7) : 0; + $tot_rup += $row['Rupiah']; + $tot_mg += $mg_avg; + $pre->add_row([ ++$nomor, $row['Nama_Produk'], $row['Rupiah'], $mg_avg ]); + } + $pre->add_span([ ["GRAND TOTAL",2,"R,B"],[$tot_rup,1,"R,B","rupiah"],[$tot_mg,1,"R,B","rupiah"] ]); + } + $pre->add_stamp(1, true); + $pre->show(); + } + + public function excel() { + $apre = $this->prepare(); + $xls = new Xlsx($this->app); + $xls->set_meta([ + 'title' => "Data Analisa Pembelian", + 'desc' => "Export Data Analisa Pembelian" + ]); + $xls->add_title([ $this->reg_name, "DATA REKAP ".($apre['tipe']==="V"?"VOLUME":"RUPIAH")." PEMBELIAN", "Periode : ".$apre['periode'] ]); + + if ($apre['tipe'] === "V") { + $xls->add_field("No.", 5, "@integer"); + $xls->add_field("Nama Barang", 25, "@text"); + $xls->add_field("Jumlah", 15, "#,##0.00"); + $xls->add_field("Mingguan", 15, "#,##0.00"); + $xls->add_sheet("".str_replace("s/d","-",$apre['periode'])); + + if ($apre['id_sup'] > 0) $xls->add_sub_title("Nama Supplier : ".$apre['nama_sup']); + if ($apre['id_grup'] > 0) $xls->add_sub_title("Grup Barang : ".$apre['nama_grup']); + + $xls->show_titles(); + $xls->show_headers(); + + $nomor = 0; + while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) { + $total = $row['Volume'] ?? 0; + $mg_total = $total / ($apre['Hari']/7); + $kali = $row['Qty'] ?? 0; + if ($kali > 0) { + $norm = floor($total / $kali); + $sisa = $total - ($norm * $kali); + $mg_norm = floor($mg_total / $kali); + $mg_sisa = $mg_total - ($mg_norm * $kali); + } else { + $norm = 0; + $sisa = $total; + $mg_norm = 0; + $mg_sisa = $mg_total; + } + $stok = rupiah($norm,0)." ".$row['Satuan_Normal']; + $mg_stok = rupiah($mg_norm,0)." ".$row['Satuan_Normal']; + if ($row['Satuan_Normal'] !== $row['Satuan_Stok']) { + $stok .= ", ".rupiah($sisa,0)." ".$row['Satuan_Stok']; + $mg_stok .= ", ".rupiah($mg_sisa,0)." ".$row['Satuan_Stok']; + } + $xls->add_row([ ++$nomor, $row['Nama_Produk'], $stok, $mg_stok ]); + } + + } else { + $xls->add_field("No.", 5, "@integer"); + $xls->add_field("Nama Barang", 20, "@text"); + $xls->add_field("Jumlah", 15, "#,##0.00"); + $xls->add_field("Mingguan", 15, "#,##0.00"); + $xls->add_sheet("".str_replace("s/d","-",$apre['periode'])); + + if ($apre['id_sup'] > 0) $xls->add_sub_title("Nama Supplier : ".$apre['nama_sup']); + if ($apre['id_grup'] > 0) $xls->add_sub_title("Grup Barang : ".$apre['nama_grup']); + + $xls->show_titles(); + $xls->show_headers(); + + $nomor = 0; $tot_rup = 0; $tot_mg = 0; + while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) { + $mg_avg = ($row['Rupiah'] > 0) ? $row['Rupiah'] / ($apre['Hari'] / 7) : 0; + $tot_rup += $row['Rupiah']; + $tot_mg += $mg_avg; + $xls->add_row([ ++$nomor, $row['Nama_Produk'], $row['Rupiah'], $mg_avg ]); + } + $xls->add_row_bold([ "", "GRAND TOTAL", $tot_rup, $tot_mg ]); + } + $xls->add_stamp(1, true); + $xls->download("Data Pembelian ".str_replace("s/d","-",$apre['periode']).".xlsx"); + unset($xls); + } + + public function index() { + $form = new Form($this->app); + $ttipe = $form->radio("_", "Tipe", "V", true, false, ["V"=>"Volume","R"=>"Rupiah"]); + $tcab = $form->option_db("_", "CabID", $this->id_cab, true, false, "para_cabang", ["CabID","Nama_Cab"], "Aktif=1 ORDER BY CabID", [0,"SEMUA CABANG"]); + $tsup = $form->option_db("_", "SupID", 0, true, false, "para_supplier", ["SupID","Nama_Sup"], "Aktif=1 ORDER BY Nama_Sup", [0,"SEMUA SUPPLIER"]); + $tgrup = $form->option_db("_", "Grup_InvID", 0, true, false, "inv_produk_grup", ["Grup_InvID","Nama_Grup"], "Aktif=1 ORDER BY Nama_Grup", [0,"SEMUA GRUP"]); + $tfrom = $form->datebox("_", "Tgl_From", tgl_ymd(), true, false); + $tto = $form->datebox("_", "Tgl_To", tgl_ymd(), true, false); + $ajson['html'] = ' +
+ +
'.$ttipe.'
+
+
+ +
'.$tcab.'
+
+
+ +
'.$tsup.'
+
+
+ +
'.$tgrup.'
+
+
+ +
'.$tfrom.'
+
+
+ +
'.$tto.'
+
'; + $this->app->json($ajson); + } + +} diff --git a/app/Controller/Report/Beli/BeliController.php b/app/Controller/Report/Beli/BeliController.php new file mode 100644 index 0000000..5d9ec4e --- /dev/null +++ b/app/Controller/Report/Beli/BeliController.php @@ -0,0 +1,226 @@ +app = $app; + $this->db = $db; + $this->id_cab = Param::Int("CabID", 0); + $this->reg_name = $session->get('WEB_APP')['REG_NAME']; + } + + private function prepare() { + $apre = [ + 'tipe' => Param::Get("Tipe", "R"), // R or D + 'id_sup' => Param::Int("SupID", 0), + 'id_grup' => Param::Int("Grup_InvID", 0), + 'tgl_from' => Param::Get("Tgl_From"), + 'tgl_to' => Param::Get("Tgl_To"), + ]; + + $apre['nama_sup'] = ($apre['id_sup'] > 0) ? ($this->db->fetchField("SELECT CONCAT(Nama_Sup,' (',Kode_Sup,')') Nama FROM para_supplier WHERE SupID=?", [$apre['id_sup']]) ?? '') : ''; + $apre['nama_grup'] = ($apre['id_grup'] > 0) ? ($this->db->fetchField("SELECT Nama_Grup FROM inv_produk_grup WHERE Grup_InvID=?", [$apre['id_grup']]) ?? '') : ''; + + // generate report header + $apre['periode'] = $apre['tgl_from'] . ($apre['tgl_from'] !== $apre['tgl_to'] ? ' s/d '.$apre['tgl_to'] : ''); + + $tsql = ''; $asql = [tgl_sql2str($apre['tgl_from']), tgl_sql2str($apre['tgl_to'])]; + if ($this->id_cab > 0) { + $tsql .= " AND CabID=?"; + array_push($asql, $this->id_cab); + } + if ($apre['id_sup'] > 0) { + $tsql .= " AND SupID=?"; + array_push($asql, $apre['id_sup']); + } + //id_grup ? + + if ($apre['tipe'] === "R") { + $apre['query'] = $this->db->runQuery("SELECT S.Nama_Sup,SUM(B.Real_Beli+B.Real_Diskon) Total_Beli,SUM(B.Real_Diskon) Total_Diskon,SUM(B.Real_Beli) Total FROM (SELECT * FROM inv_beli WHERE Data_Beli=1 AND (Tgl_Beli BETWEEN ? AND ?)".$tsql.") B LEFT JOIN para_supplier S ON (B.SupID=S.SupID) GROUP BY B.SupID ORDER BY S.Nama_Sup", $asql); + } else { + $apre['query'] = $this->db->runQuery("SELECT B.*,S.Nama_Sup,B.Total_Beli-B.Total_Diskon Total FROM (SELECT * FROM inv_beli WHERE Data_Beli=1 AND (Tgl_Beli BETWEEN ? AND ?)".$tsql.") B LEFT JOIN para_supplier S ON (B.SupID=S.SupID) ORDER BY B.No_Beli", $asql); + } + return $apre; + } + + public function print() { + $apre = $this->prepare(); + + $pre = new PrintHTML($this->app); + $pre->add_title([strtoupper($this->reg_name), ($apre['tipe']==="R"?"REKAP":"DETAIL")." PEMBELIAN", "Periode : ".$apre['periode']]); + + if ($apre['tipe'] === "R") { + $pre->add_field("No.",10,"C"); + $pre->add_field("Nama Supplier",50,"L"); + $pre->add_field("Sub. Total",20,"R","rupiah"); + $pre->add_field("Diskon",20,"R","rupiah"); + $pre->add_field("Total",20,"R","rupiah"); + + if ($apre['id_sup'] > 0) $pre->add_sub_title("Nama Supplier : ".$apre['nama_sup']); + if ($apre['id_grup'] > 0) $pre->add_sub_title("Grup Barang : ".$apre['nama_grup']); + + $pre->show_titles(); + $pre->show_headers(); + + $tot_beli = 0; $tot_diskon = 0; $nomor = 0; + while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) { + //if ($row['Total] === 0) continue; + $tot_beli += $row['Total_Beli']; + $tot_diskon += $row['Total_Diskon']; + $pre->add_row([ ++$nomor, $row['Nama_Sup'], $row['Total_Beli'], $row['Total_Diskon'], $row['Total'] ]); + } + $pre->add_span([ ["GRAND TOTAL",2,"R,B"],[$tot_beli,1,"R,B","rupiah"],[$tot_diskon,1,"R,B","rupiah"],[$tot_beli-$tot_diskon,1,"R,B","rupiah"] ]); + + } else { + $pre->add_field("No. Nota",30,"C"); + $pre->add_field("Tgl. Nota",30,"C", "tgl_sql2str"); + $pre->add_field("No. Faktur",30,"L"); + $pre->add_field("Nama Supplier",50,"L"); + $pre->add_field("Sub. Total",20,"R","rupiah"); + $pre->add_field("Diskon",20,"R","rupiah"); + $pre->add_field("Total",30,"R","rupiah"); + + if ($apre['id_sup'] > 0) $pre->add_sub_title("Nama Supplier : ".$apre['nama_sup']); + if ($apre['id_grup'] > 0) $pre->add_sub_title("Grup Barang : ".$apre['nama_grup']); + + $pre->show_titles(); + $pre->show_headers(); + + $tot_beli = 0; $tot_diskon = 0; + while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) { + $tot_beli += $row['Total_Beli']; + $tot_diskon += $row['Total_Diskon']; + $pre->add_row([ $row['No_Beli'], $row['Tgl_Beli'], $row['No_Faktur'], $row['Nama_Sup'], $row['Total_Beli'], $row['Total_Diskon'], $row['Total'] ]); + } + $pre->add_span([ ["GRAND TOTAL",4,"R,B"],[$tot_beli,1,"R,B","rupiah"],[$tot_diskon,1,"R,B","rupiah"],[$tot_beli-$tot_diskon,1,"R,B","rupiah"] ]); + } + $pre->add_stamp(1, true); + $pre->show(); + } + + public function excel() { + $apre = $this->prepare(); + $xls = new Xlsx($this->app); + $xls->set_meta([ + 'title' => "Data Pembelian", + 'desc' => "Export Data Pembelian" + ]); + $xls->add_title([ $this->reg_name, "DATA ".($apre['tipe']==="R"?"REKAP":"DETAIL")." PEMBELIAN", "Periode : ".$apre['periode'] ]); + + if ($apre['tipe'] === "R") { + $xls->add_field("No.", 5, "@integer"); + $xls->add_field("Nama Supplier", 25, "@text"); + $xls->add_field("Sub. Total", 15, "#,##0.00"); + $xls->add_field("Diskon", 15, "#,##0.00"); + $xls->add_field("Total", 15, "#,##0.00"); + $xls->add_sheet("".str_replace("s/d","-",$apre['periode'])); + + if ($apre['id_sup'] > 0) $xls->add_sub_title("Nama Supplier : ".$apre['nama_sup']); + if ($apre['id_grup'] > 0) $xls->add_sub_title("Grup Barang : ".$apre['nama_grup']); + + $xls->show_titles(); + $xls->show_headers(); + + $tot_beli = 0; $tot_diskon = 0; $nomor = 0; + while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) { + $tot_beli += $row['Total_Beli']; + $tot_diskon += $row['Total_Diskon']; + $xls->add_row([ ++$nomor, $row['Nama_Sup'], $row['Total_Beli'], $row['Total_Diskon'], $row['Total'] ]); + } + $xls->add_row_bold([ "", "GRAND TOTAL", $tot_beli, $tot_diskon, $tot_beli-$tot_diskon ]); + + } else { + $xls->add_field("No. Nota", 15, "@"); + $xls->add_field("Tgl. Nota", 12, "@date"); + $xls->add_field("No. Faktur", 15, "@text"); + $xls->add_field("Nama Supplier", 20, "@text"); + $xls->add_field("Sub. Total", 15, "#,##0.00"); + $xls->add_field("Diskon", 15, "#,##0.00"); + $xls->add_field("Total", 15, "#,##0.00"); + $xls->add_sheet("".str_replace("s/d","-",$apre['periode'])); + + if ($apre['id_sup'] > 0) $xls->add_sub_title("Nama Supplier : ".$apre['nama_sup']); + if ($apre['id_grup'] > 0) $xls->add_sub_title("Grup Barang : ".$apre['nama_grup']); + + $xls->show_titles(); + $xls->show_headers(); + + $tot_beli = 0; $tot_diskon = 0; + while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) { + $tot_beli += $row['Total_Beli']; + $tot_diskon += $row['Total_Diskon']; + $xls->add_row([ $row['No_Beli'], $row['Tgl_Beli'], $row['No_Faktur'], $row['Nama_Sup'], $row['Total_Beli'], $row['Total_Diskon'], $row['Total'] ]); + } + $xls->add_row_bold([ "", "", "", "GRAND TOTAL", $tot_beli, $tot_diskon, $tot_beli-$tot_diskon ]); + } + $xls->add_stamp(1, true); + $xls->download("Data Pembelian ".str_replace("s/d","-",$apre['periode']).".xlsx"); + unset($xls); + } + + public function index() { + $form = new Form($this->app); + $ttipe = $form->radio("_", "Tipe", "R", true, false, ["R"=>"Rekap","D"=>"Detail"]); + $tcab = $form->option_db("_", "CabID", $this->id_cab, true, false, "para_cabang", ["CabID","Nama_Cab"], "Aktif=1 ORDER BY CabID", [0,"SEMUA CABANG"]); + $tsup = $form->option_db("_", "SupID", 0, true, false, "para_supplier", ["SupID","Nama_Sup"], "Aktif=1 ORDER BY Nama_Sup", [0,"SEMUA SUPPLIER"]); + $tgrup = $form->option_db("_", "Grup_InvID", 0, true, false, "inv_produk_grup", ["Grup_InvID","Nama_Grup"], "Aktif=1 ORDER BY Nama_Grup", [0,"SEMUA GRUP"]); + $tfrom = $form->datebox("_", "Tgl_From", tgl_ymd(), true, false); + $tto = $form->datebox("_", "Tgl_To", tgl_ymd(), true, false); + $ajson['html'] = ' +
+ +
'.$ttipe.'
+
+
+ +
'.$tcab.'
+
+
+ +
'.$tsup.'
+
+
+ +
'.$tgrup.'
+
+
+ +
'.$tfrom.'
+
+
+ +
'.$tto.'
+
'; + $this->app->json($ajson); + } + +} diff --git a/app/Controller/Report/Beli/MutasiController.php b/app/Controller/Report/Beli/MutasiController.php new file mode 100644 index 0000000..6b1243f --- /dev/null +++ b/app/Controller/Report/Beli/MutasiController.php @@ -0,0 +1,160 @@ +app = $app; + $this->db = $db; + $this->id_cab = Param::Int("CabID", 0); + $this->reg_name = $session->get('WEB_APP')['REG_NAME']; + } + + private function prepare() { + $apre = [ + 'id_sup' => Param::Int("SupID", 0), + 'tgl_from' => Param::Get("Tgl_From"), + 'tgl_to' => Param::Get("Tgl_To"), + ]; + + $apre['nama_sup'] = ($apre['id_sup'] > 0) ? ($this->db->fetchField("SELECT CONCAT(Nama_Sup,' (',Kode_Sup,')') Nama FROM para_supplier WHERE SupID=?", [$apre['id_sup']]) ?? '') : ''; + + // generate report header + $apre['periode'] = $apre['tgl_from'] . ($apre['tgl_from'] !== $apre['tgl_to'] ? ' s/d '.$apre['tgl_to'] : ''); + + $tsql = ''; $asql = [$apre['id_sup']]; + if ($this->id_cab > 0) { + $tsql .= " AND CabID=?"; + array_push($asql, $this->id_cab); + } + + $n_saldo = (float) $this->db->fetchField("SELECT SUM(Real_Beli) Total FROM inv_beli WHERE Data_Beli=1 AND SupID=?".$tsql." AND Tgl_Belidb->fetchField("SELECT SUM(Total_Bayar+Total_Potong) Bayar FROM inv_beli_lunas WHERE No_Beli IN (SELECT No_Beli FROM inv_beli WHERE Data_Beli=1 AND SupID=?".$tsql.") AND Tgl_Bayardb->runQuery("(SELECT Tgl_Beli,SUM(Real_Beli) Total,0 Bayar FROM inv_beli WHERE Data_Beli=1 AND (Tgl_Beli BETWEEN ? AND ?) AND SupID=?".$tsql." GROUP BY Tgl_Beli) UNION ALL (SELECT Tgl_Bayar Tgl_Beli,0 Total,SUM(Total_Bayar+Total_Potong) Bayar FROM inv_beli_lunas WHERE No_Beli IN (SELECT No_Beli FROM inv_beli WHERE Data_Beli=1 AND SupID=?".$tsql.") AND (Tgl_Bayar BETWEEN ? AND ?) GROUP BY Tgl_Bayar) ORDER BY Tgl_Beli,Total DESC", array_merge([tgl_sql2str($apre['tgl_from']),tgl_sql2str($apre['tgl_to'])], $asql, $asql, [tgl_sql2str($apre['tgl_from']),tgl_sql2str($apre['tgl_to'])])); + return $apre; + } + + public function print() { + $apre = $this->prepare(); + + $pre = new PrintHTML($this->app); + $pre->add_title([strtoupper($this->reg_name), "MUTASI PEMBELIAN", "Periode : ".$apre['periode']]); + + $pre->add_field("Tanggal",10,"C","tgl_sql2str"); + $pre->add_field("Nota / Bon",20,"R","rupiah"); + $pre->add_field("Bayar",20,"R","rupiah"); + $pre->add_field("Sisa",20,"R","rupiah"); + + $pre->add_sub_title("Nama Supplier : ".$apre['nama_sup']); + + $pre->show_titles(); + $pre->show_headers(); + + $tot_sub = 0; $tot_bayar = 0; + $pre->add_span([ ["Saldo Awal",1,"R,B"],["0",1,"R,B"],["0",1,"R,B"],[$apre['Saldo'],1,"R,B","rupiah"] ]); + while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) { + $tot_sub += $row['Total']; + $tot_bayar += $row['Bayar']; + $apre['Saldo'] += $row['Total'] - $row['Bayar']; + $pre->add_row([ $row['Tgl_Beli'], $row['Total'], $row['Bayar'], $apre['Saldo'] ]); + } + $pre->add_span([ ["Saldo Akhir",1,"R,B"],[$tot_sub,1,"R,B","rupiah"],[$tot_bayar,1,"R,B","rupiah"],[$apre['Saldo'],1,"R,B","rupiah"] ]); + + $pre->add_stamp(1, true); + $pre->show(); + } + + public function excel() { + $apre = $this->prepare(); + $xls = new Xlsx($this->app); + $xls->set_meta([ + 'title' => "Data Mutasi Pembelian", + 'desc' => "Export Data Mutasi Pembelian" + ]); + $xls->add_title([ $this->reg_name, "DATA MUTASI PEMBELIAN", "Periode : ".$apre['periode'] ]); + + $xls->add_field("Tanggal", 12, "@date"); + $xls->add_field("Nota / Bon", 15, "#,##0.00"); + $xls->add_field("Bayar", 15, "#,##0.00"); + $xls->add_field("Sisa", 15, "#,##0.00"); + $xls->add_sheet("".str_replace("s/d","-",$apre['periode'])); + + $xls->add_sub_title("Nama Supplier : ".$apre['nama_sup']); + + $xls->show_titles(); + $xls->show_headers(); + + $tot_sub = 0; $tot_bayar = 0; + $xls->add_row_bold([ "Saldo Awal", 0, 0, $apre['Saldo'] ]); + while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) { + $tot_sub += $row['Total']; + $tot_bayar += $row['Bayar']; + $apre['Saldo'] += $row['Total'] - $row['Bayar']; + $xls->add_row([ $row['Tgl_Beli'], $row['Total'], $row['Bayar'], $apre['Saldo'] ]); + } + $xls->add_row_bold([ "Saldo Akhir", $tot_sub, $tot_bayar, $apre['Saldo'] ]); + + $xls->add_stamp(1, true); + $xls->download("Data Mutasi Pembelian ".str_replace("s/d","-",$apre['periode']).".xlsx"); + unset($xls); + } + + public function index() { + $form = new Form($this->app); + $tcab = $form->option_db("_", "CabID", $this->id_cab, true, false, "para_cabang", ["CabID","Nama_Cab"], "Aktif=1 ORDER BY CabID", [0,"SEMUA CABANG"]); + $tsup = $form->option_db("_", "SupID", 0, true, false, "para_supplier", ["SupID","Nama_Sup"], "Aktif=1 ORDER BY Nama_Sup", [0," "]); + $tfrom = $form->datebox("_", "Tgl_From", tgl_ymd(), true, false); + $tto = $form->datebox("_", "Tgl_To", tgl_ymd(), true, false); + $ajson['html'] = ' +
+ +
'.$tcab.'
+
+
+ +
'.$tsup.'
+
+
+ +
'.$tfrom.'
+
+
+ +
'.$tto.'
+
'; + $this->app->json($ajson); + } + +} diff --git a/app/Controller/Report/Beli/ReturController.php b/app/Controller/Report/Beli/ReturController.php new file mode 100644 index 0000000..38574a4 --- /dev/null +++ b/app/Controller/Report/Beli/ReturController.php @@ -0,0 +1,201 @@ +app = $app; + $this->db = $db; + $this->id_cab = Param::Int("CabID", 0); + $this->reg_name = $session->get('WEB_APP')['REG_NAME']; + } + + private function prepare() { + $apre = [ + 'tipe' => Param::Get("Tipe", "R"), // R or D + 'id_sup' => Param::Int("SupID", 0), + 'tgl_from' => Param::Get("Tgl_From"), + 'tgl_to' => Param::Get("Tgl_To"), + ]; + + $apre['nama_sup'] = ($apre['id_sup'] > 0) ? ($this->db->fetchField("SELECT CONCAT(Nama_Sup,' (',Kode_Sup,')') Nama FROM para_supplier WHERE SupID=?", [$apre['id_sup']]) ?? '') : ''; + + // generate report header + $apre['periode'] = $apre['tgl_from'] . ($apre['tgl_from'] !== $apre['tgl_to'] ? ' s/d '.$apre['tgl_to'] : ''); + + $tsql = ''; $asql = [tgl_sql2str($apre['tgl_from']), tgl_sql2str($apre['tgl_to'])]; + if ($this->id_cab > 0) { + $tsql .= " AND CabID=?"; + array_push($asql, $this->id_cab); + } + if ($apre['id_sup'] > 0) { + $tsql .= " AND SupID=?"; + array_push($asql, $apre['id_sup']); + } + + if ($apre['tipe'] === "R") { + $apre['query'] = $this->db->runQuery("SELECT B.*,S.Nama_Sup FROM (SELECT SupID,SUM(-Real_Beli) Total_Retur FROM inv_beli WHERE Data_Beli=0 AND (Tgl_Beli BETWEEN ? AND ?)".$tsql." GROUP BY SupID) B LEFT JOIN para_supplier S ON (B.SupID=S.SupID) ORDER BY S.Nama_Sup", $asql); + } else { + $apre['query'] = $this->db->runQuery("SELECT B.*,S.Nama_Sup,-B.Real_Beli Retur FROM (SELECT * FROM inv_beli WHERE Data_Beli=0 AND (Tgl_Beli BETWEEN ? AND ?)".$tsql.") B LEFT JOIN para_supplier S ON (B.SupID=S.SupID) ORDER BY B.No_Beli", $asql); + } + return $apre; + } + + public function print() { + $apre = $this->prepare(); + + $pre = new PrintHTML($this->app); + $pre->add_title([strtoupper($this->reg_name), ($apre['tipe']==="R"?"REKAP":"DETAIL")." RETUR PEMBELIAN", "Periode : ".$apre['periode']]); + + if ($apre['tipe'] === "R") { + $pre->add_field("No.",10,"C"); + $pre->add_field("Nama Supplier",50,"L"); + $pre->add_field("Total",20,"R","rupiah"); + + if ($apre['id_sup'] > 0) $pre->add_sub_title("Nama Supplier : ".$apre['nama_sup']); + + $pre->show_titles(); + $pre->show_headers(); + + $tot_retur = 0; $nomor = 0; + while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) { + $tot_retur += $row['Total_Retur']; + $pre->add_row([ ++$nomor, $row['Nama_Sup'], $row['Total_Retur'] ]); + } + $pre->add_span([ ["GRAND TOTAL",2,"R,B"],[$tot_retur,1,"R,B","rupiah"] ]); + + } else { + $pre->add_field("No. Nota",30,"C"); + $pre->add_field("Tgl. Nota",30,"C", "tgl_sql2str"); + $pre->add_field("Nama Supplier",50,"L"); + $pre->add_field("Total",30,"R","rupiah"); + $pre->add_field("Catatan",50,"L"); + + if ($apre['id_sup'] > 0) $pre->add_sub_title("Nama Supplier : ".$apre['nama_sup']); + + $pre->show_titles(); + $pre->show_headers(); + + $tot_retur = 0; + while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) { + $tot_retur += $row['Retur']; + $pre->add_row([ $row['No_Beli'], $row['Tgl_Beli'], $row['Nama_Sup'], $row['Retur'], $row['No_Faktur'] ]); + } + $pre->add_span([ ["GRAND TOTAL",3,"R,B"],[$tot_retur,1,"R,B","rupiah"],["nbsp;",1,"L"] ]); + } + $pre->add_stamp(1, true); + $pre->show(); + } + + public function excel() { + $apre = $this->prepare(); + $xls = new Xlsx($this->app); + $xls->set_meta([ + 'title' => "Data Retur Pembelian", + 'desc' => "Export Data Retur Pembelian" + ]); + $xls->add_title([ $this->reg_name, "DATA ".($apre['tipe']==="R"?"REKAP":"DETAIL")." RETUR PEMBELIAN", "Periode : ".$apre['periode'] ]); + + if ($apre['tipe'] === "R") { + $xls->add_field("No.", 5, "@integer"); + $xls->add_field("Nama Supplier", 25, "@text"); + $xls->add_field("Total", 15, "#,##0.00"); + $xls->add_sheet("".str_replace("s/d","-",$apre['periode'])); + + if ($apre['id_sup'] > 0) $xls->add_sub_title("Nama Supplier : ".$apre['nama_sup']); + + $xls->show_titles(); + $xls->show_headers(); + + $tot_retur = 0; $nomor = 0; + while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) { + $tot_retur += $row['Total_Retur']; + $xls->add_row([ ++$nomor, $row['Nama_Sup'], $row['Total_Retur'] ]); + } + $xls->add_row_bold([ "", "GRAND TOTAL", $tot_retur ]); + + } else { + $xls->add_field("No. Nota", 15, "@"); + $xls->add_field("Tgl. Nota", 12, "@date"); + $xls->add_field("Nama Supplier", 20, "@text"); + $xls->add_field("Total", 15, "#,##0.00"); + $xls->add_field("Catatan", 25, "@text"); + $xls->add_sheet("".str_replace("s/d","-",$apre['periode'])); + + if ($apre['id_sup'] > 0) $xls->add_sub_title("Nama Supplier : ".$apre['nama_sup']); + + $xls->show_titles(); + $xls->show_headers(); + + $tot_retur = 0; + while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) { + $tot_retur += $row['Retur']; + $xls->add_row([ $row['No_Beli'], $row['Tgl_Beli'], $row['Nama_Sup'], $row['Retur'], $row['No_Faktur'] ]); + } + $xls->add_row_bold([ "", "", "GRAND TOTAL", $tot_retur, "" ]); + } + $xls->add_stamp(1, true); + $xls->download("Data Retur Pembelian ".str_replace("s/d","-",$apre['periode']).".xlsx"); + unset($xls); + } + + public function index() { + $form = new Form($this->app); + $ttipe = $form->radio("_", "Tipe", "R", true, false, ["R"=>"Rekap","D"=>"Detail"]); + $tcab = $form->option_db("_", "CabID", $this->id_cab, true, false, "para_cabang", ["CabID","Nama_Cab"], "Aktif=1 ORDER BY CabID", [0,"SEMUA CABANG"]); + $tsup = $form->option_db("_", "SupID", 0, true, false, "para_supplier", ["SupID","Nama_Sup"], "Aktif=1 ORDER BY Nama_Sup", [0,"SEMUA SUPPLIER"]); + $tfrom = $form->datebox("_", "Tgl_From", tgl_ymd(), true, false); + $tto = $form->datebox("_", "Tgl_To", tgl_ymd(), true, false); + $ajson['html'] = ' +
+ +
'.$ttipe.'
+
+
+ +
'.$tcab.'
+
+
+ +
'.$tsup.'
+
+
+ +
'.$tfrom.'
+
+
+ +
'.$tto.'
+
'; + $this->app->json($ajson); + } + +} diff --git a/app/Controller/Report/Dana/KeluarController.php b/app/Controller/Report/Dana/KeluarController.php new file mode 100644 index 0000000..38948ed --- /dev/null +++ b/app/Controller/Report/Dana/KeluarController.php @@ -0,0 +1,181 @@ +app = $app; + $this->db = $db; + $this->id_cab = Param::Int("CabID", 0); + $this->reg_name = $session->get('WEB_APP')['REG_NAME']; + } + + private function prepare() { + $apre = [ + 'tipe' => Param::Get("Tipe", "R"), // R or D + 'tgl_from' => Param::Get("Tgl_From"), + 'tgl_to' => Param::Get("Tgl_To"), + ]; + + // generate report header + $apre['periode'] = $apre['tgl_from'] . ($apre['tgl_from'] !== $apre['tgl_to'] ? ' s/d '.$apre['tgl_to'] : ''); + + $tsql = ''; $asql = [tgl_sql2str($apre['tgl_from']), tgl_sql2str($apre['tgl_to'])]; + if ($this->id_cab > 0) { + $tsql .= " AND CabID=?"; + array_push($asql, $this->id_cab); + } + + if ($apre['tipe'] === "R") { + $apre['query'] = $this->db->runQuery("SELECT Tgl_Bayar,SUM(Total_Bayar) Total_Bayar,'' Tipe_Bayar FROM inv_beli_lunas WHERE (Tgl_Bayar BETWEEN ? AND ?)".$tsql." GROUP BY Tgl_Bayar ORDER BY Tgl_Bayar", $asql); + } else { + $apre['query'] = $this->db->runQuery("SELECT L.*,S.Nama_Sup,'' Tipe_Bayar FROM (SELECT * FROM inv_beli_lunas WHERE (Tgl_Bayar BETWEEN ? AND ?)".$tsql.") L LEFT JOIN inv_beli B ON (B.No_Beli=L.No_Beli) LEFT JOIN para_supplier S ON (S.SupID=B.SupID) ORDER BY L.Tgl_Bayar", $asql); + } + return $apre; + } + + public function print() { + $apre = $this->prepare(); + + $pre = new PrintHTML($this->app); + $pre->add_title([strtoupper($this->reg_name), ($apre['tipe']==="R"?"REKAP":"DETAIL")." PENGELUARAN", "Periode : ".$apre['periode']]); + + if ($apre['tipe'] === "R") { + $pre->add_field("No.",10,"C"); + $pre->add_field("Tanggal",30,"C", "tgl_sql2str"); + $pre->add_field("Tipe / Giro",20,"L"); + $pre->add_field("Jumlah",20,"R","rupiah"); + + $pre->show_titles(); + $pre->show_headers(); + + $tot_bayar = 0; $nomor = 0; + while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) { + $tot_bayar += $row['Total_Bayar']; + $pre->add_row([ ++$nomor, $row['Tgl_Bayar'], $row['Tipe_Bayar'], $row['Total_Bayar'] ]); + } + $pre->add_span([ ["GRAND TOTAL",3,"R,B"],[$tot_bayar,1,"R,B","rupiah"] ]); + + } else { + $pre->add_field("Tanggal",30,"C", "tgl_sql2str"); + $pre->add_field("Bayar Kepada",50,"L"); + $pre->add_field("Tipe / Giro",20,"L"); + $pre->add_field("Jumlah",30,"R","rupiah"); + + $pre->show_titles(); + $pre->show_headers(); + + $tot_bayar = 0; + while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) { + $tot_bayar += $row['Total_Bayar']; + $pre->add_row([ $row['Tgl_Bayar'], $row['No_Beli']." - ".$row['Nama_Sup'], $row['Tipe_Bayar'], $row['Total_Bayar'] ]); + } + $pre->add_span([ ["GRAND TOTAL",3,"R,B"],[$tot_bayar,1,"R,B","rupiah"] ]); + } + $pre->add_stamp(1, true); + $pre->show(); + } + + public function excel() { + $apre = $this->prepare(); + $xls = new Xlsx($this->app); + $xls->set_meta([ + 'title' => "Data Penerimaan Dana", + 'desc' => "Export Data Penerimaan Dana" + ]); + $xls->add_title([ $this->reg_name, "DATA ".($apre['tipe']==="R"?"REKAP":"DETAIL")." PENGELUARAN", "Periode : ".$apre['periode'] ]); + + if ($apre['tipe'] === "R") { + $xls->add_field("No.", 5, "@integer"); + $xls->add_field("Tanggal", 12, "@date"); + $xls->add_field("Tipe / Giro", 20, "@text"); + $xls->add_field("Jumlah", 15, "#,##0.00"); + $xls->add_sheet("".str_replace("s/d","-",$apre['periode'])); + + $xls->show_titles(); + $xls->show_headers(); + + $tot_bayar = 0; $nomor = 0; + while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) { + $tot_bayar += $row['Total_Bayar']; + $xls->add_row([ ++$nomor, $row['Tgl_Bayar'], $row['Tipe_Bayar'], $row['Total_Bayar'] ]); + } + $xls->add_row_bold([ "", "", "GRAND TOTAL", $tot_bayar ]); + + } else { + $xls->add_field("Tanggal", 12, "@date"); + $xls->add_field("Bayar Kepada", 25, "@text"); + $xls->add_field("Tipe / Giro", 20, "@text"); + $xls->add_field("Jumlah", 15, "#,##0.00"); + $xls->add_sheet("".str_replace("s/d","-",$apre['periode'])); + + $xls->show_titles(); + $xls->show_headers(); + + $tot_bayar = 0; + while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) { + $tot_bayar += $row['Total_Bayar']; + $xls->add_row([ $row['Tgl_Bayar'], $row['No_Beli']." - ".$row['Nama_Sup'], $row['Tipe_Bayar'], $row['Total_Bayar'] ]); + } + $xls->add_row_bold([ "", "", "GRAND TOTAL", $tot_bayar ]); + } + $xls->add_stamp(1, true); + $xls->download("Data Pengeluaran ".str_replace("s/d","-",$apre['periode']).".xlsx"); + unset($xls); + } + + public function index() { + $form = new Form($this->app); + $ttipe = $form->radio("_", "Tipe", "R", true, false, ["R"=>"Rekap","D"=>"Detail"]); + $tcab = $form->option_db("_", "CabID", $this->id_cab, true, false, "para_cabang", ["CabID","Nama_Cab"], "Aktif=1 ORDER BY CabID", [0,"SEMUA CABANG"]); + $tfrom = $form->datebox("_", "Tgl_From", tgl_ymd(), true, false); + $tto = $form->datebox("_", "Tgl_To", tgl_ymd(), true, false); + $ajson['html'] = ' +
+ +
'.$ttipe.'
+
+
+ +
'.$tcab.'
+
+
+ +
'.$tfrom.'
+
+
+ +
'.$tto.'
+
'; + $this->app->json($ajson); + } + +} diff --git a/app/Controller/Report/Dana/MasukController.php b/app/Controller/Report/Dana/MasukController.php new file mode 100644 index 0000000..1fc82aa --- /dev/null +++ b/app/Controller/Report/Dana/MasukController.php @@ -0,0 +1,181 @@ +app = $app; + $this->db = $db; + $this->id_cab = Param::Int("CabID", 0); + $this->reg_name = $session->get('WEB_APP')['REG_NAME']; + } + + private function prepare() { + $apre = [ + 'tipe' => Param::Get("Tipe", "R"), // R or D + 'tgl_from' => Param::Get("Tgl_From"), + 'tgl_to' => Param::Get("Tgl_To"), + ]; + + // generate report header + $apre['periode'] = $apre['tgl_from'] . ($apre['tgl_from'] !== $apre['tgl_to'] ? ' s/d '.$apre['tgl_to'] : ''); + + $tsql = ''; $asql = [tgl_sql2str($apre['tgl_from']), tgl_sql2str($apre['tgl_to'])]; + if ($this->id_cab > 0) { + $tsql .= " AND CabID=?"; + array_push($asql, $this->id_cab); + } + + if ($apre['tipe'] === "R") { + $apre['query'] = $this->db->runQuery("SELECT Tgl_Bayar,SUM(Total_Bayar) Total_Bayar,'' Tipe_Bayar FROM inv_jual_lunas WHERE (Tgl_Bayar BETWEEN ? AND ?)".$tsql." GROUP BY Tgl_Bayar ORDER BY Tgl_Bayar", $asql); + } else { + $apre['query'] = $this->db->runQuery("SELECT L.*,U.Nama_Member,'' Tipe_Bayar FROM (SELECT * FROM inv_jual_lunas WHERE (Tgl_Bayar BETWEEN ? AND ?)".$tsql.") L LEFT JOIN para_member U ON (U.MemberID=L.MemberID) ORDER BY L.Tgl_Bayar", $asql); + } + return $apre; + } + + public function print() { + $apre = $this->prepare(); + + $pre = new PrintHTML($this->app); + $pre->add_title([strtoupper($this->reg_name), ($apre['tipe']==="R"?"REKAP":"DETAIL")." PENERIMAAN", "Periode : ".$apre['periode']]); + + if ($apre['tipe'] === "R") { + $pre->add_field("No.",10,"C"); + $pre->add_field("Tanggal",30,"C", "tgl_sql2str"); + $pre->add_field("Tipe / Giro",20,"L"); + $pre->add_field("Jumlah",20,"R","rupiah"); + + $pre->show_titles(); + $pre->show_headers(); + + $tot_bayar = 0; $nomor = 0; + while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) { + $tot_bayar += $row['Total_Bayar']; + $pre->add_row([ ++$nomor, $row['Tgl_Bayar'], $row['Tipe_Bayar'], $row['Total_Bayar'] ]); + } + $pre->add_span([ ["GRAND TOTAL",3,"R,B"],[$tot_bayar,1,"R,B","rupiah"] ]); + + } else { + $pre->add_field("Tanggal",30,"C", "tgl_sql2str"); + $pre->add_field("Terima Dari",50,"L"); + $pre->add_field("Tipe / Giro",20,"L"); + $pre->add_field("Jumlah",30,"R","rupiah"); + + $pre->show_titles(); + $pre->show_headers(); + + $tot_bayar = 0; + while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) { + $tot_bayar += $row['Total_Bayar']; + $pre->add_row([ $row['Tgl_Bayar'], $row['No_Jual']." - ".$row['Nama_Member'], $row['Tipe_Bayar'], $row['Total_Bayar'] ]); + } + $pre->add_span([ ["GRAND TOTAL",3,"R,B"],[$tot_bayar,1,"R,B","rupiah"] ]); + } + $pre->add_stamp(1, true); + $pre->show(); + } + + public function excel() { + $apre = $this->prepare(); + $xls = new Xlsx($this->app); + $xls->set_meta([ + 'title' => "Data Pengeluaran Dana", + 'desc' => "Export Data Pengeluaran Dana" + ]); + $xls->add_title([ $this->reg_name, "DATA ".($apre['tipe']==="R"?"REKAP":"DETAIL")." PENERIMAAN", "Periode : ".$apre['periode'] ]); + + if ($apre['tipe'] === "R") { + $xls->add_field("No.", 5, "@integer"); + $xls->add_field("Tanggal", 12, "@date"); + $xls->add_field("Tipe / Giro", 20, "@text"); + $xls->add_field("Jumlah", 15, "#,##0.00"); + $xls->add_sheet("".str_replace("s/d","-",$apre['periode'])); + + $xls->show_titles(); + $xls->show_headers(); + + $tot_bayar = 0; $nomor = 0; + while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) { + $tot_bayar += $row['Total_Bayar']; + $xls->add_row([ ++$nomor, $row['Tgl_Bayar'], $row['Tipe_Bayar'], $row['Total_Bayar'] ]); + } + $xls->add_row_bold([ "", "", "GRAND TOTAL", $tot_bayar ]); + + } else { + $xls->add_field("Tanggal", 12, "@date"); + $xls->add_field("Terima Dari", 25, "@text"); + $xls->add_field("Tipe / Giro", 20, "@text"); + $xls->add_field("Jumlah", 15, "#,##0.00"); + $xls->add_sheet("".str_replace("s/d","-",$apre['periode'])); + + $xls->show_titles(); + $xls->show_headers(); + + $tot_bayar = 0; + while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) { + $tot_bayar += $row['Total_Bayar']; + $xls->add_row([ $row['Tgl_Bayar'], $row['No_Jual']." - ".$row['Nama_Member'], $row['Tipe_Bayar'], $row['Total_Bayar'] ]); + } + $xls->add_row_bold([ "", "", "GRAND TOTAL", $tot_bayar ]); + } + $xls->add_stamp(1, true); + $xls->download("Data Penerimaan ".str_replace("s/d","-",$apre['periode']).".xlsx"); + unset($xls); + } + + public function index() { + $form = new Form($this->app); + $ttipe = $form->radio("_", "Tipe", "R", true, false, ["R"=>"Rekap","D"=>"Detail"]); + $tcab = $form->option_db("_", "CabID", $this->id_cab, true, false, "para_cabang", ["CabID","Nama_Cab"], "Aktif=1 ORDER BY CabID", [0,"SEMUA CABANG"]); + $tfrom = $form->datebox("_", "Tgl_From", tgl_ymd(), true, false); + $tto = $form->datebox("_", "Tgl_To", tgl_ymd(), true, false); + $ajson['html'] = ' +
+ +
'.$ttipe.'
+
+
+ +
'.$tcab.'
+
+
+ +
'.$tfrom.'
+
+
+ +
'.$tto.'
+
'; + $this->app->json($ajson); + } + +} diff --git a/app/Controller/Report/Dana/PosController.php b/app/Controller/Report/Dana/PosController.php new file mode 100644 index 0000000..e4de7be --- /dev/null +++ b/app/Controller/Report/Dana/PosController.php @@ -0,0 +1,280 @@ +app = $app; + $this->db = $db; + $this->app_inv = (array) $session->get('APP_INV'); + $this->reg_name = $session->get('WEB_APP')['REG_NAME']; + $this->id_cab = Param::Int("CabID", $session->get('APP_INV')['CABANGID']); + } + + private function prepare(bool $is_pos = false) { + $apre = [ + 'tipe' => Param::Get("Tipe", "R"), // R or D + 'id_kasir' => Param::Int("KasirID", 0), + 'tgl_from' => Param::Get("Tgl_From"), + 'tgl_to' => Param::Get("Tgl_To"), + ]; + + // generate report header + $apre['periode'] = $apre['tgl_from'] . ($apre['tgl_from'] !== $apre['tgl_to'] ? ' s/d '.$apre['tgl_to'] : ''); + + $tsql = ''; $asql = [tgl_sql2str($apre['tgl_from']), tgl_sql2str($apre['tgl_to'])]; + if ($this->id_cab > 0) { + $tsql .= " AND CabID=?"; + array_push($asql, $this->id_cab); + } + if ($apre['id_kasir'] > 0) { + $tsql .= " AND UserID=?"; + array_push($asql, $apre['id_kasir']); + } + + if ($is_pos === true) { + $apre['kasir'] = $this->db->fetchRow("SELECT * FROM app_operator WHERE UserID=?", [$apre['id_kasir']]); + $apre['query'] = $this->db->runQuery("SELECT J.KartuID,IF(J.KartuID=0,'Cash / Uang Tunai',K.Nama_Kartu) Kartu,SUM(IF(J.Kode='J',J.Total_Jual,0)) Total_Jual,SUM(IF(J.Kode='P',J.Total_Jual,0)) Total_Pulsa,SUM(J.Total_Diskon) Total_Diskon,SUM(J.Total_Potong) Total_Potong,SUM(J.Total_Cash) Total_Cash,SUM(J.Total_Kartu) Total_Kartu FROM ((SELECT 'J' Kode,KartuID,SUM(Total_Jual) Total_Jual,SUM(Total_Jual-Total_Kartu-Total_Diskon-Total_Potong) Total_Cash,SUM(Total_Kartu) Total_Kartu,SUM(Total_Diskon) Total_Diskon,SUM(Total_Potong) Total_Potong FROM inv_jual WHERE (Tgl_Jual BETWEEN ? AND ?)".$tsql." GROUP BY KartuID ORDER BY KartuID) UNION ALL (SELECT 'P' Kode,KartuID,SUM(Harga_Jual) Total_Jual,SUM(Harga_Jual-Total_Kartu) Total_Cash,SUM(Total_Kartu) Total_Kartu,0 Total_Diskon,0 Total_Potong FROM ppob_tx WHERE (Tgl_TX BETWEEN ? AND ?) AND Status=4".$tsql." GROUP BY KartuID ORDER BY KartuID)) J LEFT JOIN para_rek_pos K ON (J.KartuID=K.KartuID) GROUP BY J.KartuID ORDER BY J.KartuID", array_merge($asql, $asql)); + return $apre; + } + + if ($apre['tipe'] === "R") { + $apre['query'] = $this->db->runQuery("SELECT O.UserID,O.Nama Nama_Kasir,SUM(IF(J.Kode='J',J.Total_Jual,0)) Total_Jual,SUM(IF(J.Kode='P',J.Total_Jual,0)) Total_Pulsa,SUM(IF(J.KartuID=0,J.Total_Jual-J.Total_Kartu-J.Total_Potong,0)) Total_Cash,SUM(J.Total_Kartu) Total_Kartu,SUM(J.Total_Potong) Total_Potong FROM ((SELECT 'J' Kode,UserID,KartuID,SUM(Total_Jual-Total_Diskon) Total_Jual,SUM(Total_Kartu) Total_Kartu,SUM(Total_Potong) Total_Potong FROM inv_jual WHERE (Tgl_Jual BETWEEN ? AND ?)".$tsql." GROUP BY UserID,KartuID ORDER BY UserID,KartuID) UNION ALL (SELECT 'P' Kode,UserID,KartuID,SUM(Harga_Jual) Total_Jual,SUM(Total_Kartu) Total_Kartu,0 Total_Potong FROM ppob_tx WHERE (Tgl_TX BETWEEN ? AND ?) AND Status=4".$tsql." GROUP BY UserID,KartuID ORDER BY UserID,KartuID)) J LEFT JOIN app_operator O ON (J.UserID=O.UserID) GROUP BY J.UserID", array_merge($asql, $asql)); + } else { + $apre['query'] = $this->db->runQuery("SELECT J.*,O.Nama Nama_Kasir FROM (SELECT *,Total_Jual-Total_Diskon Total_Jual2,Total_Jual-Total_Kartu-Total_Diskon-Total_Potong Total_Cash FROM inv_jual WHERE (Tgl_Jual BETWEEN ? AND ?)".$tsql.") J LEFT JOIN app_operator O ON (J.UserID=O.UserID) ORDER BY J.No_Jual", $asql); + } + return $apre; + } + + public function pos() { + $apre = $this->prepare(true); + + $tot_jual = 0; $tot_pulsa = 0; $tot_diskon = 0; $tot_potong = 0; $tot_dana = 0; $adana = [["Cash / Uang Tunai",0]]; + while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) { + $adana[0][1] += $row['Total_Cash']; + if ($row['KartuID'] > 0) $adana[$row['KartuID']] = [$row['Kartu'], $row['Total_Kartu']]; + $tot_jual += $row['Total_Jual']; + $tot_pulsa += $row['Total_Pulsa']; + $tot_diskon += $row['Total_Diskon']; + $tot_potong += $row['Total_Potong']; + } + $tot_dana = $tot_jual + $tot_pulsa - $tot_potong - $tot_diskon; + + $pre = new PrintPOS($this->app); + $pre->set_fontsize(2);//thermal + $pre->set_header_logo("logo-nota.png");//thermal + if ($this->app_inv['PRINT_OPENCD'] === 1) $pre->set_opendrawer(); + if ($this->app_inv['PRINT_AUTOCUT'] === 1) $pre->set_cutpaper(); + $pre->add_empty(); + + $pre->addc("REKAP PENERIMAAN KASIR / POS"); + $pre->addc("Periode : ".$apre['periode']); + $pre->add_empty(); + $pre->add("Username : ".$apre['kasir']['Username']); + $pre->add("Kasir : ".$apre['kasir']['Nama']); + $pre->add_empty(); + $pre->add(["Jumlah Penjualan Rp.",24], [rupiah($tot_jual),16,"R"]); + $pre->add(["Jumlah Pulsa & PPOB Rp.",24], [rupiah($tot_pulsa),16,"R"]); + $pre->add(["Jumlah Diskon Rp.",24], [rupiah($tot_diskon),16,"R"]); + if ($tot_potong > 0) $pre->add(["Jumlah Promo Rp.",24], [rupiah($tot_potong),16,"R"]); + $pre->add_line("-"); + if (count($adana) > 1) { + foreach ($adana as $_val) $pre->add([$_val[0],21,"L"], ["Rp.",3], [rupiah($_val[1]),16,"R"]); + $pre->add_line("-"); + } + $pre->add(["TOTAL PENERIMAAN Rp.",24], [rupiah($tot_dana),16,"R"]); + $pre->add_line("="); + $pre->add_stamp(1, false); + $pre->add_empty($this->app_inv['PRINT_ROW']); + $pre->show(); + } + + public function print() { + $apre = $this->prepare(); + + $pre = new PrintHTML($this->app); + $pre->add_title([strtoupper($this->reg_name), ($apre['tipe']==="R"?"REKAP":"DETAIL")." PENERIMAAN KASIR / POS", "Periode : ".$apre['periode']]); + + if ($apre['tipe'] === "R") { + $pre->add_field("No.",10,"C"); + $pre->add_field("Nama Kasir",20,"L"); + $pre->add_field("Penjualan",20,"R","rupiah"); + $pre->add_field("Pulsa & PPOB",20,"R","rupiah"); + $pre->add_field("Promo",20,"R","rupiah"); + $pre->add_field("Tunai / Cash",20,"R","rupiah"); + $pre->add_field("Non Tunai",20,"R","rupiah"); + + $pre->show_titles(); + $pre->show_headers(); + + $tot_jual = 0; $tot_pulsa = 0; $tot_potong = 0; $tot_cash = 0; $tot_kartu = 0; $nomor = 0; + while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) { + $tot_jual += $row['Total_Jual']; + $tot_pulsa += $row['Total_Pulsa']; + $tot_potong += $row['Total_Potong']; + $tot_cash += $row['Total_Cash']; + $tot_kartu += $row['Total_Kartu']; + $pre->add_row([ ++$nomor, $row['Nama_Kasir'], $row['Total_Jual'], $row['Total_Pulsa'], $row['Total_Potong'], $row['Total_Cash'], $row['Total_Kartu'] ]); + } + $pre->add_span([ ["GRAND TOTAL",2,"R,B"],[$tot_jual,1,"R,B","rupiah"],[$tot_pulsa,1,"R,B","rupiah"],[$tot_potong,1,"R,B","rupiah"],[$tot_cash,1,"R,B","rupiah"],[$tot_kartu,1,"R,B","rupiah"] ]); + + } else { + $pre->add_field("No. Nota",30,"C"); + $pre->add_field("Tanggal",30,"C", "tgl_sql2str"); + $pre->add_field("Penjualan",30,"R","rupiah"); + $pre->add_field("Promo",30,"R","rupiah"); + $pre->add_field("Tunai / Cash",30,"R","rupiah"); + $pre->add_field("Non Tunai",30,"R","rupiah"); + $pre->add_field("Kasir",20,"L"); + + $pre->show_titles(); + $pre->show_headers(); + + $tot_jual = 0; $tot_cash = 0; $tot_kartu = 0; $tot_potong = 0; + while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) { + $tot_jual += $row['Total_Jual']; + $tot_cash += $row['Total_Cash']; + $tot_kartu += $row['Total_Kartu']; + $tot_potong += $row['Total_Potong']; + $pre->add_row([ $row['No_Jual'], $row['Tgl_Jual'], $row['Total_Jual2'], $row['Total_Potong'], $row['Total_Cash'], $row['Total_Kartu'], $row['Nama_Kasir'] ]); + } + $pre->add_span([ ["GRAND TOTAL",2,"R,B"],[$tot_jual,1,"R,B","rupiah"],[$tot_potong,1,"R,B","rupiah"],[$tot_cash,1,"R,B","rupiah"],[$tot_kartu,1,"R,B","rupiah"] ]); + } + $pre->add_stamp(1, true); + $pre->show(); + } + + public function excel() { + $apre = $this->prepare(); + $xls = new Xlsx($this->app); + $xls->set_meta([ + 'title' => "Data Penerimaan POS / Kasir", + 'desc' => "Export Data Penerimaan POS / Kasir" + ]); + $xls->add_title([ $this->reg_name, "DATA ".($apre['tipe']==="R"?"REKAP":"DETAIL")." PENERIMAAN POS / KASIR", "Periode : ".$apre['periode'] ]); + + if ($apre['tipe'] === "R") { + $xls->add_field("No.", 5, "@integer"); + $xls->add_field("Nama Kasir", 20, "@text"); + $xls->add_field("Penjualan", 15, "#,##0.00"); + $xls->add_field("Pulsa & PPOB", 15, "#,##0.00"); + $xls->add_field("Promo", 15, "#,##0.00"); + $xls->add_field("Tunai", 15, "#,##0.00"); + $xls->add_field("Non Tunai", 15, "#,##0.00"); + $xls->add_sheet("".str_replace("s/d","-",$apre['periode'])); + + $xls->show_titles(); + $xls->show_headers(); + + $tot_jual = 0; $tot_pulsa = 0; $tot_potong = 0; $tot_cash = 0; $tot_kartu = 0; $nomor = 0; + while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) { + $tot_jual += $row['Total_Jual']; + $tot_pulsa += $row['Total_Pulsa']; + $tot_potong += $row['Total_Potong']; + $tot_cash += $row['Total_Cash']; + $tot_kartu += $row['Total_Kartu']; + $xls->add_row([ ++$nomor, $row['Nama_Kasir'], $row['Total_Jual'], $row['Total_Pulsa'], $row['Total_Potong'], $row['Total_Cash'], $row['Total_Kartu'] ]); + } + $xls->add_row_bold([ "", "GRAND TOTAL", $tot_jual, $tot_pulsa, $tot_potong, $tot_cash, $tot_kartu ]); + + } else { + $xls->add_field("No. Nota", 12, "@text"); + $xls->add_field("Tanggal", 12, "@date"); + $xls->add_field("Penjualan", 15, "#,##0.00"); + $xls->add_field("Promo", 15, "#,##0.00"); + $xls->add_field("Tunai / Cash", 15, "#,##0.00"); + $xls->add_field("Non Tunai", 15, "#,##0.00"); + $xls->add_field("Kasir", 20, "@text"); + $xls->add_sheet("".str_replace("s/d","-",$apre['periode'])); + + $xls->show_titles(); + $xls->show_headers(); + + $tot_jual = 0; $tot_cash = 0; $tot_kartu = 0; $tot_potong = 0; + while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) { + $tot_jual += $row['Total_Jual']; + $tot_cash += $row['Total_Cash']; + $tot_kartu += $row['Total_Kartu']; + $tot_potong += $row['Total_Potong']; + $xls->add_row([ $row['No_Jual'], $row['Tgl_Jual'], $row['Total_Jual2'], $row['Total_Potong'], $row['Total_Cash'], $row['Total_Kartu'], $row['Nama_Kasir'] ]); + } + $xls->add_row_bold([ "", "GRAND TOTAL", $tot_jual, $tot_potong, $tot_cash, $tot_kartu, "" ]); + } + $xls->add_stamp(1, true); + $xls->download("Data Penerimaan POS ".str_replace("s/d","-",$apre['periode']).".xlsx"); + unset($xls); + } + + public function index() { + if ($this->app->user()->is_level(1)) { + $this->id_cab = 0; + $id_kasir = 0; + $tsql1 = ''; + $tsql2 = ' AND Level>="'.$this->app->user()->level().'"'; + if ($this->app->user()->id() > 1) $tsql2 .= ' AND UserID>1'; + } else { + $id_kasir = $this->app->user()->id(); + $tsql1 = ' AND CabID="'.$this->id_cab.'"'; + $tsql2 = ' AND UserID="'.$this->app->user()->id().'"'; + } + $form = new Form($this->app); + $ttipe = $form->radio("_", "Tipe", "R", true, false, ["R"=>"Rekap","D"=>"Detail"]); + $tcab = $form->option_db("_", "CabID", $this->id_cab, true, false, "para_cabang", ["CabID","Nama_Cab"], "Aktif=1".$tsql1." ORDER BY CabID", [0,"SEMUA CABANG"]); + $tkasir = $form->option_db("_", "KasirID", $id_kasir, true, false, "app_operator", ["UserID","Nama"], "Aktif=1".$tsql2." ORDER BY Username", [0,"SEMUA KASIR"]); + $tfrom = $form->datebox("_", "Tgl_From", tgl_ymd(), true, false); + $tto = $form->datebox("_", "Tgl_To", tgl_ymd(), true, false); + $ajson['html'] = ' +
+ +
'.$ttipe.'
+
+
+ +
'.$tcab.'
+
+
+ +
'.$tkasir.'
+
+
+ +
'.$tfrom.'
+
+
+ +
'.$tto.'
+
'; + $this->app->json($ajson); + } + +} diff --git a/app/Controller/Report/Gel/BulanneracaController.php b/app/Controller/Report/Gel/BulanneracaController.php new file mode 100644 index 0000000..9db2b40 --- /dev/null +++ b/app/Controller/Report/Gel/BulanneracaController.php @@ -0,0 +1,192 @@ +app = $app; + $this->db = $db; + $this->app_gel = (array) $session->get('APP_GEL'); + $this->reg_name = $session->get('WEB_APP')['REG_NAME']; + $this->gel = new Gel($app); + } + + private function prepare() { + $apre = [ + 'tipe' => Param::Int("Tipe"), // 1: rekap, 2: bulanan + 'bulan' => Param::Int("Bulan"), + 'tahun' => Param::Int("Tahun"), + 'level' => Param::Int("Level"), + ]; + $tgl_akhir = tgl_akhbln("01-".isi_nol($apre['bulan'],2)."-".(string) $apre['tahun']); + + // generate report header + $apre['periode'] = '01-'.($apre['tipe'] === 2 ? isi_nol($apre['bulan'],2) : '01').'-'.(string) $apre['tahun'].' s/d '.$tgl_akhir; + + $apre['data'] = $this->gel->Saldo($tgl_akhir, $apre['tipe'], $apre['level']); + return $apre; + } + + public function print() { + $apre = $this->prepare(); + + $pre = new PrintHTML($this->app); + $pre->add_title([strtoupper($this->reg_name), "NERACA", "Periode : ".$apre['periode']]); + + $pre->add_field("Keterangan",150,"L"); + for ($i=0; $i<$apre['level']; $i++) { + $pre->add_field("Jumlah ".(string) $i,50,"R","rupiah"); + } + + $pre->show_titles(); + $pre->show_headers(true); + + $tot_aktiva = 0; $strpad = "   "; + $pre->add_span([ ["A. AKTIVA",($apre['level']+1),"L,B"] ]); + foreach ($apre['data'] as $row) { + if ($row['Grup_RekID'] === 1 && !($row['Mode'] === "D" && $row['Jumlah'] === 0) && $row['Level'] > 1) { + $njum = $row['Jumlah']; + $temp_array = [str_repeat($strpad, ($row['Level']-1))." ".$row['Nama_Rek']]; + for ($i=($apre['level']+1); $i>1; $i--) { + $temp_array[] = ($row['Level'] === $i) ? $njum : ""; + } + $pre->add_row($temp_array); + if ($row['Level'] === 2) $tot_aktiva += $njum; + } + } + $pre->add_span([ ["JUMLAH AKTIVA",$apre['level'],"L,B"],[$tot_aktiva,1,"R,B","rupiah"] ]); + + $pre->add_row([ "" ]); + $pre->add_span([ ["B. PASIVA",($apre['level']+1),"L,B"] ]); + $tot_pasiva = 0; + foreach ($apre['data'] as $row) { + if (($row['Grup_RekID'] === 2 || $row['Grup_RekID'] === 3) && !($row['Mode'] === "D" && $row['Jumlah'] === 0)) { + $njum = $row['Jumlah'] * -1; + $temp_array = [str_repeat($strpad, $row['Level'])." ".$row['Nama_Rek']]; + for ($i=$apre['level']; $i>0; $i--) { + $temp_array[] = ($row['Level'] === $i) ? $njum : ""; + } + $pre->add_row($temp_array); + if ($row['Level'] === 1) $tot_pasiva += $njum; + } + } + $pre->add_span([ ["JUMLAH PASIVA",$apre['level'],"L,B"], [$tot_pasiva,1,"R,B","rupiah"] ]); + + $pre->add_stamp(1, true); + $pre->show(); + } + + public function excel() { + $apre = $this->prepare(); + $xls = new Xlsx($this->app); + $xls->set_meta([ + 'title' => "Data Neraca", + 'desc' => "Export Data Neraca" + ]); + $xls->add_title([ $this->reg_name, "NERACA", "Periode : ".$apre['periode'] ]); + + $xls->add_field("Keterangan", 50, "@text"); + for ($i=0; $i<$apre['level']; $i++) { + $xls->add_field("Jumlah ".(string) $i, 20, "#,##0.00"); + } + $xls->add_sheet("".str_replace("s/d","-",$apre['periode'])); + + $xls->show_titles(); + $xls->show_headers(true); + + $tot_aktiva = 0; $strpad = " "; + $xls->add_row_bold([ "A. AKTIVA" ]); + foreach ($apre['data'] as $row) { + if ($row['Grup_RekID'] === 1 && !($row['Mode'] === "D" && $row['Jumlah'] === 0) && $row['Level'] > 1) { + $njum = $row['Jumlah']; + $temp_array = [str_repeat($strpad, ($row['Level']-1))." ".$row['Nama_Rek']]; + for ($i=($apre['level']+1); $i>1; $i--) { + $temp_array[] = ($row['Level'] === $i) ? $njum : ""; + } + $xls->add_row($temp_array); + if ($row['Level'] === 2) $tot_aktiva += $njum; + } + } + $_sjudul = ["JUMLAH AKTIVA"]; + for ($i=0; $i<($apre['level']-1); $i++) $_sjudul[] = ""; + $_sjudul[] = $tot_aktiva; + $xls->add_row_bold($_sjudul); + + $xls->add_row([ "" ]); + $xls->add_row([ "B. PASIVA" ]); + $tot_pasiva = 0; + foreach ($apre['data'] as $row) { + if (($row['Grup_RekID'] === 2 || $row['Grup_RekID'] === 3) && !($row['Mode'] === "D" && $row['Jumlah'] === 0)) { + $njum = $row['Jumlah'] * -1; + $temp_array = [str_repeat($strpad, $row['Level'])." ".$row['Nama_Rek']]; + for ($i=$apre['level']; $i>0; $i--) { + $temp_array[] = ($row['Level'] === $i) ? $njum : ""; + } + $xls->add_row($temp_array); + if ($row['Level'] === 1) $tot_pasiva += $njum; + } + } + $_sjudul = ["JUMLAH PASIVA"]; + for ($i=0; $i<($apre['level']-1); $i++) $_sjudul[] = ""; + $_sjudul[] = $tot_pasiva; + $xls->add_row_bold($_sjudul); + + $xls->add_stamp(1, true); + $xls->download("Data Neraca ".str_replace("s/d","-",$apre['periode']).".xlsx"); + unset($xls); + } + + public function index() { + $alevel = []; for ($i=2; $i<=($this->app_gel['MAX_LEVEL']-1); $i++) $alevel[$i] = "Level ".$i; + $form = new Form($this->app); + $ttipe = $form->radio("_", "Tipe", 1, true, false, [1=>"Akumulasi", 2=>"Bulanan"]); + $tbulan = $form->option("_", "Bulan", date("n"), true, false, bulan_array()); + $ttahun = $form->option("_", "Tahun", date("Y"), true, false, $this->gel->Tahun_Array()); + $tlevel = $form->option("_", "Level", 3, true, false, $alevel); + $this->app->json([ 'html' => ' +
+ +
'.$ttipe.'
+
+
+ +
'.$tbulan.$ttahun.'
+
+
+ +
'.$tlevel.'
+
' + ]); + } + +} diff --git a/app/Controller/Report/Gel/BulanrlcabController.php b/app/Controller/Report/Gel/BulanrlcabController.php new file mode 100644 index 0000000..6997a95 --- /dev/null +++ b/app/Controller/Report/Gel/BulanrlcabController.php @@ -0,0 +1,169 @@ +app = $app; + $this->db = $db; + $this->reg_name = $session->get('WEB_APP')['REG_NAME']; + $this->rek_hpp = (string) $session->get('APP_GEL')['HPP']; + $this->id_cab = Param::Int("CabID", 0); + $this->gel = new Gel($app); + } + + private function prepare() { + $apre = [ + 'bulan1' => Param::Int("Bulan1"), + 'bulan2' => Param::Int("Bulan2"), + 'tahun' => Param::Int("Tahun"), + ]; + $tgl_akhir = tgl_akhbln("01-".isi_nol($apre['bulan2'],2)."-".(string) $apre['tahun']); + + $apre['nama_cab'] = ($this->id_cab > 0) ? ($this->db->fetchField("SELECT Nama_Cab FROM para_cabang WHERE CabID=?", [$this->id_cab]) ?? '') : ''; + + // generate report header + $apre['periode'] = '01-'.isi_nol($apre['bulan1'],2).'-'.(string) $apre['tahun'].' s/d '.$tgl_akhir; + + $tsql = ''; $asql = [$apre['tahun']."-".isi_nol($apre['bulan1'], 2)."-01" , tgl_sql2str($tgl_akhir)]; + if ($this->id_cab > 0) { + $tsql .= " AND CabID=?"; + array_push($asql, $this->id_cab); + } + + $apre['pend'] = $this->db->fetchAll("SELECT D.*,R.Nama_Rek FROM (SELECT Kode_Rek,SUM(-Jumlah) Jumlah FROM gel_jurnal_detail WHERE (Tgl_Ref BETWEEN ? AND ?) AND (LEFT(Kode_Rek,1)='4' OR Kode_Rek='".$this->rek_hpp."')".$tsql." GROUP BY Kode_Rek ORDER BY Kode_Rek) D LEFT JOIN gel_acc R ON (D.Kode_Rek=R.Kode_Rek)", $asql); + $apre['biaya'] = $this->db->fetchAll("SELECT D.*,R.Nama_Rek FROM (SELECT Kode_Rek,SUM(Jumlah) Jumlah FROM gel_jurnal_detail WHERE (Tgl_Ref BETWEEN ? AND ?) AND LEFT(Kode_Rek,1)='5'".$tsql." GROUP BY Kode_Rek ORDER BY Kode_Rek) D LEFT JOIN gel_acc R ON (D.Kode_Rek=R.Kode_Rek)", $asql); + return $apre; + } + + public function print() { + $apre = $this->prepare(); + + $pre = new PrintHTML($this->app); + $pre->add_title([strtoupper($this->reg_name), "RUGI / LABA CABANG", "Periode : ".$apre['periode']]); + + $pre->add_field("No.",10,"C"); + $pre->add_field("Kode",20,"C"); + $pre->add_field("Nama Rekening",150,"L"); + $pre->add_field("Jumlah",50,"R","kurung2"); + + if ($this->id_cab > 0) $pre->add_sub_title("Nama Cabang : ".$apre['nama_cab']); + + $pre->show_titles(); + $pre->show_headers(); + + $nomor = 0; $tot_pend = 0; $tot_biaya = 0; + foreach ($apre['pend'] as $row) { + $tot_pend += $row['Jumlah']; + $pre->add_row([ ++$nomor, $row['Kode_Rek'], $row['Nama_Rek'], $row['Jumlah'] ]); + } + $pre->add_span([ ["TOTAL PENDAPATAN KOTOR",3,"L,B"],[$tot_pend,1,"R,B","kurung2"] ]); + + $pre->add_row([ "" ]); + foreach ($apre['biaya'] as $row) { + if ((string) $row['Kode_Rek'] === $this->rek_hpp) continue; + $tot_biaya += $row['Jumlah']; + $pre->add_row([ ++$nomor, $row['Kode_Rek'], $row['Nama_Rek'], $row['Jumlah'] ]); + } + $pre->add_span([ ["TOTAL BIAYA",3,"L,B"],[$tot_biaya,1,"R,B","kurung2"] ]); + $pre->add_span([ ["SELISIH R / L CABANG ( ".($tot_pend>$tot_biaya?"PROFIT":"DEFISIT")." )",3,"L,B"],[$tot_pend - $tot_biaya,1,"R,B","kurung2"] ]); + + $pre->add_stamp(1, true); + $pre->show(); + } + + public function excel() { + $apre = $this->prepare(); + $xls = new Xlsx($this->app); + $xls->set_meta([ + 'title' => "Data Rugi / Laba Cabang", + 'desc' => "Export Data Rugi / Laba Cabang" + ]); + $xls->add_title([ $this->reg_name, "RUGI / LABA CABANG", "Periode : ".$apre['periode'] ]); + + $xls->add_field("No.", 5, "@integer"); + $xls->add_field("Kode", 10, "@text"); + $xls->add_field("Nama Rekening", 40, "@text"); + $xls->add_field("Jumlah", 20, "#,##0.00"); + $xls->add_sheet("".str_replace("s/d","-",$apre['periode'])); + + if ($this->id_cab > 0) $xls->add_sub_title("Nama Cabang : ".$apre['nama_cab']); + + $xls->show_titles(); + $xls->show_headers(); + + $nomor = 0; $tot_pend = 0; $tot_biaya = 0; + foreach ($apre['pend'] as $row) { + $tot_pend += $row['Jumlah']; + $xls->add_row([ ++$nomor, $row['Kode_Rek'], $row['Nama_Rek'], $row['Jumlah'] ]); + } + $xls->add_row_bold([ "", "", "TOTAL PENDAPATAN KOTOR", $tot_pend ]); + + $xls->add_row([ "" ]); + foreach ($apre['biaya'] as $row) { + if ((string) $row['Kode_Rek'] === $this->rek_hpp) continue; + $tot_biaya += $row['Jumlah']; + $xls->add_row([ ++$nomor, $row['Kode_Rek'], $row['Nama_Rek'], $row['Jumlah'] ]); + } + $xls->add_row_bold([ "", "", "TOTAL BIAYA", $tot_biaya ]); + $xls->add_row_bold([ "", "", "SELISIH R / L CABANG ( ".($tot_pend>$tot_biaya?"PROFIT":"DEFISIT")." )", $tot_pend - $tot_biaya ]); + + $xls->add_stamp(1, true); + $xls->download("Data Rugi Laba Cabang ".str_replace("s/d","-",$apre['periode']).".xlsx"); + unset($xls); + } + + public function index() { + $form = new Form($this->app); + $tcab = $form->option_db("_", "CabID", $this->id_cab, true, false, "para_cabang", ["CabID","Nama_Cab"], "Aktif=1 ORDER BY CabID", [0,"SEMUA CABANG"]); + $tbulan1 = $form->option("_", "Bulan1", date("n"), true, false, bulan_array()); + $tbulan2 = $form->option("_", "Bulan2", date("n"), true, false, bulan_array()); + $ttahun = $form->option("_", "Tahun", date("Y"), true, false, $this->gel->Tahun_Array()); + $this->app->json([ 'html' => ' +
+ +
'.$tcab.'
+
+
+ +
'.$tbulan1.''.$tbulan2.'
+
+
+ +
'.$ttahun.'
+
' + ]); + } + +} diff --git a/app/Controller/Report/Gel/BulansaldoController.php b/app/Controller/Report/Gel/BulansaldoController.php new file mode 100644 index 0000000..644e44a --- /dev/null +++ b/app/Controller/Report/Gel/BulansaldoController.php @@ -0,0 +1,142 @@ +app = $app; + $this->db = $db; + $this->reg_name = $session->get('WEB_APP')['REG_NAME']; + $this->gel = new Gel($app); + } + + private function prepare() { + $apre = [ + 'tipe' => Param::Int("Tipe"), // 1: rekap, 2: bulanan + 'bulan' => Param::Int("Bulan"), + 'tahun' => Param::Int("Tahun"), + ]; + $tgl_akhir = tgl_akhbln("01-".isi_nol($apre['bulan'],2)."-".(string) $apre['tahun']); + + // generate report header + $apre['periode'] = '01-'.($apre['tipe'] === 2 ? isi_nol($apre['bulan'],2) : '01').'-'.(string) $apre['tahun'].' s/d '.$tgl_akhir; + + // hitung total saldo rekening dari gel_rekap + $tjml = "R.Open"; + for ($i=1; $i<=$apre['bulan']; $i++) $tjml .= "+R.Muta_".isi_nol($i, 2); + $tjml = ($apre['tipe'] === 1) ? $tjml : "R.Muta_".isi_nol($apre['bulan'], 2); + + $apre['query'] = $this->db->runQuery("SELECT R.Kode_Rek, A.Nama_Rek, ".$tjml." Jumlah FROM (SELECT * FROM gel_rekap WHERE Tahun=?) R LEFT JOIN gel_acc A ON (R.Kode_Rek=A.Kode_Rek) WHERE ".$tjml."<>0 ORDER BY R.Kode_Rek", [$apre['tahun']]); + return $apre; + } + + public function print() { + $apre = $this->prepare(); + + $pre = new PrintHTML($this->app); + $pre->add_title([strtoupper($this->reg_name), "NERACA SALDO", "Periode : ".$apre['periode']]); + + $pre->add_field("No.",10,"C"); + $pre->add_field("Kode",20,"C"); + $pre->add_field("Nama Rekening",150,"L"); + $pre->add_field("Debit",50,"R","rupiah"); + $pre->add_field("Kredit",50,"R","rupiah"); + + $pre->show_titles(); + $pre->show_headers(); + + $nomor = 0; $tot_debit = 0; $tot_kredit = 0; + while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) { + $ndebit = ($row['Jumlah'] > 0) ? $row['Jumlah'] : 0; + $nkredit = ($row['Jumlah'] < 0) ? abs($row['Jumlah']) : 0; + $tot_debit += $ndebit; + $tot_kredit += $nkredit; + $pre->add_row([ ++$nomor, $row['Kode_Rek'], $row['Nama_Rek'], $ndebit, $nkredit ]); + } + $pre->add_span([ ["TOTAL SALDO",3,"L,B"],[$tot_debit,1,"R,B","rupiah"],[$tot_kredit,1,"R,B","rupiah"] ]); + + $pre->add_stamp(1, true); + $pre->show(); + } + + public function excel() { + $apre = $this->prepare(); + $xls = new Xlsx($this->app); + $xls->set_meta([ + 'title' => "Data Neraca Saldo", + 'desc' => "Export Data Neraca Saldo" + ]); + $xls->add_title([ $this->reg_name, "NERACA SALDO", "Periode : ".$apre['periode'] ]); + + $xls->add_field("No.", 5, "@integer"); + $xls->add_field("Kode", 10, "@text"); + $xls->add_field("Nama Rekening", 40, "@text"); + $xls->add_field("Debit", 20, "#,##0.00"); + $xls->add_field("Kredit", 20, "#,##0.00"); + $xls->add_sheet("".str_replace("s/d","-",$apre['periode'])); + + $xls->show_titles(); + $xls->show_headers(); + + $nomor = 0; $tot_debit = 0; $tot_kredit = 0; + while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) { + $ndebit = ($row['Jumlah'] > 0) ? $row['Jumlah'] : 0; + $nkredit = ($row['Jumlah'] < 0) ? abs($row['Jumlah']) : 0; + $tot_debit += $ndebit; + $tot_kredit += $nkredit; + $xls->add_row([ ++$nomor, $row['Kode_Rek'], $row['Nama_Rek'], $ndebit, $nkredit ]); + } + $xls->add_row_bold([ "", "", "TOTAL SALDO", $tot_debit, $tot_kredit ]); + + $xls->add_stamp(1, true); + $xls->download("Data Neraca Saldo ".str_replace("s/d","-",$apre['periode']).".xlsx"); + unset($xls); + } + + public function index() { + $form = new Form($this->app); + $ttipe = $form->radio("_", "Tipe", 1, true, false, [1=>"Akumulasi", 2=>"Bulanan"]); + $tbulan = $form->option("_", "Bulan", date("n"), true, false, bulan_array()); + $ttahun = $form->option("_", "Tahun", date("Y"), true, false, $this->gel->Tahun_Array()); + $this->app->json([ 'html' => ' +
+ +
'.$ttipe.'
+
+
+ +
'.$tbulan.$ttahun.'
+
' + ]); + } + +} diff --git a/app/Controller/Report/Gel/BulanshuController.php b/app/Controller/Report/Gel/BulanshuController.php new file mode 100644 index 0000000..2993190 --- /dev/null +++ b/app/Controller/Report/Gel/BulanshuController.php @@ -0,0 +1,198 @@ +app = $app; + $this->db = $db; + $this->app_gel = (array) $session->get('APP_GEL'); + $this->reg_name = $session->get('WEB_APP')['REG_NAME']; + $this->gel = new Gel($app); + } + + private function prepare() { + $apre = [ + 'bulan1' => Param::Int("Bulan1"), + 'bulan2' => Param::Int("Bulan2"), + 'tahun' => Param::Int("Tahun"), + 'level' => Param::Int("Level"), + ]; + $tgl_akhir = tgl_akhbln("01-".isi_nol($apre['bulan2'],2)."-".(string) $apre['tahun']); + + // generate report header + $apre['periode'] = '01-'.isi_nol($apre['bulan1'],2).'-'.(string) $apre['tahun'].' s/d '.$tgl_akhir; + + $apre['data'] = $this->gel->RugiLaba($apre['bulan1'], $apre['tahun'], $apre['bulan2'], $apre['tahun'], $apre['level']); + return $apre; + } + + public function print() { + $apre = $this->prepare(); + + $pre = new PrintHTML($this->app); + $pre->add_title([strtoupper($this->reg_name), "RUGI / LABA", "Periode : ".$apre['periode']]); + + $pre->add_field("Keterangan",150,"L"); + for ($i=0; $i<$apre['level']; $i++) { + $pre->add_field("Jumlah ".(string) $i,50,"R","rupiah"); + } + + $pre->show_titles(); + $pre->show_headers(true); + + $tot_pend = 0; $strpad = "   "; + $pre->add_span([ ["A. PENDAPATAN",($apre['level']+1),"L,B"] ]); + foreach ($apre['data'] as $row) { + if ($row['Grup_RekID'] === 4 && !($row['Mode'] === "D" && $row['Jumlah'] === 0) && $row['Level'] > 1) { + $njum = $row['Jumlah'] * -1; + $temp_array = [str_repeat($strpad, ($row['Level']-1))." ".$row['Nama_Rek']]; + for ($i=($apre['level']+1); $i>1; $i--) { + $temp_array[] = ($row['Level'] === $i) ? $njum : ""; + } + $pre->add_row($temp_array); + if ($row['Level'] === 2) $tot_pend += $njum; + } + } + $pre->add_span([ ["JUMLAH PENDAPATAN",$apre['level'],"L,B,I"],[$tot_pend,1,"R,B,I","rupiah"] ]); + + $pre->add_row([ "" ]); + $pre->add_span([ ["B. BIAYA - BIAYA",($apre['level']+1),"L,B"] ]); + $tot_biaya = 0; + foreach ($apre['data'] as $row) { + if ($row['Grup_RekID'] === 5 && !($row['Mode'] === "D" && $row['Jumlah'] === 0) && $row['Level'] > 1) { + $njum = $row['Jumlah']; + $temp_array = [str_repeat($strpad, $row['Level'])." ".$row['Nama_Rek']]; + for ($i=$apre['level']; $i>0; $i--) { + $temp_array[] = ($row['Level'] === $i) ? $njum : ""; + } + $pre->add_row($temp_array); + if ($row['Level'] === 2) $tot_biaya += $njum; + } + } + $pre->add_span([ ["JUMLAH BIAYA - BIAYA",$apre['level'],"L,B,I"], [$tot_biaya,1,"R,B,I","rupiah"] ]); + $pre->add_span([ ["SISA HASIL USAHA (".((($tot_pend-$tot_biaya)>0)?"SURPLUS":"DEFISIT").")",$apre['level'],"L,B,I"], [$tot_pend-$tot_biaya,1,"R,B,I","rupiah"] ]); + + $pre->add_stamp(1, true); + $pre->show(); + } + + public function excel() { + $apre = $this->prepare(); + $xls = new Xlsx($this->app); + $xls->set_meta([ + 'title' => "Data Rugi / Laba", + 'desc' => "Export Data Rugi / Laba" + ]); + $xls->add_title([ $this->reg_name, "RUGI / LABA", "Periode : ".$apre['periode'] ]); + + $xls->add_field("Keterangan", 50, "@text"); + for ($i=0; $i<$apre['level']; $i++) { + $xls->add_field("Jumlah ".(string) $i, 20, "#,##0.00"); + } + $xls->add_sheet("".str_replace("s/d","-",$apre['periode'])); + + $xls->show_titles(); + $xls->show_headers(true); + + $tot_pend = 0; $strpad = " "; + $xls->add_row_bold([ "A. PENDAPATAN" ]); + foreach ($apre['data'] as $row) { + if ($row['Grup_RekID'] === 4 && !($row['Mode'] === "D" && $row['Jumlah'] === 0) && $row['Level'] > 1) { + $njum = $row['Jumlah'] * -1; + $temp_array = [str_repeat($strpad, ($row['Level']-1))." ".$row['Nama_Rek']]; + for ($i=($apre['level']+1); $i>1; $i--) { + $temp_array[] = ($row['Level'] === $i) ? $njum : ""; + } + $xls->add_row($temp_array); + if ($row['Level'] === 2) $tot_pend += $njum; + } + } + $_sjudul = ["JUMLAH PENDAPATAN"]; + for ($i=0; $i<($apre['level']-1); $i++) $_sjudul[] = ""; + $_sjudul[] = $tot_pend; + $xls->add_row_bold($_sjudul); + + $xls->add_row([ "" ]); + $xls->add_row([ "B. BIAYA - BIAYA" ]); + $tot_biaya = 0; + foreach ($apre['data'] as $row) { + if ($row['Grup_RekID'] === 5 && !($row['Mode'] === "D" && $row['Jumlah'] === 0) && $row['Level'] > 1) { + $njum = $row['Jumlah']; + $temp_array = [str_repeat($strpad, $row['Level'])." ".$row['Nama_Rek']]; + for ($i=$apre['level']; $i>0; $i--) { + $temp_array[] = ($row['Level'] === $i) ? $njum : ""; + } + $xls->add_row($temp_array); + if ($row['Level'] === 2) $tot_biaya += $njum; + } + } + $_sjudul = ["JUMLAH BIAYA - BIAYA"]; + for ($i=0; $i<($apre['level']-1); $i++) $_sjudul[] = ""; + $_sjudul[] = $tot_biaya; + $xls->add_row_bold($_sjudul); + + $_sjudul = ["SISA HASIL USAHA (".((($tot_pend-$tot_biaya)>0)?"SURPLUS":"DEFISIT").")"]; + for ($i=0; $i<($apre['level']-1); $i++) $_sjudul[] = ""; + $_sjudul[] = $tot_pend - $tot_biaya; + $xls->add_row_bold($_sjudul); + + $xls->add_stamp(1, true); + $xls->download("Data Rugi Laba ".str_replace("s/d","-",$apre['periode']).".xlsx"); + unset($xls); + } + + public function index() { + $alevel = []; for ($i=2; $i<=($this->app_gel['MAX_LEVEL']-1); $i++) $alevel[$i] = "Level ".$i; + $form = new Form($this->app); + $tbulan1 = $form->option("_", "Bulan1", date("n"), true, false, bulan_array()); + $tbulan2 = $form->option("_", "Bulan2", date("n"), true, false, bulan_array()); + $ttahun = $form->option("_", "Tahun", date("Y"), true, false, $this->gel->Tahun_Array()); + $tlevel = $form->option("_", "Level", 3, true, false, $alevel); + $this->app->json([ 'html' => ' +
+ +
'.$tbulan1.''.$tbulan2.'
+
+
+ +
'.$ttahun.'
+
+
+ +
'.$tlevel.'
+
' + ]); + } + +} diff --git a/app/Controller/Report/Gel/HarianbantuController.php b/app/Controller/Report/Gel/HarianbantuController.php new file mode 100644 index 0000000..f4546ac --- /dev/null +++ b/app/Controller/Report/Gel/HarianbantuController.php @@ -0,0 +1,208 @@ +app = $app; + $this->db = $db; + $this->app_gel = (array) $session->get('APP_GEL'); + $this->reg_name = $session->get('WEB_APP')['REG_NAME']; + } + + private function prepare() { + $apre = [ + 'kode_rek' => Param::Int("Kode_Rek"), + 'tgl_from' => Param::Get("Tgl_From"), + 'tgl_to' => Param::Get("Tgl_To"), + 'nama_rek' => "", + 'kali' => 1, + ]; + + $tahun = substr($apre['tgl_from'], 6); + if (!empty($apre['kode_rek'])) { + $arek = $this->db->fetchRow("SELECT * FROM gel_acc WHERE Kode_Rek=?", [$apre['kode_rek']]); + if ($arek) { + $dk = Gel::DK($arek['Grup_RekID']); + if ($dk === "K") $apre['kali'] = -1; + $apre['nama_rek'] = $arek['Kode_Rek'] . " [".$dk."] - " . $arek['Nama_Rek']; + } + } + + // generate report header + $apre['periode'] = $apre['tgl_from'] . ($apre['tgl_from'] !== $apre['tgl_to'] ? ' s/d '.$apre['tgl_to'] : ''); + + $apre['saldo'] = ($this->db->fetchField("SELECT Open FROM gel_rekap WHERE Kode_Rek=? AND Tahun=?", [$apre['kode_rek'], $tahun]) ?? 0) * $apre['kali']; + $_ext = $this->db->fetchField("SELECT SUM(Jumlah) Saldo FROM gel_jurnal_detail WHERE Tahun=? AND Kode_Rek=? AND Tgl_Ref 0) $apre['saldo'] += $_ext * $apre['kali']; + + if ($apre['kode_rek'] === $this->app_gel['PIU_USAHA']) { + $apre['query'] = $this->db->runQuery("SELECT D.*,CONCAT(J.Kode_Ref,' / ',J.Catatan) Kode_Ref,CONCAT(IFNULL(M.Nama_Member,''),' [',IFNULL(M.Kode_Member,'000000'),']') Nama_Member FROM (SELECT Kode_Jurnal,Tgl_Ref,IF(DK='D',Jumlah,0) Debit, IF(DK='K',Jumlah*-1,0) Kredit, Jumlah Saldo,MemberID FROM gel_jurnal_detail WHERE (Tgl_Ref BETWEEN ? AND ?) AND Kode_Rek=?) D LEFT JOIN gel_jurnal J ON (D.Kode_Jurnal=J.Kode_Jurnal) LEFT JOIN para_member M ON (M.MemberID=D.MemberID) ORDER BY D.Tgl_Ref,D.Kode_Jurnal", [tgl_sql2str($apre['tgl_from']), tgl_sql2str($apre['tgl_to']), $apre['kode_rek']]); + } else if ($apre['kode_rek'] === $this->app_gel['HUT_USAHA']) { + $apre['query'] = $this->db->runQuery("SELECT D.*,CONCAT(J.Kode_Ref,' / ',J.Catatan) Kode_Ref,CONCAT(IFNULL(S.Nama_Sup,''),' [',IFNULL(S.Kode_Sup,'0000'),']') Nama_Sup FROM (SELECT Kode_Jurnal,Tgl_Ref,IF(DK='D',Jumlah,0) Debit, IF(DK='K',Jumlah*-1,0) Kredit, Jumlah Saldo,SupID FROM gel_jurnal_detail WHERE (Tgl_Ref BETWEEN ? AND ?) AND Kode_Rek=?) D LEFT JOIN gel_jurnal J ON (D.Kode_Jurnal=J.Kode_Jurnal) LEFT JOIN para_supplier S ON (S.SupID=D.SupID) ORDER BY D.Tgl_Ref,D.Kode_Jurnal", [tgl_sql2str($apre['tgl_from']), tgl_sql2str($apre['tgl_to']), $apre['kode_rek']]); + } else { + $apre['query'] = $this->db->runQuery("SELECT D.*,CONCAT(J.Kode_Ref,' / ',J.Catatan) Kode_Ref FROM (SELECT Kode_Jurnal,Tgl_Ref,IF(DK='D',Jumlah,0) Debit, IF(DK='K',Jumlah*-1,0) Kredit, Jumlah Saldo FROM gel_jurnal_detail WHERE (Tgl_Ref BETWEEN ? AND ?) AND Kode_Rek=?) D LEFT JOIN gel_jurnal J ON (D.Kode_Jurnal=J.Kode_Jurnal) ORDER BY D.Tgl_Ref,D.Kode_Jurnal", [tgl_sql2str($apre['tgl_from']), tgl_sql2str($apre['tgl_to']), $apre['kode_rek']]); + } + return $apre; + } + + public function print() { + $apre = $this->prepare(); + + $pre = new PrintHTML($this->app); + $pre->add_title([strtoupper($this->reg_name), "BUKU PEMBANTU HARIAN", "Periode : ".$apre['periode']]); + + $pre->add_field("No.",10,"C"); + $pre->add_field("Tanggal",30,"C","sqltgl"); + $pre->add_field("Kode Jurnal",50,"L"); + $pre->add_field("Kode Ref / Deskripsi",150,"L"); + if ($apre['kode_rek'] === $this->app_gel['PIU_USAHA']) { + $pre->add_field("Nama Member",150,"L"); + } else if ($apre['kode_rek'] === $this->app_gel['HUT_USAHA']) { + $pre->add_field("Nama Supplier",150,"L"); + } + $pre->add_field("Debit",20,"R","rupiah"); + $pre->add_field("Kredit",20,"R","rupiah"); + $pre->add_field("Saldo",20,"R","rupiah"); + + if (!empty($apre['kode_rek'])) $pre->add_sub_title("Rekening : ".$apre['nama_rek']); + + $pre->show_titles(); + $pre->show_headers(); + + $nomor = 0; $tot_debit = 0; $tot_kredit = 0; + if ($apre['kode_rek'] === $this->app_gel['PIU_USAHA'] || $apre['kode_rek'] === $this->app_gel['HUT_USAHA']) { + $pre->add_span([ ["Saldo Awal",5,"R,B"],["",1,"R,B"],["",1,"R,B"],[$apre['saldo'],1,"R,B","rupiah"] ]); + } else { + $pre->add_span([ ["Saldo Awal",4,"R,B"],["",1,"R,B"],["",1,"R,B"],[$apre['saldo'],1,"R,B","rupiah"] ]); + } + while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) { + $tot_debit += $row['Debit']; + $tot_kredit += $row['Kredit']; + $apre['saldo'] += $row['Saldo'] * $apre['kali']; + if ($apre['kode_rek'] === $this->app_gel['PIU_USAHA']) { + $pre->add_row([ ++$nomor, $row['Tgl_Ref'], $row['Kode_Jurnal'], $row['Kode_Ref'], $row['Nama_Member'], $row['Debit'], $row['Kredit'], $apre['saldo'] ]); + } else if ($apre['kode_rek'] === $this->app_gel['HUT_USAHA']) { + $pre->add_row([ ++$nomor, $row['Tgl_Ref'], $row['Kode_Jurnal'], $row['Kode_Ref'], $row['Nama_Sup'], $row['Debit'], $row['Kredit'], $apre['saldo'] ]); + } else { + $pre->add_row([ ++$nomor, $row['Tgl_Ref'], $row['Kode_Jurnal'], $row['Kode_Ref'], $row['Debit'], $row['Kredit'], $apre['saldo'] ]); + } + } + if ($apre['kode_rek'] === $this->app_gel['PIU_USAHA'] || $apre['kode_rek'] === $this->app_gel['HUT_USAHA']) { + $pre->add_span([ ["Saldo Akhir",5,"R,B"],[$tot_debit,1,"R,B","rupiah"],[$tot_kredit,1,"R,B","rupiah"],[$apre['saldo'],1,"R,B","rupiah"] ]); + } else { + $pre->add_span([ ["Saldo Akhir",4,"R,B"],[$tot_debit,1,"R,B","rupiah"],[$tot_kredit,1,"R,B","rupiah"],[$apre['saldo'],1,"R,B","rupiah"] ]); + } + + $pre->add_stamp(1, true); + $pre->show(); + } + + public function excel() { + $apre = $this->prepare(); + $xls = new Xlsx($this->app); + $xls->set_meta([ + 'title' => "Data Buku Pembantu Harian", + 'desc' => "Export Data Buku Pembantu Harian" + ]); + $xls->add_title([ $this->reg_name, "DATA BUKU PEMBANTU HARIAN", "Periode : ".$apre['periode'] ]); + + $xls->add_field("No.", 5, "@integer"); + $xls->add_field("Tanggal", 12, "@date"); + $xls->add_field("Kode Jurnal", 20, "@text"); + $xls->add_field("Kode Ref / Deskripsi", 40, "@text"); + if ($apre['kode_rek'] === $this->app_gel['PIU_USAHA']) { + $xls->add_field("Nama Member", 40, "@text"); + } else if ($apre['kode_rek'] === $this->app_gel['HUT_USAHA']) { + $xls->add_field("Nama Supplier", 40, "@text"); + } + $xls->add_field("Debit", 15, "#,##0.00"); + $xls->add_field("Kredit", 15, "#,##0.00"); + $xls->add_field("Saldo", 15, "#,##0.00"); + $xls->add_sheet("".str_replace("s/d","-",$apre['periode'])); + + if (!empty($apre['kode_rek'])) $xls->add_sub_title("Rekening : ".$apre['nama_rek']); + + $xls->show_titles(); + $xls->show_headers(); + + $nomor = 0; $tot_debit = 0; $tot_kredit = 0; + if ($apre['kode_rek'] === $this->app_gel['PIU_USAHA'] || $apre['kode_rek'] === $this->app_gel['HUT_USAHA']) { + $xls->add_row_bold([ "", "", "", "Saldo Awal", "", "", "", $apre['saldo'] ]); + } else { + $xls->add_row_bold([ "", "", "", "Saldo Awal", "", "", $apre['saldo'] ]); + } + while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) { + $tot_debit += $row['Debit']; + $tot_kredit += $row['Kredit']; + $apre['saldo'] += $row['Saldo'] * $apre['kali']; + if ($apre['kode_rek'] === $this->app_gel['PIU_USAHA']) { + $xls->add_row([ ++$nomor, $row['Tgl_Ref'], $row['Kode_Jurnal'], $row['Kode_Ref'], $row['Nama_Member'], $row['Debit'], $row['Kredit'], $apre['saldo'] ]); + } else if ($apre['kode_rek'] === $this->app_gel['HUT_USAHA']) { + $xls->add_row([ ++$nomor, $row['Tgl_Ref'], $row['Kode_Jurnal'], $row['Kode_Ref'], $row['Nama_Sup'], $row['Debit'], $row['Kredit'], $apre['saldo'] ]); + } else { + $xls->add_row([ ++$nomor, $row['Tgl_Ref'], $row['Kode_Jurnal'], $row['Kode_Ref'], $row['Debit'], $row['Kredit'], $apre['saldo'] ]); + } + } + if ($apre['kode_rek'] === $this->app_gel['PIU_USAHA'] || $apre['kode_rek'] === $this->app_gel['HUT_USAHA']) { + $xls->add_row_bold([ "", "", "", "Saldo Akhir", "", $tot_debit, $tot_kredit, $apre['saldo'] ]); + } else { + $xls->add_row_bold([ "", "", "", "Saldo Akhir", $tot_debit, $tot_kredit, $apre['saldo'] ]); + } + + $xls->add_stamp(1, true); + $xls->download("Data Buku Pembantu Harian ".str_replace("s/d","-",$apre['periode']).".xlsx"); + unset($xls); + } + + public function index() { + $form = new Form($this->app); + $tkode = $form->option_db("_", "Kode_Rek", "", true, false, "vi_gel_acc", ["Kode_Rek","Nama_Lengkap"], "Aktif=1 AND Mode='D' AND Kode_Rek IN (1141,1142,2111)"); + $tfrom = $form->datebox("_", "Tgl_From", tgl_ymd(), true, false); + $tto = $form->datebox("_", "Tgl_To", tgl_ymd(), true, false); + $this->app->json([ 'html' => ' +
+ +
'.$tkode.'
+
+
+ +
'.$tfrom.'
+
+
+ +
'.$tto.'
+
' + ]); + } + +} diff --git a/app/Controller/Report/Gel/HarianbesarController.php b/app/Controller/Report/Gel/HarianbesarController.php new file mode 100644 index 0000000..26d5bbe --- /dev/null +++ b/app/Controller/Report/Gel/HarianbesarController.php @@ -0,0 +1,230 @@ +app = $app; + $this->db = $db; + $this->reg_name = $session->get('WEB_APP')['REG_NAME']; + } + + public function brow_rek() { + $tcari = Param::Get("Cari_Rek"); + $tsql = 'Aktif=1 AND Mode="D"'; $asql = []; + if (!empty($tcari)) { + $tsql .= " AND CONCAT(Kode_Rek,Nama_Rek) LIKE ?"; + array_push($asql, '%' . $tcari . '%'); + } + + $obj = new Table($this->app); + $obj->set_table("gel_acc", "*", $tsql, $asql); + $obj->add_field("Kode_Rek", "Kode", "c"); + $obj->add_field("Nama_Rek", "Nama Rekening", "awr"); + $obj->add_field("Level", "Level", "c"); + $obj->set_field_order("Kode_Rek", "A"); + $obj->set_func_select("RepoGelHBesarJS.rek_select"); + $this->app->json([ $obj->db_table("divBrowRek") ]); + } + + public function auto_rek() { + $tcari = Param::Get("Auto_Query"); + $ajson['autodata'] = []; + $stat = $this->db->runQuery("SELECT Kode_Rek,Nama_Rek,CONCAT(Kode_Rek,' - ',Nama_Rek) Nama_Lengkap FROM gel_acc WHERE Aktif=1 AND Mode='D' AND CONCAT(Kode_Rek,Nama_Rek) LIKE ? ORDER BY Kode_Rek LIMIT 50", ['%'.$tcari.'%']); + while ($row = $stat->fetch(SimplePdo::FETCH_ASSOC)) { + $ajson['autodata'][] = ['value'=>$row['Kode_Rek'], 'text'=>$row['Nama_Rek'], 'html'=>''.$row['Kode_Rek'].' '.$row['Nama_Rek'], 'data'=>"", 'bc'=>0]; + } + $this->app->json($ajson); + } + + private function prepare() { + $apre = [ + 'kode_rek' => Param::Get("Kode_Rek"), + 'jenis' => Param::Get("Jenis", "Y"), + 'tgl_from' => Param::Get("Tgl_From"), + 'tgl_to' => Param::Get("Tgl_To"), + 'nama_rek' => "", + 'kali' => 1, + ]; + + $tahun = substr($apre['tgl_from'], 6); + if (!empty($apre['kode_rek'])) { + $arek = $this->db->fetchRow("SELECT * FROM gel_acc WHERE Kode_Rek=?", [$apre['kode_rek']]); + if ($arek) { + $dk = Gel::DK($arek['Grup_RekID']); + if ($dk === "K") $apre['kali'] = -1; + $apre['nama_rek'] = $arek['Kode_Rek'] . " [".$dk."] - " . $arek['Nama_Rek']; + } + } + + // generate report header + $apre['periode'] = $apre['tgl_from'] . ($apre['tgl_from'] !== $apre['tgl_to'] ? ' s/d '.$apre['tgl_to'] : ''); + + $apre['saldo'] = ($this->db->fetchField("SELECT Open FROM gel_rekap WHERE Kode_Rek=? AND Tahun=?", [$apre['kode_rek'], $tahun]) ?? 0) * $apre['kali']; + $_ext = $this->db->fetchField("SELECT SUM(Jumlah) Saldo FROM gel_jurnal_detail WHERE Tahun=? AND Kode_Rek=? AND Tgl_Ref 0) $apre['saldo'] += $_ext * $apre['kali']; + + if ($apre['jenis'] === "Y") { + $apre['query'] = $this->db->runQuery("SELECT Tgl_Ref,SUM(IF(DK='D',Jumlah,0)) Debit, SUM(IF(DK='K',Jumlah*-1,0)) Kredit, SUM(Jumlah) Saldo FROM gel_jurnal_detail WHERE (Tgl_Ref BETWEEN ? AND ?) AND Kode_Rek=? GROUP BY Tgl_Ref ORDER BY Tgl_Ref", [tgl_sql2str($apre['tgl_from']), tgl_sql2str($apre['tgl_to']), $apre['kode_rek']]); + } else { + $apre['query'] = $this->db->runQuery("SELECT D.*,CONCAT(J.Kode_Ref,' / ',J.Catatan) Kode_Ref FROM (SELECT Kode_Jurnal,Tgl_Ref,IF(DK='D',Jumlah,0) Debit, IF(DK='K',Jumlah*-1,0) Kredit, Jumlah Saldo FROM gel_jurnal_detail WHERE (Tgl_Ref BETWEEN ? AND ?) AND Kode_Rek=?) D LEFT JOIN gel_jurnal J ON (D.Kode_Jurnal=J.Kode_Jurnal) ORDER BY D.Tgl_Ref,D.Kode_Jurnal", [tgl_sql2str($apre['tgl_from']), tgl_sql2str($apre['tgl_to']), $apre['kode_rek']]); + } + return $apre; + } + + public function print() { + $apre = $this->prepare(); + + $pre = new PrintHTML($this->app); + $pre->add_title([strtoupper($this->reg_name), "BUKU BESAR HARIAN", "Periode : ".$apre['periode']]); + + $pre->add_field("No.",10,"C"); + $pre->add_field("Tanggal",30,"C","sqltgl"); + if ($apre['jenis'] !== "Y") { + $pre->add_field("Kode Jurnal",50,"L"); + $pre->add_field("Kode Ref / Deskripsi",150,"L"); + } + $pre->add_field("Debit",20,"R","rupiah"); + $pre->add_field("Kredit",20,"R","rupiah"); + $pre->add_field("Saldo",20,"R","rupiah"); + + if (!empty($apre['kode_rek'])) $pre->add_sub_title("Rekening : ".$apre['nama_rek']); + + $pre->show_titles(); + $pre->show_headers(); + + $nomor = 0; $tot_debit = 0; $tot_kredit = 0; + if ($apre['jenis'] === "Y") { + $pre->add_span([ ["Saldo Awal",2,"R,B"],["",1,"R,B"],["",1,"R,B"],[$apre['saldo'],1,"R,B","rupiah"] ]); + } else { + $pre->add_span([ ["Saldo Awal",4,"R,B"],["",1,"R,B"],["",1,"R,B"],[$apre['saldo'],1,"R,B","rupiah"] ]); + } + while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) { + $tot_debit += $row['Debit']; + $tot_kredit += $row['Kredit']; + $apre['saldo'] += $row['Saldo'] * $apre['kali']; + if ($apre['jenis'] === "Y") { + $pre->add_row([ ++$nomor, $row['Tgl_Ref'], $row['Debit'], $row['Kredit'], $apre['saldo'] ]); + } else { + $pre->add_row([ ++$nomor, $row['Tgl_Ref'], $row['Kode_Jurnal'], $row['Kode_Ref'], $row['Debit'], $row['Kredit'], $apre['saldo'] ]); + } + } + if ($apre['jenis'] === "Y") { + $pre->add_span([ ["Saldo Akhir",2,"R,B"],[$tot_debit,1,"R,B","rupiah"],[$tot_kredit,1,"R,B","rupiah"],[$apre['saldo'],1,"R,B","rupiah"] ]); + } else { + $pre->add_span([ ["Saldo Akhir",4,"R,B"],[$tot_debit,1,"R,B","rupiah"],[$tot_kredit,1,"R,B","rupiah"],[$apre['saldo'],1,"R,B","rupiah"] ]); + } + + $pre->add_stamp(1, true); + $pre->show(); + } + + public function excel() { + $apre = $this->prepare(); + $xls = new Xlsx($this->app); + $xls->set_meta([ + 'title' => "Data Buku Besar Harian", + 'desc' => "Export Data Buku Besar Harian" + ]); + $xls->add_title([ $this->reg_name, "DATA BUKU BESAR HARIAN", "Periode : ".$apre['periode'] ]); + + $xls->add_field("No.", 5, "@integer"); + $xls->add_field("Tanggal", 12, "@date"); + if ($apre['jenis'] !== "Y") { + $xls->add_field("Kode Jurnal", 20, "@text"); + $xls->add_field("Kode Ref / Deskripsi", 40, "@text"); + } + $xls->add_field("Debit", 15, "#,##0.00"); + $xls->add_field("Kredit", 15, "#,##0.00"); + $xls->add_field("Saldo", 15, "#,##0.00"); + $xls->add_sheet("".str_replace("s/d","-",$apre['periode'])); + + if (!empty($apre['kode_rek'])) $xls->add_sub_title("Rekening : ".$apre['nama_rek']); + + $xls->show_titles(); + $xls->show_headers(); + + $nomor = 0; $tot_debit = 0; $tot_kredit = 0; + if ($apre['jenis'] === "Y") { + $xls->add_row_bold([ "", "Saldo Awal", "", "", $apre['saldo'] ]); + } else { + $xls->add_row_bold([ "", "", "", "Saldo Awal", "", "", $apre['saldo'] ]); + } + while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) { + $tot_debit += $row['Debit']; + $tot_kredit += $row['Kredit']; + $apre['saldo'] += $row['Saldo'] * $apre['kali']; + if ($apre['jenis'] === "Y") { + $xls->add_row([ ++$nomor, $row['Tgl_Ref'], $row['Debit'], $row['Kredit'], $apre['saldo'] ]); + } else { + $xls->add_row([ ++$nomor, $row['Tgl_Ref'], $row['Kode_Jurnal'], $row['Kode_Ref'], $row['Debit'], $row['Kredit'], $apre['saldo'] ]); + } + } + if ($apre['jenis'] === "Y") { + $xls->add_row_bold([ "", "Saldo Akhir", $tot_debit, $tot_kredit, $apre['saldo'] ]); + } else { + $xls->add_row_bold([ "", "", "", "Saldo Akhir", $tot_debit, $tot_kredit, $apre['saldo'] ]); + } + + $xls->add_stamp(1, true); + $xls->download("Data Buku Besar Harian ".str_replace("s/d","-",$apre['periode']).".xlsx"); + unset($xls); + } + + public function index() { + $form = new Form($this->app); + $tnama = $form->textauto("_", "Nama_Rek", ['value'=>"",'text'=>""], true, true, "ketik kode / nama rekening"); + $tjenis = $form->radio("_", "Jenis", "Y", true, false, ['Y'=>"Ya", 'N'=>"Tidak"]); + $tfrom = $form->datebox("_", "Tgl_From", tgl_ymd(), true, false); + $tto = $form->datebox("_", "Tgl_To", tgl_ymd(), true, false); + $this->app->json([ 'html' => ' +
+ +
'.$tnama.'
+
+
+ +
'.$tjenis.'
+
+
+ +
'.$tfrom.'
+
+
+ +
'.$tto.'
+
+ ' + ]); + } + +} diff --git a/app/Controller/Report/Gel/HariandetailController.php b/app/Controller/Report/Gel/HariandetailController.php new file mode 100644 index 0000000..baf06e0 --- /dev/null +++ b/app/Controller/Report/Gel/HariandetailController.php @@ -0,0 +1,123 @@ +app = $app; + $this->db = $db; + $this->reg_name = $session->get('WEB_APP')['REG_NAME']; + } + + public function brow_jurnal() { + $tcari = Param::Get("Cari_Jurnal"); + $tsql = ''; $asql = []; + if (!empty($tcari)) { + $tsql .= " WHERE CONCAT(Kode_Jurnal,DATE_FORMAT(Tanggal,'%d-%m-%Y'),Kode_Ref,Catatan) LIKE ?"; + array_push($asql, '%' . $tcari . '%'); + } + + $obj = new Table($this->app); + $obj->set_table("(SELECT * FROM gel_jurnal".$tsql.") J LEFT JOIN gel_tipe T ON (T.TipeID=J.TipeID)", "J.*,T.Kode_Tipe", "", $asql); + $obj->add_field("Kode_Jurnal", "Kode Jurnal", "c"); + $obj->add_field("Tanggal", "Tanggal", "c", "sqltgl", "", "val-tgl"); + $obj->add_field("Kode_Ref", "Kode Ref.", "l"); + $obj->add_field("Catatan", "Deskripsi", "awr"); + $obj->add_field("Kode_Tipe", "Tipe", "l"); + $obj->set_field_order("Kode_Jurnal", "D"); + $obj->set_func_select("RepoGelHDetailJS.jurnal_select"); + $this->app->json([ $obj->db_table("divBrowJurnal") ]); + } + + private function prepare() { + $apre = [ + 'kode_jurnal' => Param::Get("Kode_Jurnal"), + 'header' => [], + 'detail' => [], + ]; + + // ambil detail informasi jurnal + $apre['header'] = $this->db->fetchRow("SELECT J.*, O.Nama NamaUser, CONCAT(YEAR(J.Tanggal),'-',IF(MONTH(J.Tanggal)<10,'0',''),MONTH(J.Tanggal)) Periode,T.Kode_Tipe,T.Nama_Tipe FROM (SELECT * FROM gel_jurnal WHERE Kode_Jurnal=?) J LEFT JOIN app_operator O ON (J.UserID=O.UserID) LEFT JOIN gel_tipe T ON (J.TipeID=T.TipeID)", [$apre['kode_jurnal']]); + + // check status jurnal + $cek = (float) $this->db->fetchField("SELECT SUM(Jumlah) FROM gel_jurnal_detail WHERE Kode_Jurnal=?", [$apre['kode_jurnal']]) ?? 0; + $apre['header']['Status'] = ($cek === 0.0) ? 'OK' : 'Tidak Seimbang'; + + // query detail jurnal + $apre['detail'] = $this->db->fetchAll("SELECT D.*, A.Nama_Rek FROM (SELECT ID,Kode_Rek,DK,IF(DK='D',Jumlah,0) Debit, IF(DK='K',Jumlah*-1,0) Kredit FROM gel_jurnal_detail WHERE Kode_Jurnal=?) D LEFT JOIN gel_acc A ON (D.Kode_Rek=A.Kode_Rek) ORDER BY D.ID", [$apre['kode_jurnal']]); + + return $apre; + } + + public function print() { + $apre = $this->prepare(); + + $pre = new PrintHTML($this->app); + $pre->add_title([strtoupper($this->reg_name), "JURNAL DETAIL"]); + + $pre->add_field("No.",10,"C"); + $pre->add_field("Kode",50,"C"); + $pre->add_field("Nama Rekening",150,"L"); + $pre->add_field("D / K",10,"C"); + $pre->add_field("Debit",20,"R","rupiah"); + $pre->add_field("Kredit",20,"R","rupiah"); + + $pre->show_titles(); + + $kop = ''; + $kop .= ''; + $kop .= ''; + $kop .= ''; + $kop .= ''; + $kop .= ''; + $kop .= '
Kode Jurnal'.$apre['header']['Kode_Jurnal'].'Periode'.$apre['header']['Periode'].'
Tanggal'.tgl_sql2str($apre['header']['Tanggal']).'Tipe Jurnal['.$apre['header']['Kode_Tipe']."] Jurnal ".$apre['header']['Nama_Tipe'].'
Kode Referensi'.$apre['header']['Kode_Ref'].'Informasi User['.isi_nol($apre['header']['UserID'],3)."] ".$apre['header']['NamaUser'].'
Keterangan'.$apre['header']['Catatan'].'
Status'.$apre['header']['Status'].'
'; + echo $kop; + + $pre->show_headers(); + foreach ($apre['detail'] as $row) { + $pre->add_row([ $row['ID'], $row['Kode_Rek'], $row['Nama_Rek'], $row['DK'], $row['Debit'], $row['Kredit'] ]); + } + + $pre->add_stamp(1, true); + $pre->show(); + } + + public function index() { + $form = new Form($this->app); + $tkode = $form->textbox("_", "Kode_Jurnal", "", true, false, "text", "kode jurnal"); + $this->app->json([ 'html' => ' +
+ +
'.$tkode.'
+
' + ]); + } + +} diff --git a/app/Controller/Report/Gel/HarianjurnalController.php b/app/Controller/Report/Gel/HarianjurnalController.php new file mode 100644 index 0000000..b08aac7 --- /dev/null +++ b/app/Controller/Report/Gel/HarianjurnalController.php @@ -0,0 +1,149 @@ +app = $app; + $this->db = $db; + $this->reg_name = $session->get('WEB_APP')['REG_NAME']; + } + + private function prepare() { + $apre = [ + 'id_tipe' => Param::Int("TipeID"), + 'tgl_from' => Param::Get("Tgl_From"), + 'tgl_to' => Param::Get("Tgl_To"), + ]; + + $apre['nama_tipe'] = ($apre['id_tipe'] > 0) ? ($this->db->fetchField("SELECT Nama_Tipe FROM gel_tipe WHERE TipeID=?", [$apre['id_tipe']]) ?? '') : ''; + + // generate report header + $apre['periode'] = $apre['tgl_from'] . ($apre['tgl_from'] !== $apre['tgl_to'] ? ' s/d '.$apre['tgl_to'] : ''); + + $tsql = ''; $asql = [tgl_sql2str($apre['tgl_from']), tgl_sql2str($apre['tgl_to'])]; + if ($apre['id_tipe'] > 0) { + $tsql .= " AND TipeID=?"; + array_push($asql, $apre['id_tipe']); + } + + $apre['query'] = $this->db->runQuery("SELECT D.Kode_Jurnal, D.Kode_Rek, A.Nama_Rek, J.Catatan, IF(D.DK='D',D.Jumlah,0) Debit, IF(D.DK='K',D.Jumlah*-1,0) Kredit FROM (SELECT * FROM gel_jurnal_detail WHERE Tgl_Ref BETWEEN ? AND ?".$tsql.") D LEFT JOIN gel_jurnal J ON (D.Kode_Jurnal=J.Kode_Jurnal) LEFT JOIN gel_acc A ON (D.Kode_Rek=A.Kode_Rek) ORDER BY D.Kode_Jurnal, D.DK", $asql); + return $apre; + } + + public function print() { + $apre = $this->prepare(); + + $pre = new PrintHTML($this->app); + $pre->add_title([strtoupper($this->reg_name), "JURNAL HARIAN", "Periode : ".$apre['periode']]); + + $pre->add_field("Kode Jurnal",20,"C"); + $pre->add_field("Kode",15,"C"); + $pre->add_field("Nama Rekening",100,"L"); + $pre->add_field("Deskripsi",150,"L"); + $pre->add_field("Debit",20,"R","rupiah"); + $pre->add_field("Kredit",20,"R","rupiah"); + + if ($apre['id_tipe'] > 0) $pre->add_sub_title("Tipe Jurnal : ".$apre['nama_tipe']); + + $pre->show_titles(); + $pre->show_headers(); + + $tot_debit = 0; $tot_kredit = 0; + while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) { + $tot_debit += $row['Debit']; + $tot_kredit += $row['Kredit']; + + $pre->add_row([ $row['Kode_Jurnal'], $row['Kode_Rek'], $row['Nama_Rek'], $row['Catatan'], $row['Debit'], $row['Kredit'] ]); + } + $pre->add_span([ ["TOTAL",4,"R,B"],[$tot_debit,1,"R,B","rupiah"],[$tot_kredit,1,"R,B","rupiah"] ]); + + $pre->add_stamp(1, true); + $pre->show(); + } + + public function excel() { + $apre = $this->prepare(); + $xls = new Xlsx($this->app); + $xls->set_meta([ + 'title' => "Data Jurnal Harian", + 'desc' => "Export Data Jurnal Harian" + ]); + $xls->add_title([ $this->reg_name, "DATA JURNAL HARIAN", "Periode : ".$apre['periode'] ]); + + $xls->add_field("Kode Jurnal", 12, "@text"); + $xls->add_field("Kode", 10, "@text"); + $xls->add_field("Nama Rekening", 30, "@text"); + $xls->add_field("Deskripsi", 40, "@text"); + $xls->add_field("Debit", 15, "#,##0.00"); + $xls->add_field("Kredit", 15, "#,##0.00"); + $xls->add_sheet("".str_replace("s/d","-",$apre['periode'])); + + if ($apre['id_tipe'] > 0) $xls->add_sub_title("Tipe Jurnal : ".$apre['nama_tipe']); + + $xls->show_titles(); + $xls->show_headers(); + + $tot_debit = 0; $tot_kredit = 0; + while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) { + $tot_debit += $row['Debit']; + $tot_kredit += $row['Kredit']; + + $xls->add_row([ $row['Kode_Jurnal'], $row['Kode_Rek'], $row['Nama_Rek'], $row['Catatan'], $row['Debit'], $row['Kredit'] ]); + } + $xls->add_row_bold([ "", "", "TOTAL", "", $tot_debit, $tot_kredit ]); + + $xls->add_stamp(1, true); + $xls->download("Data Jurnal Harian ".str_replace("s/d","-",$apre['periode']).".xlsx"); + unset($xls); + } + + public function index() { + $form = new Form($this->app); + $ttipe = $form->option_db("_", "TipeID", 0, true, false, "gel_tipe", ["TipeID","Nama_Tipe"], "Aktif=1", [0,"SEMUA TIPE"]); + $tfrom = $form->datebox("_", "Tgl_From", tgl_ymd(), true, false); + $tto = $form->datebox("_", "Tgl_To", tgl_ymd(), true, false); + $this->app->json([ 'html' => ' +
+ +
'.$ttipe.'
+
+
+ +
'.$tfrom.'
+
+
+ +
'.$tto.'
+
' + ]); + } + +} diff --git a/app/Controller/Report/Gel/HariansaldoController.php b/app/Controller/Report/Gel/HariansaldoController.php new file mode 100644 index 0000000..e2fddeb --- /dev/null +++ b/app/Controller/Report/Gel/HariansaldoController.php @@ -0,0 +1,131 @@ +app = $app; + $this->db = $db; + $this->reg_name = $session->get('WEB_APP')['REG_NAME']; + } + + private function prepare() { + $apre = [ + 'tgl_from' => Param::Get("Tgl_From"), + 'tgl_to' => Param::Get("Tgl_To"), + ]; + + // generate report header + $apre['periode'] = $apre['tgl_from'] . ($apre['tgl_from'] !== $apre['tgl_to'] ? ' s/d '.$apre['tgl_to'] : ''); + + $apre['query'] = $this->db->runQuery("SELECT D.*, A.Nama_Rek FROM (SELECT Kode_Rek, SUM(IF(DK='D',Jumlah,0)) Debit, SUM(IF(DK='K',Jumlah*-1,0)) Kredit, SUM(Jumlah) Saldo FROM gel_jurnal_detail WHERE Tgl_Ref BETWEEN ? AND ? GROUP BY Kode_Rek) D LEFT JOIN gel_acc A ON (D.Kode_Rek=A.Kode_Rek)", [tgl_sql2str($apre['tgl_from']), tgl_sql2str($apre['tgl_to'])]); + return $apre; + } + + public function print() { + $apre = $this->prepare(); + + $pre = new PrintHTML($this->app); + $pre->add_title([strtoupper($this->reg_name), "REKAP SALDO HARIAN", "Periode : ".$apre['periode']]); + + $pre->add_field("No.",10,"C"); + $pre->add_field("Kode",20,"C"); + $pre->add_field("Nama Rekening",100,"L"); + $pre->add_field("Debit",20,"R","rupiah"); + $pre->add_field("Kredit",20,"R","rupiah"); + $pre->add_field("Saldo",20,"R","rupiah"); + + $pre->show_titles(); + $pre->show_headers(); + + $nomor = 0; $tot_debit = 0; $tot_kredit = 0; $tot_saldo = 0; + while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) { + $tot_debit += $row['Debit']; + $tot_kredit += $row['Kredit']; + $tot_saldo += $row['Saldo']; + $pre->add_row([ ++$nomor, $row['Kode_Rek'], $row['Nama_Rek'], $row['Debit'], $row['Kredit'], $row['Saldo'] ]); + } + $pre->add_span([ ["TOTAL",3,"R,B"],[$tot_debit,1,"R,B","rupiah"],[$tot_kredit,1,"R,B","rupiah"],[$tot_saldo,1,"R,B","rupiah"] ]); + + $pre->add_stamp(1, true); + $pre->show(); + } + + public function excel() { + $apre = $this->prepare(); + $xls = new Xlsx($this->app); + $xls->set_meta([ + 'title' => "Data Rekap Saldo Harian", + 'desc' => "Export Data Rekap Saldo Harian" + ]); + $xls->add_title([ $this->reg_name, "DATA REKAP SALDO HARIAN", "Periode : ".$apre['periode'] ]); + + $xls->add_field("No.", 5, "@integer"); + $xls->add_field("Kode", 10, "@text"); + $xls->add_field("Nama Rekening", 30, "@text"); + $xls->add_field("Debit", 15, "#,##0.00"); + $xls->add_field("Kredit", 15, "#,##0.00"); + $xls->add_field("Saldo", 15, "#,##0.00"); + $xls->add_sheet("".str_replace("s/d","-",$apre['periode'])); + + $xls->show_titles(); + $xls->show_headers(); + + $nomor = 0; $tot_debit = 0; $tot_kredit = 0; $tot_saldo = 0; + while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) { + $tot_debit += $row['Debit']; + $tot_kredit += $row['Kredit']; + $tot_saldo += $row['Saldo']; + $xls->add_row([ ++$nomor, $row['Kode_Rek'], $row['Nama_Rek'], $row['Debit'], $row['Kredit'], $row['Saldo'] ]); + } + $xls->add_row_bold([ "", "", "TOTAL", $tot_debit, $tot_kredit, $tot_saldo ]); + + $xls->add_stamp(1, true); + $xls->download("Data Rekap Saldo Harian ".str_replace("s/d","-",$apre['periode']).".xlsx"); + unset($xls); + } + + public function index() { + $form = new Form($this->app); + $tfrom = $form->datebox("_", "Tgl_From", tgl_ymd(), true, false); + $tto = $form->datebox("_", "Tgl_To", tgl_ymd(), true, false); + $this->app->json([ 'html' => ' +
+ +
'.$tfrom.'
+
+
+ +
'.$tto.'
+
' + ]); + } + +} diff --git a/app/Controller/Report/Inv/BarcodeController.php b/app/Controller/Report/Inv/BarcodeController.php new file mode 100644 index 0000000..56b3527 --- /dev/null +++ b/app/Controller/Report/Inv/BarcodeController.php @@ -0,0 +1,201 @@ +app = $app; + $this->db = $db; + $this->ip_addr = $app->request()->ip; + $this->id_cab = $session->get('APP_INV')['CABANGID'] ?? 0; + $this->id_grup = $session->get('APP_INV')['ECERANID'] ?? 0; + } + + public function brow_produk() { + $tcari = Param::Get("Cari_Produk"); + $tsql = ''; $asql = [$this->id_grup, 1]; + if (!empty($tcari)) { + $tsql .= " AND Barcode_Nama LIKE ?"; + $asql[] = '%' . $tcari . '%'; + } + + $obj = new Table($this->app); + $obj->set_table("inv_produk_join", "*", "Grup_MemberID=? AND Aktif=?".$tsql, $asql); + $obj->add_field("InvID", "ID", "hid"); + $obj->add_field("SatuanID", "ID", "hid"); + $obj->add_field("VarianID", "ID", "hid"); + $obj->add_field("Kode_SKU", "SKU", "c"); + $obj->add_field("Kode_Barcode", "Barcode", "c"); + $obj->add_field("Nama_Lengkap", "Nama Barang", "awr"); + $obj->set_field_order("Kode_SKU", "A"); + $obj->set_func_select("RepoInvBarcodeJS.produk_select"); + $this->app->json([ $obj->db_table("divBrowProduk") ]); + } + + public function auto_produk() { + $tcari = Param::Get("Auto_Query", ""); + $ajson['autodata'] = []; + $bcode = 0; $arec = []; + + // Cari by SKU + Barcode + $_row = $this->db->fetchRow("SELECT P.InvID,P.Nama_Lengkap,CONCAT(P.SatuanID,':',P.VarianID,':',P.Kode_SKU) Data2 FROM (SELECT * FROM inv_produk_join WHERE Grup_MemberID=? AND Aktif=1 AND (Kode_SKU=? OR Kode_Barcode=?)) P", [$this->id_grup, $tcari, $tcari]); + if ($_row) { + $bcode = 1; + $arec = $_row->getData(); + } + if ($bcode === 1) { + $ajson['autodata'][] = ['value'=>$arec['InvID'], 'text'=>$arec['Nama_Lengkap'], 'data'=>$arec['Data2'], 'bc'=>1]; + } else { + $stat = $this->db->runQuery("SELECT P.InvID,P.Nama_Lengkap,P.Kode_SKU,CONCAT(P.SatuanID,':',P.VarianID,':',P.Kode_SKU) Data2 FROM (SELECT * FROM inv_produk_join WHERE Barcode_Nama LIKE ? AND Grup_MemberID=? AND Aktif=1) P ORDER BY P.Nama_Produk,P.Qty LIMIT 50", ['%'.$tcari.'%', $this->id_grup]); + while ($row = $stat->fetch(SimplePdo::FETCH_ASSOC)) { + $ajson['autodata'][] = ['value'=>$row['InvID'], 'text'=>$row['Nama_Lengkap'], 'html'=>''.$row['Kode_SKU'].' '.$row['Nama_Lengkap'], 'data'=>$row['Data2'], 'bc'=>0]; + } + } + $this->app->json($ajson); + } + + public function barcode() { + $id_inv = Param::Int("InvID", 0); + $id_sat = Param::Int("SatuanID", 0); + $id_var = Param::Int("VarianID", 0); + $qty = Param::Int("Qty", 3); + $nkolom = (str_contains(Param::Get("Printer"), "XP")) ? 2 : 3; + $nbaris = (int) ceil($qty / $nkolom); + $ajson = []; + + $barang = $this->db->fetchRow("SELECT Kode_SKU,Harga_Jual,LEFT(Nama_Lengkap,20) Nama FROM inv_produk_join WHERE InvID=? AND SatuanID=? AND VarianID=? AND Grup_MemberID=? ORDER BY Harga_Jual DESC LIMIT 1", [$id_inv, $id_sat, $id_var, $this->id_grup]); + if ($barang) { + $ajson = ['type' => "epl", 'config' => ['times' => 1], 'content' => $this->gen_bc_epl("Rp.".rupiah($barang->Harga_Jual), $barang->Nama, $barang->Kode_SKU, $nbaris, $nkolom)]; + } + $this->app->json($ajson); + } + + public function load_printer() { + $aprint = json_decode(stripslashes(Param::Get("Printer", "[]")), true); + $avalue = [['value'=>"", 'html'=>"Pilih Printer"]]; + $tdefp = Param::Get("DefPrint", ""); + $this->db->runQuery("DELETE FROM app_printer WHERE IP=? AND CabID=?", [$this->ip_addr, $this->id_cab]); + foreach ($aprint as $_val) { + if (!empty($_val)) { + $this->db->runQuery("INSERT IGNORE INTO app_printer SET IP=?,CabID=?,N_Printer=?,Defa=?", [$this->ip_addr, $this->id_cab, $_val, ($tdefp === $_val) ? 1 : 0]); + } + } + $aprinter = $this->db->fetchAll("SELECT * FROM app_printer WHERE IP=? AND CabID=?", [$this->ip_addr, $this->id_cab]); + foreach ($aprinter as $row) $avalue[] = ['value'=>$row['N_Printer'], 'html'=>$row['N_Printer']]; + $ajson[] = ['type'=>"option", 'id'=>"Printer", 'avalue'=>$avalue]; + $this->app->json($ajson); + } + + public function index() { + $form = new Form($this->app); + $tsku = $form->textbox("_", "Kode_SKU", null, false, false); + $tproduk = $form->textauto("_", "Nama_Produk", ['value'=>0,'text'=>""], true, true, "nama barang"); + $tprt = $form->option_db("_", "Printer", "", true, false, "app_printer", ["N_Printer","N_Printer"], "IP='".$this->ip_addr."' AND CabID='".(string) $this->id_cab."'", [0,"Pilih Printer"]); + $tqty = $form->textbox("_", "Qty", 3, true, false, "number"); + $ajson['html'] = ' +
+ +
'.$tsku.'
+
+
+ +
'.$tproduk.'
+
+

+
+ +
'.$tprt.'
+
+
+ +
'.$tqty.Invesa::Form_Info("Untuk menghemat stiker, bisa gunakan jumlah cetak dalam kelipatan 3.").'
+
+ + + '; + $this->app->json($ajson); + } + + private function gen_bc_epl(string $harga="", string $nama="", string $barc="", int $baris=1, int $kolom=3): array { + if ($kolom == 2) { + //q582 + $hasil = ['N', + 'Q120,24', + 'A6,99,3,3,1,1,N,"Cahaya"', + 'A26,83,3,3,1,1,N,"Masa"', + 'A14,1,0,2,1,1,N,"'.$nama.'"', + 'B54,22,0,1,2,5,60,N,"'.$barc.'"', + 'A64,75,0,4,1,1,N,"'.$harga.'"', + 'A238,22,1,3,1,1,N,"HSmart"', + 'A258,30,1,3,1,1,N,"RYN\'S"', + 'A293,99,3,3,1,1,N,"Cahaya"', + 'A313,83,3,3,1,1,N,"Masa"', + 'A301,1,0,2,1,1,N,"'.$nama.'"', + 'B341,22,0,1,2,5,60,N,"'.$barc.'"', + 'A351,72,0,4,1,1,N,"'.$harga.'"', + 'A525,22,1,3,1,1,N,"HSmart"', + 'A545,30,1,3,1,1,N,"RYN\'S"', + 'P'.$baris, + '']; + + } else { + //q960 + $hasil = ['N', + 'Q120,24', + 'A4,98,3,3,1,1,N,"Cahaya"', + 'A24,82,3,3,1,1,N,"Masa"', + 'A12,0,0,2,1,1,N,"'.$nama.'"', + 'B52,21,0,1,2,5,60,N,"'.$barc.'"', + 'A62,74,0,4,1,1,N,"'.$harga.'"', + 'A236,21,1,3,1,1,N,"HSmart"', + 'A256,29,1,3,1,1,N,"RYN\'S"', + 'A284,98,3,3,1,1,N,"Cahaya"', + 'A304,82,3,3,1,1,N,"Masa"', + 'A292,0,0,2,1,1,N,"'.$nama.'"', + 'B332,21,0,1,2,5,60,N,"'.$barc.'"', + 'A342,71,0,4,1,1,N,"'.$harga.'"', + 'A516,21,1,3,1,1,N,"HSmart"', + 'A536,29,1,3,1,1,N,"RYN\'S"', + 'A564,98,3,3,1,1,N,"Cahaya"', + 'A584,82,3,3,1,1,N,"Masa"', + 'A572,0,0,2,1,1,N,"'.$nama.'"', + 'B612,21,0,1,2,5,60,N,"'.$barc.'"', + 'A622,71,0,4,1,1,N,"'.$harga.'"', + 'A796,21,1,3,1,1,N,"HSmart"', + 'A816,29,1,3,1,1,N,"RYN\'S"', + 'P'.$baris, + '']; + } + return $hasil; + } + +} diff --git a/app/Controller/Report/Inv/HutangController.php b/app/Controller/Report/Inv/HutangController.php new file mode 100644 index 0000000..c0066b0 --- /dev/null +++ b/app/Controller/Report/Inv/HutangController.php @@ -0,0 +1,211 @@ +app = $app; + $this->db = $db; + $this->id_cab = Param::Int("CabID", 0); + $this->reg_name = $session->get('WEB_APP')['REG_NAME']; + } + + private function prepare() { + $apre = [ + 'tipe' => Param::Get("Tipe", "R"), // R or D + 'id_sup' => Param::Int("SupID", 0), + 'tgl_from' => Param::Get("Tgl_From"), + 'tgl_to' => Param::Get("Tgl_To"), + ]; + + $apre['nama_sup'] = ($apre['id_sup'] > 0) ? ($this->db->fetchField("SELECT CONCAT(Nama_Sup,' (',Kode_Sup,')') Nama FROM para_supplier WHERE SupID=?", [$apre['id_sup']]) ?? '') : ''; + + // generate report header + $apre['periode'] = $apre['tgl_from'] . ($apre['tgl_from'] !== $apre['tgl_to'] ? ' s/d '.$apre['tgl_to'] : ''); + + $tsql = ''; $asql = [tgl_sql2str($apre['tgl_from']), tgl_sql2str($apre['tgl_to'])]; + if ($this->id_cab > 0) { + $tsql .= " AND CabID=?"; + array_push($asql, $this->id_cab); + } + if ($apre['id_sup'] > 0) { + $tsql .= " AND SupID=?"; + array_push($asql, $apre['id_sup']); + } + + if ($apre['tipe'] === "R") { + $apre['query'] = $this->db->runQuery("SELECT B.*,S.Nama_Sup FROM (SELECT SupID,SUM(Real_Beli) Total_Hutang,SUM(Total_Bayar+Total_Potong) Total_Bayar FROM inv_beli WHERE Lunas=0 AND (Tgl_Beli BETWEEN ? AND ?)".$tsql." GROUP BY SupID) B LEFT JOIN para_supplier S ON (B.SupID=S.SupID) ORDER BY S.Nama_Sup", $asql); + } else { + $apre['query'] = $this->db->runQuery("SELECT B.*,CONCAT(S.Nama_Sup,IF(B.Data_Beli=1,'',' (Retur)')) Nama_Sup,B.Real_Beli Total_Hutang,B.Total_Bayar+B.Total_Potong Total_Bayar FROM (SELECT * FROM inv_beli WHERE Lunas=0 AND (Tgl_Beli BETWEEN ? AND ?)".$tsql.") B LEFT JOIN para_supplier S ON (B.SupID=S.SupID) ORDER BY B.No_Beli", $asql); + } + return $apre; + } + + public function print() { + $apre = $this->prepare(); + + $pre = new PrintHTML($this->app); + $pre->add_title([strtoupper($this->reg_name), ($apre['tipe']==="R"?"REKAP":"DETAIL")." HUTANG SUPPLIER", "Periode : ".$apre['periode']]); + + if ($apre['tipe'] === "R") { + $pre->add_field("No.",10,"C"); + $pre->add_field("Nama Supplier",50,"L"); + $pre->add_field("Jumlah Faktur",20,"R","rupiah"); + $pre->add_field("Jumlah Bayar",20,"R","rupiah"); + $pre->add_field("Sisa Hutang",20,"R","rupiah"); + + if ($apre['id_sup'] > 0) $pre->add_sub_title("Nama Supplier : ".$apre['nama_sup']); + + $pre->show_titles(); + $pre->show_headers(); + + $tot_hutang = 0; $tot_bayar = 0; $nomor = 0; + while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) { + $tot_hutang += $row['Total_Hutang']; + $tot_bayar += $row['Total_Bayar']; + $pre->add_row([ ++$nomor, $row['Nama_Sup'], $row['Total_Hutang'], $row['Total_Bayar'], $row['Total_Hutang'] - $row['Total_Bayar'] ]); + } + $pre->add_span([ ["GRAND TOTAL",2,"R,B"],[$tot_hutang,1,"R,B","rupiah"],[$tot_bayar,1,"R,B","rupiah"],[$tot_hutang-$tot_bayar,1,"R,B","rupiah"] ]); + + } else { + $pre->add_field("No. Nota",30,"C"); + $pre->add_field("Tgl. Nota",30,"C", "tgl_sql2str"); + $pre->add_field("Nama Supplier",50,"L"); + $pre->add_field("Jumlah",20,"R","rupiah"); + $pre->add_field("Bayar",20,"R","rupiah"); + $pre->add_field("Sisa Hutang",20,"R","rupiah"); + + if ($apre['id_sup'] > 0) $pre->add_sub_title("Nama Supplier : ".$apre['nama_sup']); + + $pre->show_titles(); + $pre->show_headers(); + + $tot_hutang = 0; $tot_bayar = 0; + while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) { + $tot_hutang += $row['Total_Hutang']; + $tot_bayar += $row['Total_Bayar']; + $pre->add_row([ $row['No_Beli'], $row['Tgl_Beli'], $row['Nama_Sup'], $row['Total_Hutang'], $row['Total_Bayar'], $row['Total_Hutang'] - $row['Total_Bayar'] ]); + } + $pre->add_span([ ["GRAND TOTAL",3,"R,B"],[$tot_hutang,1,"R,B","rupiah"],[$tot_bayar,1,"R,B","rupiah"],[$tot_hutang-$tot_bayar,1,"R,B","rupiah"] ]); + } + $pre->add_stamp(1, true); + $pre->show(); + } + + public function excel() { + $apre = $this->prepare(); + $xls = new Xlsx($this->app); + $xls->set_meta([ + 'title' => "Data Hutang Supplier", + 'desc' => "Export Data Hutang Supplier" + ]); + $xls->add_title([ $this->reg_name, "DATA ".($apre['tipe']==="R"?"REKAP":"DETAIL")." HUTANG SUPPLIER", "Periode : ".$apre['periode'] ]); + + if ($apre['tipe'] === "R") { + $xls->add_field("No.", 5, "@integer"); + $xls->add_field("Nama Supplier", 25, "@text"); + $xls->add_field("Jumlah Faktur", 15, "#,##0.00"); + $xls->add_field("Jumlah Bayar", 15, "#,##0.00"); + $xls->add_field("Sisa Hutang", 15, "#,##0.00"); + $xls->add_sheet("".str_replace("s/d","-",$apre['periode'])); + + if ($apre['id_sup'] > 0) $xls->add_sub_title("Nama Supplier : ".$apre['nama_sup']); + + $xls->show_titles(); + $xls->show_headers(); + + $tot_hutang = 0; $tot_bayar = 0; $nomor = 0; + while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) { + $tot_hutang += $row['Total_Hutang']; + $tot_bayar += $row['Total_Bayar']; + $xls->add_row([ ++$nomor, $row['Nama_Sup'], $row['Total_Hutang'], $row['Total_Bayar'], $row['Total_Hutang'] - $row['Total_Bayar'] ]); + } + $xls->add_row_bold([ "", "GRAND TOTAL", $tot_hutang, $tot_bayar, $tot_hutang-$tot_bayar ]); + + } else { + $xls->add_field("No. Nota", 15, "@"); + $xls->add_field("Tgl. Nota", 12, "@date"); + $xls->add_field("Nama Supplier", 20, "@text"); + $xls->add_field("Jumlah", 15, "#,##0.00"); + $xls->add_field("Bayar", 15, "#,##0.00"); + $xls->add_field("Sisa Hutang", 15, "#,##0.00"); + $xls->add_sheet("".str_replace("s/d","-",$apre['periode'])); + + if ($apre['id_sup'] > 0) $xls->add_sub_title("Nama Supplier : ".$apre['nama_sup']); + + $xls->show_titles(); + $xls->show_headers(); + + $tot_hutang = 0; $tot_bayar = 0; + while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) { + $tot_hutang += $row['Total_Hutang']; + $tot_bayar += $row['Total_Bayar']; + $xls->add_row([ $row['No_Beli'], $row['Tgl_Beli'], $row['Nama_Sup'], $row['Total_Hutang'], $row['Total_Bayar'], $row['Total_Hutang'] - $row['Total_Bayar'] ]); + } + $xls->add_row_bold([ "", "", "GRAND TOTAL", $tot_hutang, $tot_bayar, $tot_hutang-$tot_bayar ]); + } + $xls->add_stamp(1, true); + $xls->download("Data Hutang Supplier ".str_replace("s/d","-",$apre['periode']).".xlsx"); + unset($xls); + } + + public function index() { + $form = new Form($this->app); + $ttipe = $form->radio("_", "Tipe", "R", true, false, ["R"=>"Rekap","D"=>"Detail"]); + $tcab = $form->option_db("_", "CabID", $this->id_cab, true, false, "para_cabang", ["CabID","Nama_Cab"], "Aktif=1 ORDER BY CabID", [0,"SEMUA CABANG"]); + $tsup = $form->option_db("_", "SupID", 0, true, false, "para_supplier", ["SupID","Nama_Sup"], "Aktif=1 ORDER BY Nama_Sup", [0,"SEMUA SUPPLIER"]); + $tfrom = $form->datebox("_", "Tgl_From", tgl_ymd(), true, false); + $tto = $form->datebox("_", "Tgl_To", tgl_ymd(), true, false); + $ajson['html'] = ' +
+ +
'.$ttipe.'
+
+
+ +
'.$tcab.'
+
+
+ +
'.$tsup.'
+
+
+ +
'.$tfrom.'
+
+
+ +
'.$tto.'
+
'; + $this->app->json($ajson); + } + +} diff --git a/app/Controller/Report/Inv/LabelController.php b/app/Controller/Report/Inv/LabelController.php new file mode 100644 index 0000000..0717a57 --- /dev/null +++ b/app/Controller/Report/Inv/LabelController.php @@ -0,0 +1,188 @@ +app = $app; + $this->db = $db; + $this->mode = Param::Get("mode", ""); + $this->mode_detail = Param::Get("mode_detail", ""); + $this->id_grup = $session->get('APP_INV')['ECERANID'] ?? 0; + } + + public function table_detail() { + if ( $this->mode_detail === "empty" ) { + $this->db->runQuery("TRUNCATE rep_label"); + } else if ( $this->mode_detail === "update" ) { + $this->db->runQuery("UPDATE rep_label SET Nama_Produk=? WHERE ID=?", [Param::Get("Nama_Produk"), Param::Int("ID", 0)]); + } else if ( $this->mode_detail === "delete" ) { + $this->db->runQuery("DELETE FROM rep_label WHERE ID=?", [Param::Int("ID", 0)]);; + } else if ( $this->mode_detail === "simpan-produk" ) { + $list_id = Param::Get("List_CB_InvID", "0"); + if ($list_id !== "0") { + $alist = explode(",", $list_id); + $this->db->runQuery("INSERT INTO rep_label (InvID,Nama_Produk,Harga_Jual,UserID) SELECT InvID,LEFT(Nama_Produk,25),Harga_Jual,? FROM inv_produk_join WHERE InvID IN (?) AND Grup_MemberID=?", [$this->app->user()->id(), $alist, $this->id_grup]); + } + } else if ( $this->mode_detail === "simpan-grup" ) { + $id_grup = Param::Int("Grup_InvID", 0); + if ($id_grup > 0) { + $this->db->runQuery("INSERT INTO rep_label (InvID,Nama_Produk,Harga_Jual,UserID) SELECT InvID,LEFT(Nama_Produk,25),Harga_Jual,? FROM inv_produk_join WHERE Aktif=1 AND Grup_MemberID=? AND Grup_InvID=? AND Harga_Jual>0", [$this->app->user()->id(), $this->id_grup, $id_grup]); + } + } + + $obj = new Table($this->app); + $obj->set_table("rep_label", "*", "", []); + $obj->add_field("ID", "No", "c"); + $obj->add_field("Nama_Produk", "Nama Barang", "awr"); + $obj->add_field("Harga_Jual", "Harga @", "r", "rupiah"); + $obj->set_field_order("ID", "D"); + $obj->add_row_btn("clipboard", "Ubah", "RepoInvLabelJS.detail_ubah"); + $obj->add_row_btn("trash", "Hapus", "RepoInvLabelJS.detail_hapus", "UserID", $this->app->user()->id()); + $obj->set_func_btn("RepoInvLabelJS.produk_brow", ' Barang'); + $obj->set_func_btn("RepoInvLabelJS.grup_brow", ' Browse'); + $ajson[] = $obj->json_table("divDetailTabel"); + $this->app->json($ajson); + } + + public function brow_grup() { + $tcari = Param::Get("Cari_Grup"); + $tsql = ''; $asql = []; + if (!empty($tcari)) { + $tsql .= " AND CONCAT(Kode_Grup,Nama_Grup) LIKE ?"; + array_push($asql, '%' . $tcari . '%'); + } + + $obj = new Table($this->app); + $obj->set_table("inv_produk_grup", "*", "Aktif=1".$tsql, $asql); + $obj->add_field("Grup_InvID", "ID", "hid"); + $obj->add_field("Kode_Grup", "Kode", "c"); + $obj->add_field("Nama_Grup", "Nama Grup Barang", "awr"); + $obj->set_field_order("Kode_Grup", "A"); + $obj->set_func_select("RepoInvLabelJS.grup_select"); + $this->app->json([ $obj->db_table("divBrowGrup") ]); + } + + public function brow_produk() { + $tcari = Param::Get("Cari_Produk"); + $tsql = ''; $asql = []; + if (!empty($tcari)) { + $tsql .= " AND Barcode_Nama LIKE ?"; + array_push($asql, '%' . $tcari . '%'); + } + + $obj = new Table($this->app); + $obj->set_table("(SELECT * FROM inv_produk_join WHERE Aktif=1".$tsql." GROUP BY InvID,SatuanID,VarianID) P LEFT JOIN rep_label L ON (L.InvID=P.InvID)", "P.*,IF(IFNULL(L.InvID,0)=0,'N','Y') Pilih", "", $asql); + $obj->add_field("InvID", "ID", "hid"); + $obj->add_field("SatuanID", "ID", "hid"); + $obj->add_field("VarianID", "ID", "hid"); + $obj->add_field("Kode_SKU", "SKU", "c"); + $obj->add_field("Kode_Barcode", "Barcode", "c"); + $obj->add_field("Nama_Lengkap", "Nama Barang", "awr"); + $obj->set_field_order("Kode_SKU", "A"); + $obj->add_row_checkbox("InvID", "Pilih", ['Y','N']); + $this->app->json([ $obj->db_table("divBrowProduk") ]); + } + + public function form_detail() { + $id = Param::Int("ID", 0); + $atabel = [ 'ID'=>$id, 'Nama_Produk'=>"" ]; + if ($id > 0) { + $_row = $this->db->fetchRow("SELECT * FROM rep_label WHERE ID=?", [$id]); + if ($_row) $atabel = array_merge($atabel, $_row->getData()); + } + + $form = new Form($this->app); + $tproduk = $form->textbox("_", "Nama_Produk", $atabel['Nama_Produk'], true, false, "text"); + $ajson['html'] = ' +
+ +
'.$tproduk.'
+
+ + '; + $this->app->json($ajson); + } + + public function print() { + $query = $this->db->runQuery("SELECT * FROM rep_label ORDER BY ID"); + if ($query->rowCount() === 0) return false; + + $_head = ''; + $_line = ''; + $ni = 1; $nb = 1; $cont = ""; + while ($row = $query->fetch(SimplePdo::FETCH_ASSOC)) { + if ($ni === 4) { + if ($nb === 8) { + $cont .= '
%s
%s

................ page break ................

 

' . $_head; + $nb = 0; + } else { + $cont .= ''; + } + $ni = 1; + $nb++; + } + $cont .= sprintf($_line, $row['Nama_Produk'], "Rp. ".rupiah($row['Harga_Jual'])); + $ni++; + } + if ($ni < 4) { + while ($ni < 4) { + $cont .= sprintf($_line, "", ""); + $ni++; + } + } + echo '

 

' . $_head . $cont . ""; + } + + public function index() { + $this->app->json(['html' => ' +
+
+ +
+
+
 
+
+
+
+
' + ]); + } +} diff --git a/app/Controller/Report/Inv/PiutangController.php b/app/Controller/Report/Inv/PiutangController.php new file mode 100644 index 0000000..e9132af --- /dev/null +++ b/app/Controller/Report/Inv/PiutangController.php @@ -0,0 +1,245 @@ +app = $app; + $this->db = $db; + $this->id_cab = Param::Int("CabID", 0); + $this->reg_name = $session->get('WEB_APP')['REG_NAME']; + } + + public function brow_member() { + $tcari = Param::Get("Cari_Member"); + $tsql = ''; $asql = [1]; + if (!empty($tcari)) { + $tsql .= " AND CONCAT_WS(Kode_Member,Nama_Member,Alamat_Member,Telp_Member) LIKE ?"; + $asql[] = '%' . $tcari . '%'; + } + + $obj = new Table($this->app); + $obj->set_table("para_member", "*,CONCAT(IF(Kode_Member='','',CONCAT(Kode_Member,' - ')),Nama_Member) Kode_Nama", "Aktif=?".$tsql, $asql); + $obj->add_field("MemberID", "ID", "hid"); + $obj->add_field("Kode_Nama", "Kode_Nama", "hid"); + $obj->add_field("Kode_Member", "Kode", "c"); + $obj->add_field("Nama_Member", "Nama Member", "awr"); + $obj->add_field("Alamat_Member", "Alamat", "awr"); + $obj->add_field("Telp_Member", "Telp.", "awr"); + $obj->set_field_order("Nama_Member", "A"); + $obj->set_func_select("RepoInvPiutangJS.member_select"); + $this->app->json([ $obj->db_table("divBrowMember") ]); + } + + public function auto_member() { + $tcari = Param::Get("Auto_Query", ""); + $ajson['autodata'] = []; + + $stat = $this->db->runQuery("SELECT MemberID,Grup_MemberID,Kode_Member,Nama_Member,CONCAT(IF(Kode_Member='','',CONCAT(Kode_Member,' - ')),Nama_Member) Kode_Nama FROM para_member WHERE Aktif=1 AND CONCAT(Kode_Member,Nama_Member,Alamat_Member,Telp_Member) LIKE ? ORDER BY Nama_Member LIMIT 50", ['%'.$tcari.'%']); + while ($row = $stat->fetch(SimplePdo::FETCH_ASSOC)) { + $ajson['autodata'][] = ['value'=>$row['MemberID'], 'text'=>$row['Kode_Nama'], 'html'=>''.$row['Kode_Member'].' '.$row['Nama_Member'], 'data'=>0, 'bc'=>0]; + } + $this->app->json($ajson); + } + + private function prepare() { + $apre = [ + 'tipe' => Param::Get("Tipe", "R"), // R or D + 'id_mem' => Param::Int("MemberID", 0), + 'tgl_from' => Param::Get("Tgl_From"), + 'tgl_to' => Param::Get("Tgl_To"), + ]; + + $apre['nama_mem'] = ($apre['id_mem'] > 0) ? ($this->db->fetchField("SELECT CONCAT(Nama_Member,' (',Kode_Member,')') Nama FROM para_member WHERE MemberID=?", [$apre['id_mem']]) ?? '') : ''; + + // generate report header + $apre['periode'] = $apre['tgl_from'] . ($apre['tgl_from'] !== $apre['tgl_to'] ? ' s/d '.$apre['tgl_to'] : ''); + + $tsql = ''; $asql = [tgl_sql2str($apre['tgl_from']), tgl_sql2str($apre['tgl_to'])]; + if ($this->id_cab > 0) { + $tsql .= " AND CabID=?"; + array_push($asql, $this->id_cab); + } + if ($apre['id_mem'] > 0) { + $tsql .= " AND MemberID=?"; + array_push($asql, $apre['id_mem']); + } + + if ($apre['tipe'] === "R") { + $apre['query'] = $this->db->runQuery("SELECT J.*,O.Nama_Member FROM (SELECT MemberID,SUM(Total_Jual-Total_Diskon) Total_Piutang,SUM(Total_Bayar+Total_Potong) Total_Bayar, SUM(Total_Jual-Total_Diskon-Total_Bayar-Total_Potong) Total_Sisa FROM inv_jual WHERE Lunas=0 AND (Tgl_Jual BETWEEN ? AND ?)".$tsql." GROUP BY MemberID) J LEFT JOIN para_member O ON (J.MemberID=O.MemberID) ORDER BY O.Nama_Member", $asql); + } else { + $apre['query'] = $this->db->runQuery("SELECT J.*,O.Nama_Member FROM (SELECT *,Total_Jual-Total_Diskon Total_Piutang,Total_Jual-Total_Diskon-Total_Bayar-Total_Potong Total_Sisa FROM inv_jual WHERE Lunas=0 AND (Tgl_Jual BETWEEN ? AND ?)".$tsql.") J LEFT JOIN para_member O ON (J.MemberID=O.MemberID) ORDER BY J.No_Jual", $asql); + } + return $apre; + } + + public function print() { + $apre = $this->prepare(); + + $pre = new PrintHTML($this->app); + $pre->add_title([strtoupper($this->reg_name), ($apre['tipe']==="R"?"REKAP":"DETAIL")." PIUTANG MEMBER", "Periode : ".$apre['periode']]); + + if ($apre['tipe'] === "R") { + $pre->add_field("No.",10,"C"); + $pre->add_field("Nama Member",50,"L"); + $pre->add_field("Jumlah Faktur",20,"R","rupiah"); + $pre->add_field("Jumlah Bayar",20,"R","rupiah"); + $pre->add_field("Sisa Piutang",20,"R","rupiah"); + + if ($apre['id_mem'] > 0) $pre->add_sub_title("Nama Member : ".$apre['nama_mem']); + + $pre->show_titles(); + $pre->show_headers(); + + $tot_piutang = 0; $tot_bayar = 0; $nomor = 0; + while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) { + $tot_piutang += $row['Total_Piutang']; + $tot_bayar += $row['Total_Bayar']; + $pre->add_row([ ++$nomor, $row['Nama_Member'], $row['Total_Piutang'], $row['Total_Bayar'], $row['Total_Sisa'] ]); + } + $pre->add_span([ ["GRAND TOTAL",2,"R,B"],[$tot_piutang,1,"R,B","rupiah"],[$tot_bayar,1,"R,B","rupiah"],[$tot_piutang-$tot_bayar,1,"R,B","rupiah"] ]); + + } else { + $pre->add_field("No. Nota",30,"C"); + $pre->add_field("Tgl. Nota",30,"C", "tgl_sql2str"); + $pre->add_field("Nama Member",50,"L"); + $pre->add_field("Jumlah",20,"R","rupiah"); + $pre->add_field("Bayar",20,"R","rupiah"); + $pre->add_field("Sisa Piutang",20,"R","rupiah"); + + if ($apre['id_mem'] > 0) $pre->add_sub_title("Nama Member : ".$apre['nama_mem']); + + $pre->show_titles(); + $pre->show_headers(); + + $tot_piutang = 0; $tot_bayar = 0; + while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) { + $tot_piutang += $row['Total_Piutang']; + $tot_bayar += $row['Total_Bayar']; + $pre->add_row([ $row['No_Jual'], $row['Tgl_Jual'], $row['Nama_Member'], $row['Total_Piutang'], $row['Total_Bayar'], $row['Total_Sisa'] ]); + } + $pre->add_span([ ["GRAND TOTAL",3,"R,B"],[$tot_piutang,1,"R,B","rupiah"],[$tot_bayar,1,"R,B","rupiah"],[$tot_piutang-$tot_bayar,1,"R,B","rupiah"] ]); + } + $pre->add_stamp(1, true); + $pre->show(); + } + + public function excel() { + $apre = $this->prepare(); + $xls = new Xlsx($this->app); + $xls->set_meta([ + 'title' => "Data Piutang Member", + 'desc' => "Export Data Piutang Member" + ]); + $xls->add_title([ $this->reg_name, "DATA ".($apre['tipe']==="R"?"REKAP":"DETAIL")." PIUTANG MEMBER", "Periode : ".$apre['periode'] ]); + + if ($apre['tipe'] === "R") { + $xls->add_field("No.", 5, "@integer"); + $xls->add_field("Nama Member", 25, "@text"); + $xls->add_field("Jumlah Faktur", 15, "#,##0.00"); + $xls->add_field("Jumlah Bayar", 15, "#,##0.00"); + $xls->add_field("Sisa Piutang", 15, "#,##0.00"); + $xls->add_sheet("".str_replace("s/d","-",$apre['periode'])); + + if ($apre['id_mem'] > 0) $xls->add_sub_title("Nama Member : ".$apre['nama_mem']); + + $xls->show_titles(); + $xls->show_headers(); + + $tot_piutang = 0; $tot_bayar = 0; $nomor = 0; + while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) { + $tot_piutang += $row['Total_Piutang']; + $tot_bayar += $row['Total_Bayar']; + $xls->add_row([ ++$nomor, $row['Nama_Member'], $row['Total_Piutang'], $row['Total_Bayar'], $row['Total_Sisa'] ]); + } + $xls->add_row_bold([ "", "GRAND TOTAL", $tot_piutang, $tot_bayar, $tot_piutang-$tot_bayar ]); + + } else { + $xls->add_field("No. Nota", 15, "@"); + $xls->add_field("Tgl. Nota", 12, "@date"); + $xls->add_field("Nama Member", 20, "@text"); + $xls->add_field("Jumlah", 15, "#,##0.00"); + $xls->add_field("Bayar", 15, "#,##0.00"); + $xls->add_field("Sisa Piutang", 15, "#,##0.00"); + $xls->add_sheet("".str_replace("s/d","-",$apre['periode'])); + + if ($apre['id_mem'] > 0) $xls->add_sub_title("Nama Member : ".$apre['nama_mem']); + + $xls->show_titles(); + $xls->show_headers(); + + $tot_piutang = 0; $tot_bayar = 0; + while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) { + $tot_piutang += $row['Total_Piutang']; + $tot_bayar += $row['Total_Bayar']; + $xls->add_row([ $row['No_Jual'], $row['Tgl_Jual'], $row['Nama_Member'], $row['Total_Piutang'], $row['Total_Bayar'], $row['Total_Sisa'] ]); + } + $xls->add_row_bold([ "", "", "GRAND TOTAL", $tot_piutang, $tot_bayar, $tot_piutang-$tot_bayar ]); + } + $xls->add_stamp(1, true); + $xls->download("Data Piutang Member ".str_replace("s/d","-",$apre['periode']).".xlsx"); + unset($xls); + } + + public function index() { + $form = new Form($this->app); + $ttipe = $form->radio("_", "Tipe", "R", true, false, ["R"=>"Rekap","D"=>"Detail"]); + $tcab = $form->option_db("_", "CabID", $this->id_cab, true, false, "para_cabang", ["CabID","Nama_Cab"], "Aktif=1 ORDER BY CabID", [0,"SEMUA CABANG"]); + $tmem = $form->textauto("_", "Nama_Member", ['value'=>0,'text'=>"SEMUA MEMBER"], true, true, "nama member"); + $tfrom = $form->datebox("_", "Tgl_From", tgl_ymd(), true, false); + $tto = $form->datebox("_", "Tgl_To", tgl_ymd(), true, false); + $ajson['html'] = ' +
+ +
'.$ttipe.'
+
+
+ +
'.$tcab.'
+
+
+ +
'.$tmem.'
+
+
+ +
'.$tfrom.'
+
+
+ +
'.$tto.'
+
+ '; + $this->app->json($ajson); + } + +} diff --git a/app/Controller/Report/Jual/AnalisaController.php b/app/Controller/Report/Jual/AnalisaController.php new file mode 100644 index 0000000..5810d71 --- /dev/null +++ b/app/Controller/Report/Jual/AnalisaController.php @@ -0,0 +1,371 @@ +app = $app; + $this->db = $db; + $this->id_cab = Param::Int("CabID", 0); + $this->reg_name = $session->get('WEB_APP')['REG_NAME']; + } + + public function brow_member() { + $tcari = Param::Get("Cari_Member"); + $tsql = ''; $asql = [1]; + if (!empty($tcari)) { + $tsql .= " AND CONCAT_WS(Kode_Member,Nama_Member,Alamat_Member,Telp_Member) LIKE ?"; + $asql[] = '%' . $tcari . '%'; + } + + $obj = new Table($this->app); + $obj->set_table("para_member", "*,CONCAT(IF(Kode_Member='','',CONCAT(Kode_Member,' - ')),Nama_Member) Kode_Nama", "Aktif=?".$tsql, $asql); + $obj->add_field("MemberID", "ID", "hid"); + $obj->add_field("Kode_Nama", "Kode_Nama", "hid"); + $obj->add_field("Kode_Member", "Kode", "c"); + $obj->add_field("Nama_Member", "Nama Member", "awr"); + $obj->add_field("Alamat_Member", "Alamat", "awr"); + $obj->add_field("Telp_Member", "Telp.", "awr"); + $obj->set_field_order("Nama_Member", "A"); + $obj->set_func_select("RepoJualAnalisaJS.member_select"); + $this->app->json([ $obj->db_table("divBrowMember") ]); + } + + public function auto_member() { + $tcari = Param::Get("Auto_Query", ""); + $ajson['autodata'] = []; + + $stat = $this->db->runQuery("SELECT MemberID,Grup_MemberID,Kode_Member,Nama_Member,CONCAT(IF(Kode_Member='','',CONCAT(Kode_Member,' - ')),Nama_Member) Kode_Nama FROM para_member WHERE Aktif=1 AND CONCAT(Kode_Member,Nama_Member,Alamat_Member,Telp_Member) LIKE ? ORDER BY Nama_Member LIMIT 50", ['%'.$tcari.'%']); + while ($row = $stat->fetch(SimplePdo::FETCH_ASSOC)) { + $ajson['autodata'][] = ['value'=>$row['MemberID'], 'text'=>$row['Kode_Nama'], 'html'=>''.$row['Kode_Member'].' '.$row['Nama_Member'], 'data'=>0, 'bc'=>0]; + } + $this->app->json($ajson); + } + + private function prepare() { + $apre = [ + 'tipe' => Param::Get("Tipe", "V"), // V or R or M + 'id_grup_mem' => Param::Int("Grup_MemberID", 0), + 'id_mem' => Param::Int("MemberID", 0), + 'id_sup' => Param::Int("SupID", 0), + 'id_grup_inv' => Param::Int("Grup_InvID", 0), + 'urut' => Param::Get("Urut", "B"), + 'tgl_from' => Param::Get("Tgl_From"), + 'tgl_to' => Param::Get("Tgl_To"), + ]; + $apre['Hari'] = tgl_range_hari($apre['tgl_from'], $apre['tgl_to'], true); + + $apre['nama_mem'] = ($apre['id_mem'] > 0) ? ($this->db->fetchField("SELECT CONCAT(Nama_Member,' (',Kode_Member,')') Nama FROM para_member WHERE MemberID=?", [$apre['id_mem']]) ?? '') : ''; + $apre['nama_sup'] = ($apre['id_sup'] > 0) ? ($this->db->fetchField("SELECT CONCAT(Nama_Sup,' (',Kode_Sup,')') Nama FROM para_supplier WHERE SupID=?", [$apre['id_sup']]) ?? '') : ''; + $apre['nama_grup_inv'] = ($apre['id_grup_inv'] > 0 && $apre['id_sup']===0) ? ($this->db->fetchField("SELECT Nama_Grup FROM inv_produk_grup WHERE Grup_InvID=?", [$apre['id_grup_inv']]) ?? '') : ''; + + // generate report header + $apre['periode'] = $apre['tgl_from'] . ($apre['tgl_from'] !== $apre['tgl_to'] ? ' s/d '.$apre['tgl_to'] : ''); + + $tsql1 = ''; $tsql2 = ''; $tsql3 = ''; + $asql1 = [tgl_sql2str($apre['tgl_from']), tgl_sql2str($apre['tgl_to'])]; + $asql2 = [tgl_sql2str($apre['tgl_to'])]; + $asql3 = []; + + if ($this->id_cab > 0) { + $tsql1 .= " AND CabID=?"; + array_push($asql1, $this->id_cab); + $tsql2 .= " AND CabID=?"; + array_push($asql2, $this->id_cab); + } + if ($apre['id_mem'] > 0) { + $tsql1 .= " AND No_Ref IN (SELECT No_Jual FROM inv_jual WHERE MemberID=? AND (Tgl_Jual BETWEEN ? AND ?))"; + array_push($asql1, $apre['id_mem'], tgl_sql2str($apre['tgl_from']), tgl_sql2str($apre['tgl_to'])); + } + if ($apre['id_grup_mem'] > 0) { + $tsql1 .= " AND No_Ref IN (SELECT No_Jual FROM inv_jual WHERE MemberID IN (SELECT MemberID FROM para_member WHERE Grup_MemberID=?) AND (Tgl_Jual BETWEEN ? AND ?))"; + array_push($asql1, $apre['id_grup_mem'], tgl_sql2str($apre['tgl_from']), tgl_sql2str($apre['tgl_to'])); + } + if ($apre['id_sup'] > 0) { + $tsql3 .= " AND D.InvID IN (SELECT InvID FROM inv_produk_sup WHERE SupID=?)"; + array_push($asql3, $apre['id_sup']); + } else { + if ($apre['id_grup_inv'] > 0) { + $tsql3 .= " AND P.Grup_InvID=?"; + array_push($asql3, $apre['id_grup_inv']); + } + } + $torder = ($apre['urut'] === "B") ? "P.Nama_Produk" : "D.Jumlah"; + $torder = ($apre['urut'] === "S") ? "S.Stok" : $torder; + $tsql3 = (count($asql3) > 0) ? " WHERE".substr($tsql3, 4) : ''; + + if ($apre['tipe'] === "V") { + $apre['query'] = $this->db->runQuery("SELECT CONCAT(P.Nama_Produk,' ',IF(ISNULL(V.Nama_Varian),'',V.Nama_Varian)) Nama_Produk,P.Satuan_Normal,P.Satuan_Stok,D.Jumlah,S.Stok,P.Qty Kali FROM (SELECT InvID,VarianID,SUM(-Stok) Jumlah FROM inv_detail WHERE (Tgl_Ref BETWEEN ? AND ?) AND NotaID IN (5,6)".$tsql1." GROUP BY InvID,VarianID ORDER BY InvID,VarianID) D LEFT JOIN (SELECT InvID,VarianID,SUM(Stok) Stok FROM inv_detail WHERE Tgl_Ref<=?".$tsql2." GROUP BY InvID,VarianID) S ON (D.InvID=S.InvID AND D.VarianID=S.VarianID) LEFT JOIN vi_inv_produk2 P ON (D.InvID=P.InvID) LEFT JOIN para_varian V ON (D.VarianID=V.VarianID)".$tsql3." ORDER BY ".$torder, array_merge($asql1, $asql2, $asql3)); + $apre['judul'] = "VOLUME"; + } else if ($apre['tipe'] === "R") { + $apre['query'] = $this->db->runQuery("SELECT CONCAT(P.Nama_Produk,' ',IF(ISNULL(V.Nama_Varian),'',V.Nama_Varian)) Nama_Produk,P.Satuan_Normal,P.Satuan_Stok,D.Jumlah,S.Stok,P.Qty Kali FROM (SELECT InvID,VarianID,SUM(-Qty*Harga_Jual) Jumlah FROM inv_detail WHERE (Tgl_Ref BETWEEN ? AND ?) AND NotaID IN (5,6)".$tsql1." GROUP BY InvID,VarianID ORDER BY InvID,VarianID) D LEFT JOIN (SELECT InvID,VarianID,SUM(Stok) Stok FROM inv_detail WHERE Tgl_Ref<=?".$tsql2." GROUP BY InvID,VarianID) S ON (D.InvID=S.InvID AND D.VarianID=S.VarianID) LEFT JOIN vi_inv_produk2 P ON (D.InvID=P.InvID) LEFT JOIN para_varian V ON (D.VarianID=V.VarianID)".$tsql3." ORDER BY ".$torder, array_merge($asql1, $asql2, $asql3)); + $apre['judul'] = "RUPIAH"; + } else if ($apre['tipe'] === "M") { + $torder = ($apre['urut'] === "M") ? "D.Margin" : $torder; + $torder = ($apre['urut'] === "S") ? "S.Stok" : $torder; + $apre['query'] = $this->db->runQuery("SELECT CONCAT(P.Nama_Produk,' ',IF(ISNULL(V.Nama_Varian),'',V.Nama_Varian)) Nama_Produk,P.Satuan_Normal,P.Satuan_Stok,D.Margin,D.Jumlah,S.Stok,P.Qty Kali FROM (SELECT InvID,VarianID,((SUM(-Qty*(Harga_Jual-Harga_Beli))*100)/SUM(-Qty*Harga_Jual)) Margin,SUM(-Qty*(Harga_Jual-Harga_Beli)) Jumlah FROM inv_detail WHERE (Tgl_Ref BETWEEN ? AND ?) AND NotaID IN (5,6)".$tsql1." GROUP BY InvID,VarianID ORDER BY InvID,VarianID) D LEFT JOIN (SELECT InvID,VarianID,SUM(Stok) Stok FROM inv_detail WHERE Tgl_Ref<=?".$tsql2." GROUP BY InvID,VarianID) S ON (D.InvID=S.InvID AND D.VarianID=S.VarianID) LEFT JOIN vi_inv_produk2 P ON (D.InvID=P.InvID) LEFT JOIN para_varian V ON (D.VarianID=V.VarianID)".$tsql2." ORDER BY ".$torder, array_merge($asql1, $asql2, $asql3)); + $apre['judul'] = "MARGIN"; + } + return $apre; + } + + public function print() { + $apre = $this->prepare(); + + $pre = new PrintHTML($this->app); + $pre->add_title([strtoupper($this->reg_name), "REKAP ".$apre['judul']." PENJUALAN", "Periode : ".$apre['periode']]); + + if ($apre['tipe'] === "V") { + $pre->add_field("No.",10,"C"); + $pre->add_field("Nama Barang",50,"L"); + $pre->add_field("Jumlah",20,"R"); + $pre->add_field("Mingguan",20,"R"); + $pre->add_field("Sisa Stok",20,"R"); + + if ($apre['id_mem'] > 0) $pre->add_sub_title("Nama Member : ".$apre['nama_mem']); + if ($apre['id_sup'] > 0) $pre->add_sub_title("Nama Supplier : ".$apre['nama_sup']); + if ($apre['id_grup_inv'] > 0 && $apre['id_sup']===0) $pre->add_sub_title("Grup Barang : ".$apre['nama_grup_inv']); + + $pre->show_titles(); + $pre->show_headers(); + + $nomor = 0; + while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) { + $total = $row['Jumlah'] ?? 0; + $mg_total = $total / ($apre['Hari'] / 7); + $kali = $row['Kali'] ?? 1; + $stok = Invesa::Format_Stok($total, $kali, $row['Satuan_Normal'], $row['Satuan_Stok']); + $mg_stok = Invesa::Format_Stok($mg_total, $kali, $row['Satuan_Normal'], $row['Satuan_Stok']); + $ss_stok = Invesa::Format_Stok($row['Stok'], $kali, $row['Satuan_Normal'], $row['Satuan_Stok']); + $pre->add_row([ ++$nomor, $row['Nama_Produk'], $stok, $mg_stok, $ss_stok ]); + } + + } else if ($apre['tipe'] === "R") { + $pre->add_field("No.",10,"C"); + $pre->add_field("Nama Barang",50,"L"); + $pre->add_field("Jumlah",20,"R","rupiah"); + $pre->add_field("Mingguan",20,"R","rupiah"); + $pre->add_field("Sisa Stok",20,"R"); + + if ($apre['id_mem'] > 0) $pre->add_sub_title("Nama Member : ".$apre['nama_mem']); + if ($apre['id_sup'] > 0) $pre->add_sub_title("Nama Supplier : ".$apre['nama_sup']); + if ($apre['id_grup_inv'] > 0 && $apre['id_sup']===0) $pre->add_sub_title("Grup Barang : ".$apre['nama_grup_inv']); + + $pre->show_titles(); + $pre->show_headers(); + + $nomor = 0; $tot_rup = 0; $tot_mg = 0; + while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) { + $mg_avg = ($row['Jumlah'] > 0) ? $row['Jumlah'] / ($apre['Hari'] / 7) : 0; + $tot_rup += $row['Jumlah']; + $tot_mg += $mg_avg; + $ss_stok = Invesa::Format_Stok($row['Stok'], $row['Kali'] ?? 1, $row['Satuan_Normal'], $row['Satuan_Stok']); + $pre->add_row([ ++$nomor, $row['Nama_Produk'], $row['Jumlah'], $mg_avg, $ss_stok ]); + } + $pre->add_span([ ["GRAND TOTAL",2,"R,B"],[$tot_rup,1,"R,B","rupiah"],[$tot_mg,1,"R,B","rupiah"], ["",1] ]); + + } else if ($apre['tipe'] === "M") { + $pre->add_field("No.",10,"C"); + $pre->add_field("Nama Barang",50,"L"); + $pre->add_field("Jumlah",20,"R","rupiah"); + $pre->add_field("Margin (%)",20,"R","rupiah2"); + $pre->add_field("Mingguan",20,"R","rupiah"); + $pre->add_field("Sisa Stok",20,"R"); + + if ($apre['id_mem'] > 0) $pre->add_sub_title("Nama Member : ".$apre['nama_mem']); + if ($apre['id_sup'] > 0) $pre->add_sub_title("Nama Supplier : ".$apre['nama_sup']); + if ($apre['id_grup_inv'] > 0 && $apre['id_sup']===0) $pre->add_sub_title("Grup Barang : ".$apre['nama_grup_inv']); + + $pre->show_titles(); + $pre->show_headers(); + + $nomor = 0; $tot_rup = 0; $tot_mar = 0; $tot_mg = 0; + while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) { + $mg_avg = ($row['Jumlah'] > 0) ? $row['Jumlah'] / ($apre['Hari'] / 7) : 0; + $tot_rup += $row['Jumlah']; + $tot_mar += $row['Margin']; + $tot_mg += $mg_avg; + $ss_stok = Invesa::Format_Stok($row['Stok'], $row['Kali'] ?? 1, $row['Satuan_Normal'], $row['Satuan_Stok']); + $pre->add_row([ ++$nomor, $row['Nama_Produk'], $row['Jumlah'], $row['Margin'], $mg_avg, $ss_stok ]); + } + $pre->add_span([ ["GRAND TOTAL",2,"R,B"],[$tot_rup,1,"R,B","rupiah"],[$tot_mar,1,"R,B","rupiah"],[$tot_mg,1,"R,B","rupiah"], ["",1] ]); + } + $pre->add_stamp(1, true); + $pre->show(); + } + + public function excel() { + $apre = $this->prepare(); + $xls = new Xlsx($this->app); + $xls->set_meta([ + 'title' => "Data Analisa Penjualan", + 'desc' => "Export Data Analisa Penjualan" + ]); + $xls->add_title([ $this->reg_name, "REKAP ".$apre['judul']." PENJUALAN", "Periode : ".$apre['periode'] ]); + + if ($apre['tipe'] === "V") { + $xls->add_field("No.", 5, "@integer"); + $xls->add_field("Nama Barang", 25, "@text"); + $xls->add_field("Jumlah", 15, "#,##0.00"); + $xls->add_field("Mingguan", 15, "#,##0.00"); + $xls->add_field("Sisa Stok", 15, "@"); + $xls->add_sheet("".str_replace("s/d","-",$apre['periode'])); + + if ($apre['id_mem'] > 0) $xls->add_sub_title("Nama Member : ".$apre['nama_mem']); + if ($apre['id_sup'] > 0) $xls->add_sub_title("Nama Supplier : ".$apre['nama_sup']); + if ($apre['id_grup_inv'] > 0 && $apre['id_sup']===0) $xls->add_sub_title("Grup Barang : ".$apre['nama_grup_inv']); + + $xls->show_titles(); + $xls->show_headers(); + + $nomor = 0; + while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) { + $total = $row['Jumlah'] ?? 0; + $mg_total = $total / ($apre['Hari'] / 7); + $kali = $row['Kali'] ?? 1; + $stok = Invesa::Format_Stok($total, $kali, $row['Satuan_Normal'], $row['Satuan_Stok']); + $mg_stok = Invesa::Format_Stok($mg_total, $kali, $row['Satuan_Normal'], $row['Satuan_Stok']); + $ss_stok = Invesa::Format_Stok($row['Stok'], $kali, $row['Satuan_Normal'], $row['Satuan_Stok']); + $xls->add_row([ ++$nomor, $row['Nama_Produk'], $stok, $mg_stok, $ss_stok ]); + } + + } else if ($apre['tipe'] === "R") { + $xls->add_field("No.", 5, "@integer"); + $xls->add_field("Nama Barang", 20, "@text"); + $xls->add_field("Jumlah", 15, "#,##0.00"); + $xls->add_field("Mingguan", 15, "#,##0.00"); + $xls->add_field("Sisa Stok", 15, "@"); + $xls->add_sheet("".str_replace("s/d","-",$apre['periode'])); + + if ($apre['id_mem'] > 0) $xls->add_sub_title("Nama Member : ".$apre['nama_mem']); + if ($apre['id_sup'] > 0) $xls->add_sub_title("Nama Supplier : ".$apre['nama_sup']); + if ($apre['id_grup_inv'] > 0 && $apre['id_sup']===0) $xls->add_sub_title("Grup Barang : ".$apre['nama_grup_inv']); + + $xls->show_titles(); + $xls->show_headers(); + + $nomor = 0; $tot_rup = 0; $tot_mg = 0; + while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) { + $mg_avg = ($row['Jumlah'] > 0) ? $row['Jumlah'] / ($apre['Hari'] / 7) : 0; + $tot_rup += $row['Jumlah']; + $tot_mg += $mg_avg; + $ss_stok = Invesa::Format_Stok($row['Stok'], $row['Kali'] ?? 1, $row['Satuan_Normal'], $row['Satuan_Stok']); + $xls->add_row([ ++$nomor, $row['Nama_Produk'], $row['Jumlah'], $mg_avg, $ss_stok ]); + } + $xls->add_row_bold([ "", "GRAND TOTAL", $tot_rup, $tot_mg, "" ]); + + } else if ($apre['tipe'] === "M") { + $xls->add_field("No.", 5, "@integer"); + $xls->add_field("Nama Barang", 20, "@text"); + $xls->add_field("Jumlah", 15, "#,##0.00"); + $xls->add_field("Margin (%)", 15, "@percent"); + $xls->add_field("Mingguan", 15, "#,##0.00"); + $xls->add_field("Sisa Stok", 15, "@"); + $xls->add_sheet("".str_replace("s/d","-",$apre['periode'])); + + if ($apre['id_mem'] > 0) $xls->add_sub_title("Nama Member : ".$apre['nama_mem']); + if ($apre['id_sup'] > 0) $xls->add_sub_title("Nama Supplier : ".$apre['nama_sup']); + if ($apre['id_grup_inv'] > 0 && $apre['id_sup']===0) $xls->add_sub_title("Grup Barang : ".$apre['nama_grup_inv']); + + $xls->show_titles(); + $xls->show_headers(); + + $nomor = 0; $tot_rup = 0; $tot_mar = 0; $tot_mg = 0; + while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) { + $mg_avg = ($row['Jumlah'] > 0) ? $row['Jumlah'] / ($apre['Hari'] / 7) : 0; + $tot_rup += $row['Jumlah']; + $tot_mar += $row['Margin']; + $tot_mg += $mg_avg; + $ss_stok = Invesa::Format_Stok($row['Stok'], $row['Kali'] ?? 1, $row['Satuan_Normal'], $row['Satuan_Stok']); + $xls->add_row([ ++$nomor, $row['Nama_Produk'], $row['Jumlah'], $row['Margin'], $mg_avg, $ss_stok ]); + } + $xls->add_row_bold([ "", "GRAND TOTAL", $tot_rup, $tot_mar, $tot_mg, "" ]); + } + $xls->add_stamp(1, true); + $xls->download("Data Pembelian ".str_replace("s/d","-",$apre['periode']).".xlsx"); + unset($xls); + } + + public function index() { + $form = new Form($this->app); + $ttipe = $form->radio("_", "Tipe", "V", true, false, ["V"=>"Volume","R"=>"Rupiah","M"=>"Margin"]); + $tcab = $form->option_db("_", "CabID", $this->id_cab, true, false, "para_cabang", ["CabID","Nama_Cab"], "Aktif=1 ORDER BY CabID", [0,"SEMUA CABANG"]); + $tgrup_inv = $form->option_db("_", "Grup_InvID", 0, true, false, "inv_produk_grup", ["Grup_InvID","Nama_Grup"], "Aktif=1 ORDER BY Nama_Grup", [0,"SEMUA GRUP"]); + $tgrup_mem = $form->option_db("_", "Grup_MemberID", 0, true, false, "para_member_grup", ["Grup_MemberID","Nama_Grup"], "Aktif=1 ORDER BY Nama_Grup", [0,"SEMUA GRUP"]); + $tmem = $form->textauto("_", "Nama_Member", ['value'=>0,'text'=>"SEMUA MEMBER"], true, true, "nama member"); + $tsup = $form->option_db("_", "SupID", 0, true, false, "para_supplier", ["SupID","Nama_Sup"], "Aktif=1 ORDER BY Nama_Sup", [0,"SEMUA SUPPLIER"]); + $turut = $form->radio("_", "Urut", "B", true, false, ['B'=>"Nama Barang",'J'=>"Jumlah / Nilai",'M'=>"Margin",'S'=>"Stok"]); + $tfrom = $form->datebox("_", "Tgl_From", tgl_ymd(), true, false); + $tto = $form->datebox("_", "Tgl_To", tgl_ymd(), true, false); + $ajson['html'] = ' +
+ +
'.$ttipe.'
+
+
+ +
'.$tcab.'
+
+
+ +
'.$tgrup_mem.'
+
+
+ +
'.$tmem.'
+
+
+ +
'.$tsup.Invesa::Form_Info("Jika Nama Supplier dipilih, Filter Grup Barang akan diabaikan.").'
+
+
+ +
'.$tgrup_inv.'
+
+
+ +
'.$turut.'
+
+
+ +
'.$tfrom.'
+
+
+ +
'.$tto.'
+
+ '; + $this->app->json($ajson); + } + +} diff --git a/app/Controller/Report/Jual/JualController.php b/app/Controller/Report/Jual/JualController.php new file mode 100644 index 0000000..fe69312 --- /dev/null +++ b/app/Controller/Report/Jual/JualController.php @@ -0,0 +1,223 @@ +app = $app; + $this->db = $db; + $this->id_cab = Param::Int("CabID", 0); + $this->reg_name = $session->get('WEB_APP')['REG_NAME']; + } + + private function prepare() { + $apre = [ + 'tipe' => Param::Get("Tipe", "R"), // R or D + 'id_mem' => Param::Int("MemberID", 0), + 'id_grup' => Param::Int("Grup_InvID", 0), + 'tgl_from' => Param::Get("Tgl_From"), + 'tgl_to' => Param::Get("Tgl_To"), + ]; + + $apre['nama_mem'] = ($apre['id_mem'] > 0) ? ($this->db->fetchField("SELECT CONCAT(Nama_Member,' (',Kode_Member,')') Nama FROM para_member WHERE MemberID=?", [$apre['id_mem']]) ?? '') : ''; + $apre['nama_grup'] = ($apre['id_grup'] > 0) ? ($this->db->fetchField("SELECT Nama_Grup FROM inv_produk_grup WHERE Grup_InvID=?", [$apre['id_grup']]) ?? '') : ''; + + // generate report header + $apre['periode'] = $apre['tgl_from'] . ($apre['tgl_from'] !== $apre['tgl_to'] ? ' s/d '.$apre['tgl_to'] : ''); + + $tsql = ''; $asql = [tgl_sql2str($apre['tgl_from']), tgl_sql2str($apre['tgl_to'])]; + if ($this->id_cab > 0) { + $tsql .= " AND CabID=?"; + array_push($asql, $this->id_cab); + } + if ($apre['id_mem'] > 0) { + $tsql .= " AND MemberID=?"; + array_push($asql, $apre['id_mem']); + } + //id_grup ? + + if ($apre['tipe'] === "R") { + $apre['query'] = $this->db->runQuery("SELECT IF(ISNULL(O.Nama_Member),'KASIR POS',O.Nama_Member) Nama_Member,SUM(J.Total_Jual) Total_Jual,SUM(J.Total_Diskon) Total_Diskon,SUM(J.Total_Jual-J.Total_Diskon) Total FROM (SELECT * FROM inv_jual WHERE (Tgl_Jual BETWEEN ? AND ?)".$tsql.") J LEFT JOIN para_member O ON (J.MemberID=O.MemberID) GROUP BY J.MemberID ORDER BY O.Nama_Member", $asql); + } else { + $apre['query'] = $this->db->runQuery("SELECT J.*,IF(ISNULL(O.Nama_Member),'KASIR POS',O.Nama_Member) Nama_Member,J.Total_Jual-J.Total_Diskon Total FROM (SELECT * FROM inv_jual WHERE (Tgl_Jual BETWEEN ? AND ?)".$tsql.") J LEFT JOIN para_member O ON (J.MemberID=O.MemberID) ORDER BY J.No_Jual", $asql); + } + return $apre; + } + + public function print() { + $apre = $this->prepare(); + + $pre = new PrintHTML($this->app); + $pre->add_title([strtoupper($this->reg_name), ($apre['tipe']==="R"?"REKAP":"DETAIL")." PENJUALAN", "Periode : ".$apre['periode']]); + + if ($apre['tipe'] === "R") { + $pre->add_field("No.",10,"C"); + $pre->add_field("Nama Member",50,"L"); + $pre->add_field("Sub. Total",20,"R","rupiah"); + $pre->add_field("Diskon",20,"R","rupiah"); + $pre->add_field("Total",20,"R","rupiah"); + + if ($apre['id_mem'] > 0) $pre->add_sub_title("Nama Member : ".$apre['nama_mem']); + if ($apre['id_grup'] > 0) $pre->add_sub_title("Grup Barang : ".$apre['nama_grup']); + + $pre->show_titles(); + $pre->show_headers(); + + $tot_jual = 0; $tot_diskon = 0; $nomor = 0; + while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) { + $tot_jual += $row['Total_Jual']; + $tot_diskon += $row['Total_Diskon']; + $pre->add_row([ ++$nomor, $row['Nama_Member'], $row['Total_Jual'], $row['Total_Diskon'], $row['Total'] ]); + } + $pre->add_span([ ["GRAND TOTAL",2,"R,B"],[$tot_jual,1,"R,B","rupiah"],[$tot_diskon,1,"R,B","rupiah"],[$tot_jual-$tot_diskon,1,"R,B","rupiah"] ]); + + } else { + $pre->add_field("No. Nota",30,"C"); + $pre->add_field("Tgl. Nota",30,"C", "tgl_sql2str"); + $pre->add_field("Nama Member",50,"L"); + $pre->add_field("Sub. Total",20,"R","rupiah"); + $pre->add_field("Diskon",20,"R","rupiah"); + $pre->add_field("Total",30,"R","rupiah"); + + if ($apre['id_mem'] > 0) $pre->add_sub_title("Nama Member : ".$apre['nama_mem']); + if ($apre['id_grup'] > 0) $pre->add_sub_title("Grup Barang : ".$apre['nama_grup']); + + $pre->show_titles(); + $pre->show_headers(); + + $tot_jual = 0; $tot_diskon = 0; + while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) { + $tot_jual += $row['Total_Jual']; + $tot_diskon += $row['Total_Diskon']; + $pre->add_row([ $row['No_Jual'], $row['Tgl_Jual'], $row['Nama_Member'], $row['Total_Jual'], $row['Total_Diskon'], $row['Total'] ]); + } + $pre->add_span([ ["GRAND TOTAL",3,"R,B"],[$tot_jual,1,"R,B","rupiah"],[$tot_diskon,1,"R,B","rupiah"],[$tot_jual-$tot_diskon,1,"R,B","rupiah"] ]); + } + $pre->add_stamp(1, true); + $pre->show(); + } + + public function excel() { + $apre = $this->prepare(); + $xls = new Xlsx($this->app); + $xls->set_meta([ + 'title' => "Data Penjualan", + 'desc' => "Export Data Penjualan" + ]); + $xls->add_title([ $this->reg_name, "DATA ".($apre['tipe']==="R"?"REKAP":"DETAIL")." PENJUALAN", "Periode : ".$apre['periode'] ]); + + if ($apre['tipe'] === "R") { + $xls->add_field("No.", 5, "@integer"); + $xls->add_field("Nama Member", 25, "@text"); + $xls->add_field("Sub. Total", 15, "#,##0.00"); + $xls->add_field("Diskon", 15, "#,##0.00"); + $xls->add_field("Total", 15, "#,##0.00"); + $xls->add_sheet("".str_replace("s/d","-",$apre['periode'])); + + if ($apre['id_mem'] > 0) $xls->add_sub_title("Nama Member : ".$apre['nama_mem']); + if ($apre['id_grup'] > 0) $xls->add_sub_title("Grup Barang : ".$apre['nama_grup']); + + $xls->show_titles(); + $xls->show_headers(); + + $tot_jual = 0; $tot_diskon = 0; $nomor = 0; + while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) { + $tot_jual += $row['Total_Jual']; + $tot_diskon += $row['Total_Diskon']; + $xls->add_row([ ++$nomor, $row['Nama_Member'], $row['Total_Jual'], $row['Total_Diskon'], $row['Total'] ]); + } + $xls->add_row_bold([ "", "GRAND TOTAL", $tot_jual, $tot_diskon, $tot_jual-$tot_diskon ]); + + } else { + $xls->add_field("No. Nota", 15, "@"); + $xls->add_field("Tgl. Nota", 12, "@date"); + $xls->add_field("Nama Member", 20, "@text"); + $xls->add_field("Sub. Total", 15, "#,##0.00"); + $xls->add_field("Diskon", 15, "#,##0.00"); + $xls->add_field("Total", 15, "#,##0.00"); + $xls->add_sheet("".str_replace("s/d","-",$apre['periode'])); + + if ($apre['id_mem'] > 0) $xls->add_sub_title("Nama Member : ".$apre['nama_mem']); + if ($apre['id_grup'] > 0) $xls->add_sub_title("Grup Barang : ".$apre['nama_grup']); + + $xls->show_titles(); + $xls->show_headers(); + + $tot_jual = 0; $tot_diskon = 0; + while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) { + $tot_jual += $row['Total_Jual']; + $tot_diskon += $row['Total_Diskon']; + $xls->add_row([ $row['No_Jual'], $row['Tgl_Jual'], $row['Nama_Member'], $row['Total_Jual'], $row['Total_Diskon'], $row['Total'] ]); + } + $xls->add_row_bold([ "", "", "GRAND TOTAL", $tot_jual, $tot_diskon, $tot_jual-$tot_diskon ]); + } + $xls->add_stamp(1, true); + $xls->download("Data Penjualan ".str_replace("s/d","-",$apre['periode']).".xlsx"); + unset($xls); + } + + public function index() { + $form = new Form($this->app); + $ttipe = $form->radio("_", "Tipe", "R", true, false, ["R"=>"Rekap","D"=>"Detail"]); + $tcab = $form->option_db("_", "CabID", $this->id_cab, true, false, "para_cabang", ["CabID","Nama_Cab"], "Aktif=1 ORDER BY CabID", [0,"SEMUA CABANG"]); + $tmemb = $form->option_db("_", "MemberID", 0, true, false, "para_member", ["MemberID","Nama_Member"], "Aktif=1 ORDER BY Nama_Member", [0,"SEMUA MEMBER"]); + $tgrup = $form->option_db("_", "Grup_InvID", 0, true, false, "inv_produk_grup", ["Grup_InvID","Nama_Grup"], "Aktif=1 ORDER BY Nama_Grup", [0,"SEMUA GRUP"]); + $tfrom = $form->datebox("_", "Tgl_From", tgl_ymd(), true, false); + $tto = $form->datebox("_", "Tgl_To", tgl_ymd(), true, false); + $ajson['html'] = ' +
+ +
'.$ttipe.'
+
+
+ +
'.$tcab.'
+
+
+ +
'.$tmemb.'
+
+
+ +
'.$tgrup.'
+
+
+ +
'.$tfrom.'
+
+
+ +
'.$tto.'
+
'; + $this->app->json($ajson); + } + +} diff --git a/app/Controller/Report/Jual/MarginController.php b/app/Controller/Report/Jual/MarginController.php new file mode 100644 index 0000000..6a92702 --- /dev/null +++ b/app/Controller/Report/Jual/MarginController.php @@ -0,0 +1,261 @@ +app = $app; + $this->db = $db; + $this->id_cab = Param::Int("CabID", 0); + $this->reg_name = $session->get('WEB_APP')['REG_NAME']; + } + + public function brow_member() { + $tcari = Param::Get("Cari_Member"); + $tsql = ''; $asql = [1]; + if (!empty($tcari)) { + $tsql .= " AND CONCAT_WS(Kode_Member,Nama_Member,Alamat_Member,Telp_Member) LIKE ?"; + $asql[] = '%' . $tcari . '%'; + } + + $obj = new Table($this->app); + $obj->set_table("para_member", "*,CONCAT(IF(Kode_Member='','',CONCAT(Kode_Member,' - ')),Nama_Member) Kode_Nama", "Aktif=?".$tsql, $asql); + $obj->add_field("MemberID", "ID", "hid"); + $obj->add_field("Kode_Nama", "Kode_Nama", "hid"); + $obj->add_field("Kode_Member", "Kode", "c"); + $obj->add_field("Nama_Member", "Nama Member", "awr"); + $obj->add_field("Alamat_Member", "Alamat", "awr"); + $obj->add_field("Telp_Member", "Telp.", "awr"); + $obj->set_field_order("Nama_Member", "A"); + $obj->set_func_select("RepoJualMarginJS.member_select"); + $this->app->json([ $obj->db_table("divBrowMember") ]); + } + + public function auto_member() { + $tcari = Param::Get("Auto_Query", ""); + $ajson['autodata'] = []; + + $stat = $this->db->runQuery("SELECT MemberID,Grup_MemberID,Kode_Member,Nama_Member,CONCAT(IF(Kode_Member='','',CONCAT(Kode_Member,' - ')),Nama_Member) Kode_Nama FROM para_member WHERE Aktif=1 AND CONCAT(Kode_Member,Nama_Member,Alamat_Member,Telp_Member) LIKE ? ORDER BY Nama_Member LIMIT 50", ['%'.$tcari.'%']); + while ($row = $stat->fetch(SimplePdo::FETCH_ASSOC)) { + $ajson['autodata'][] = ['value'=>$row['MemberID'], 'text'=>$row['Kode_Nama'], 'html'=>''.$row['Kode_Member'].' '.$row['Nama_Member'], 'data'=>0, 'bc'=>0]; + } + $this->app->json($ajson); + } + + private function prepare() { + $apre = [ + 'tipe' => Param::Get("Tipe", "R"), // R or D + 'id_mem' => Param::Int("MemberID", 0), + 'urut' => Param::Get("Urut", "M"), + 'tgl_from' => Param::Get("Tgl_From"), + 'tgl_to' => Param::Get("Tgl_To"), + ]; + + $apre['nama_mem'] = ($apre['id_mem'] > 0) ? ($this->db->fetchField("SELECT CONCAT(Nama_Member,' (',Kode_Member,')') Nama FROM para_member WHERE MemberID=?", [$apre['id_mem']]) ?? '') : ''; + + // generate report header + $apre['periode'] = $apre['tgl_from'] . ($apre['tgl_from'] !== $apre['tgl_to'] ? ' s/d '.$apre['tgl_to'] : ''); + + $tsql = ''; $asql = [tgl_sql2str($apre['tgl_from']), tgl_sql2str($apre['tgl_to'])]; + if ($this->id_cab > 0) { + $tsql .= " AND CabID=?"; + array_push($asql, $this->id_cab); + } + if ($apre['id_mem'] > 0) { + $tsql .= " AND MemberID=?"; + array_push($asql, $apre['id_mem']); + } + $torder = ($apre['urut'] === "M") ? "J.Total_Margin" : "J.Total_Jual"; + + if ($apre['tipe'] === "R") { + $apre['query'] = $this->db->runQuery("SELECT J.*,IFNULL(O.Nama_Member,'KASIR POS') Nama_Member FROM (SELECT MemberID,SUM(Total_HPP) Total_Modal,SUM(Total_Jual-Total_Diskon) Total_Jual,SUM(Total_Jual-Total_Diskon-Total_HPP) Total_Margin FROM inv_jual WHERE (Tgl_Jual BETWEEN ? AND ?)".$tsql." GROUP BY MemberID) J LEFT JOIN para_member O ON (J.MemberID=O.MemberID) ORDER BY ".$torder." DESC", $asql); + } else { + $apre['query'] = $this->db->runQuery("SELECT J.*,IFNULL(O.Nama_Member,'KASIR POS') Nama_Member FROM (SELECT No_Jual,Tgl_Jual,MemberID,Total_HPP Total_Modal,(Total_Jual-Total_Diskon) Total_Jual,(Total_Jual-Total_Diskon-Total_HPP) Total_Margin FROM inv_jual WHERE (Tgl_Jual BETWEEN ? AND ?)".$tsql.") J LEFT JOIN para_member O ON (J.MemberID=O.MemberID) ORDER BY ".$torder." DESC", $asql); + } + $apre['judul'] = ['R'=>"REKAP",'D'=>"DETAIL"]; + return $apre; + } + + public function print() { + $apre = $this->prepare(); + + $pre = new PrintHTML($this->app); + $pre->add_title([strtoupper($this->reg_name), $apre['judul'][$apre['tipe']]." MARGIN PENJUALAN", "Periode : ".$apre['periode']]); + + if ($apre['tipe'] === "R") { + $pre->add_field("No.",10,"C"); + $pre->add_field("Nama Member",50,"L"); + $pre->add_field("Harga Modal",20,"R","rupiah"); + $pre->add_field("Harga Jual",20,"R","rupiah"); + $pre->add_field("Margin",20,"R","rupiah"); + $pre->add_field("%",10,"R","rupiah2"); + + if ($apre['id_mem'] > 0) $pre->add_sub_title("Nama Member : ".$apre['nama_mem']); + + $pre->show_titles(); + $pre->show_headers(); + + $tot_modal = 0; $tot_jual = 0; $tot_margin =0; $nomor = 0; + while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) { + $tot_jual += $row['Total_Jual']; + $tot_modal += $row['Total_Modal']; + $tot_margin += $row['Total_Margin']; + $pre->add_row([ ++$nomor, $row['Nama_Member'], $row['Total_Modal'], $row['Total_Jual'], $row['Total_Margin'], ($row['Total_Margin']*100)/$row['Total_Jual'] ]); + } + $pre->add_span([ ["GRAND TOTAL",2,"R,B"],[$tot_modal,1,"R,B","rupiah"],[$tot_jual,1,"R,B","rupiah"],[$tot_margin,1,"R,B","rupiah"],[($tot_margin*100)/$tot_jual,1,"R,B","rupiah2"] ]); + + } else { + $pre->add_field("No. Nota",30,"C"); + $pre->add_field("Tgl. Nota",30,"C", "tgl_sql2str"); + $pre->add_field("Nama Member",50,"L"); + $pre->add_field("Harga Modal",20,"R","rupiah"); + $pre->add_field("Harga Jual",20,"R","rupiah"); + $pre->add_field("Margin",20,"R","rupiah"); + $pre->add_field("%",10,"R","rupiah2"); + + if ($apre['id_mem'] > 0) $pre->add_sub_title("Nama Member : ".$apre['nama_mem']); + + $pre->show_titles(); + $pre->show_headers(); + + $tot_jual = 0; $tot_modal = 0; $tot_margin = 0; + while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) { + $tot_jual += $row['Total_Jual']; + $tot_modal += $row['Total_Modal']; + $tot_margin += $row['Total_Margin']; + $pre->add_row([ $row['No_Jual'], $row['Tgl_Jual'], $row['Nama_Member'], $row['Total_Modal'], $row['Total_Jual'], $row['Total_Margin'], ($row['Total_Margin']*100)/$row['Total_Jual'] ]); + } + $pre->add_span([ ["GRAND TOTAL",3,"R,B"],[$tot_modal,1,"R,B","rupiah"],[$tot_jual,1,"R,B","rupiah"],[$tot_margin,1,"R,B","rupiah"],[($tot_margin*100)/$tot_jual,1,"R,B","rupiah2"] ]); + } + $pre->add_stamp(1, true); + $pre->show(); + } + + public function excel() { + $apre = $this->prepare(); + $xls = new Xlsx($this->app); + $xls->set_meta([ + 'title' => "Data Margin Penjualan", + 'desc' => "Export Data Margin Penjualan" + ]); + $xls->add_title([ $this->reg_name, "DATA ".$apre['judul'][$apre['tipe']]." MARGIN PENJUALAN", "Periode : ".$apre['periode'] ]); + + if ($apre['tipe'] === "R") { + $xls->add_field("No.", 5, "@integer"); + $xls->add_field("Nama Member", 25, "@text"); + $xls->add_field("Harga Modal", 15, "#,##0.00"); + $xls->add_field("Harga Jual", 15, "#,##0.00"); + $xls->add_field("Margin", 15, "#,##0.00"); + $xls->add_field("%", 8, "0.00%"); + $xls->add_sheet("".str_replace("s/d","-",$apre['periode'])); + + if ($apre['id_mem'] > 0) $xls->add_sub_title("Nama Member : ".$apre['nama_mem']); + + $xls->show_titles(); + $xls->show_headers(); + + $tot_jual = 0; $tot_modal = 0; $tot_margin = 0; $nomor = 0; + while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) { + $tot_jual += $row['Total_Jual']; + $tot_modal += $row['Total_Modal']; + $tot_margin += $row['Total_Margin']; + $xls->add_row([ ++$nomor, $row['Nama_Member'], $row['Total_Modal'], $row['Total_Jual'], $row['Total_Margin'], (($row['Total_Margin'])/$row['Total_Jual']) ]); + } + $xls->add_row_bold([ "", "GRAND TOTAL", $tot_modal, $tot_jual, $tot_margin, (($tot_margin)/$tot_jual) ]); + + } else { + $xls->add_field("No. Nota", 15, "@"); + $xls->add_field("Tgl. Nota", 12, "@date"); + $xls->add_field("Nama Member", 20, "@text"); + $xls->add_field("Harga Modal", 15, "#,##0.00"); + $xls->add_field("Harga Jual", 15, "#,##0.00"); + $xls->add_field("Margin", 15, "#,##0.00"); + $xls->add_field("%", 8, "0.00%"); + $xls->add_sheet("".str_replace("s/d","-",$apre['periode'])); + + if ($apre['id_mem'] > 0) $xls->add_sub_title("Nama Member : ".$apre['nama_mem']); + + $xls->show_titles(); + $xls->show_headers(); + + $tot_jual = 0; $tot_modal = 0; $tot_margin = 0; + while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) { + $tot_jual += $row['Total_Jual']; + $tot_modal += $row['Total_Modal']; + $tot_margin += $row['Total_Margin']; + $xls->add_row([ $row['No_Jual'], $row['Tgl_Jual'], $row['Nama_Member'], $row['Total_Modal'], $row['Total_Jual'], $row['Total_Margin'], (($row['Total_Margin'])/$row['Total_Jual']) ]); + } + $xls->add_row_bold([ "", "", "GRAND TOTAL", $tot_modal, $tot_jual, $tot_margin, (($tot_margin)/$tot_jual) ]); + } + $xls->add_stamp(1, true); + $xls->download("Data Margin Penjualan ".str_replace("s/d","-",$apre['periode']).".xlsx"); + unset($xls); + } + + public function index() { + $form = new Form($this->app); + $ttipe = $form->radio("_", "Tipe", "R", true, false, ["R"=>"Rekap","D"=>"Detail"]); + $tcab = $form->option_db("_", "CabID", $this->id_cab, true, false, "para_cabang", ["CabID","Nama_Cab"], "Aktif=1 ORDER BY CabID", [0,"SEMUA CABANG"]); + $tmem = $form->textauto("_", "Nama_Member", ['value'=>0,'text'=>"SEMUA MEMBER"], true, true, "nama member"); + $turut = $form->radio("_", "Urut", "B", true, false, ['H'=>"Harga Jual",'M'=>"Margin"]); + $tfrom = $form->datebox("_", "Tgl_From", tgl_ymd(), true, false); + $tto = $form->datebox("_", "Tgl_To", tgl_ymd(), true, false); + $ajson['html'] = ' +
+ +
'.$ttipe.'
+
+
+ +
'.$tcab.'
+
+
+ +
'.$tmem.'
+
+
+ +
'.$turut.'
+
+
+ +
'.$tfrom.'
+
+
+ +
'.$tto.'
+
+ '; + $this->app->json($ajson); + } + +} diff --git a/app/Controller/Report/Jual/MarginposController.php b/app/Controller/Report/Jual/MarginposController.php new file mode 100644 index 0000000..15b08bd --- /dev/null +++ b/app/Controller/Report/Jual/MarginposController.php @@ -0,0 +1,200 @@ +app = $app; + $this->db = $db; + $this->id_cab = Param::Int("CabID", 0); + $this->reg_name = $session->get('WEB_APP')['REG_NAME']; + } + + private function prepare() { + $apre = [ + 'tipe' => Param::Get("Tipe", "R"), // R or D + 'tgl_from' => Param::Get("Tgl_From"), + 'tgl_to' => Param::Get("Tgl_To"), + ]; + + // generate report header + $apre['periode'] = $apre['tgl_from'] . ($apre['tgl_from'] !== $apre['tgl_to'] ? ' s/d '.$apre['tgl_to'] : ''); + + $tsql = ''; $asql = [tgl_sql2str($apre['tgl_from']), tgl_sql2str($apre['tgl_to'])]; + if ($this->id_cab > 0) { + $tsql .= " AND CabID=?"; + array_push($asql, $this->id_cab); + } + + if ($apre['tipe'] === "R") { + $apre['query'] = $this->db->runQuery("SELECT J.*,IFNULL(O.Nama,'KASIR POS') Nama_User FROM (SELECT UserID,SUM(Total_HPP) Total_Modal,SUM(Total_Jual-Total_Diskon) Total_Jual,SUM(Total_Jual-Total_Diskon-Total_HPP) Total_Margin FROM inv_jual WHERE (Tgl_Jual BETWEEN ? AND ?)".$tsql." GROUP BY UserID) J LEFT JOIN app_operator O ON (J.UserID=O.UserID) ORDER BY O.Nama", $asql); + } else { + $apre['query'] = $this->db->runQuery("SELECT J.*,IFNULL(O.Nama,'KASIR POS') Nama_User FROM (SELECT No_Jual,Tgl_Jual,UserID,Total_HPP Total_Modal,(Total_Jual-Total_Diskon) Total_Jual,(Total_Jual-Total_Diskon-Total_HPP) Total_Margin FROM inv_jual WHERE (Tgl_Jual BETWEEN ? AND ?)".$tsql.") J LEFT JOIN app_operator O ON (J.UserID=O.UserID) ORDER BY J.Tgl_Jual,O.Nama", $asql); + } + $apre['judul'] = ['R'=>"REKAP",'D'=>"DETAIL"]; + return $apre; + } + + public function print() { + $apre = $this->prepare(); + + $pre = new PrintHTML($this->app); + $pre->add_title([strtoupper($this->reg_name), $apre['judul'][$apre['tipe']]." MARGIN PENJUALAN / KASIR", "Periode : ".$apre['periode']]); + + if ($apre['tipe'] === "R") { + $pre->add_field("No.",10,"C"); + $pre->add_field("Nama Kasir",50,"L"); + $pre->add_field("Harga Modal",20,"R","rupiah"); + $pre->add_field("Harga Jual",20,"R","rupiah"); + $pre->add_field("Margin",20,"R","rupiah"); + $pre->add_field("%",10,"R","rupiah2"); + + $pre->show_titles(); + $pre->show_headers(); + + $tot_modal = 0; $tot_jual = 0; $tot_margin =0; $nomor = 0; + while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) { + $tot_jual += $row['Total_Jual']; + $tot_modal += $row['Total_Modal']; + $tot_margin += $row['Total_Margin']; + $pre->add_row([ ++$nomor, $row['Nama_User'], $row['Total_Modal'], $row['Total_Jual'], $row['Total_Margin'], ($row['Total_Margin']*100)/$row['Total_Jual'] ]); + } + $pre->add_span([ ["GRAND TOTAL",2,"R,B"],[$tot_modal,1,"R,B","rupiah"],[$tot_jual,1,"R,B","rupiah"],[$tot_margin,1,"R,B","rupiah"],[($tot_margin*100)/$tot_jual,1,"R,B","rupiah2"] ]); + + } else { + $pre->add_field("No. Nota",30,"C"); + $pre->add_field("Tgl. Nota",30,"C", "tgl_sql2str"); + $pre->add_field("Nama Kasir",50,"L"); + $pre->add_field("Harga Modal",20,"R","rupiah"); + $pre->add_field("Harga Jual",20,"R","rupiah"); + $pre->add_field("Margin",20,"R","rupiah"); + $pre->add_field("%",10,"R","rupiah2"); + + $pre->show_titles(); + $pre->show_headers(); + + $tot_jual = 0; $tot_modal = 0; $tot_margin = 0; + while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) { + $tot_jual += $row['Total_Jual']; + $tot_modal += $row['Total_Modal']; + $tot_margin += $row['Total_Margin']; + $pre->add_row([ $row['No_Jual'], $row['Tgl_Jual'], $row['Nama_User'], $row['Total_Modal'], $row['Total_Jual'], $row['Total_Margin'], ($row['Total_Margin']*100)/$row['Total_Jual'] ]); + } + $pre->add_span([ ["GRAND TOTAL",3,"R,B"],[$tot_modal,1,"R,B","rupiah"],[$tot_jual,1,"R,B","rupiah"],[$tot_margin,1,"R,B","rupiah"],[($tot_margin*100)/$tot_jual,1,"R,B","rupiah2"] ]); + } + $pre->add_stamp(1, true); + $pre->show(); + } + + public function excel() { + $apre = $this->prepare(); + $xls = new Xlsx($this->app); + $xls->set_meta([ + 'title' => "Data Margin Penjualan / Kasir", + 'desc' => "Export Data Margin Penjualan / Kasir", + ]); + $xls->add_title([ $this->reg_name, "DATA ".$apre['judul'][$apre['tipe']]." MARGIN PENJUALAN / KASIR", "Periode : ".$apre['periode'] ]); + + if ($apre['tipe'] === "R") { + $xls->add_field("No.", 5, "@integer"); + $xls->add_field("Nama Kasir", 25, "@text"); + $xls->add_field("Harga Modal", 15, "#,##0.00"); + $xls->add_field("Harga Jual", 15, "#,##0.00"); + $xls->add_field("Margin", 15, "#,##0.00"); + $xls->add_field("%", 8, "0.00%"); + $xls->add_sheet("".str_replace("s/d","-",$apre['periode'])); + + $xls->show_titles(); + $xls->show_headers(); + + $tot_jual = 0; $tot_modal = 0; $tot_margin = 0; $nomor = 0; + while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) { + $tot_jual += $row['Total_Jual']; + $tot_modal += $row['Total_Modal']; + $tot_margin += $row['Total_Margin']; + $xls->add_row([ ++$nomor, $row['Nama_User'], $row['Total_Modal'], $row['Total_Jual'], $row['Total_Margin'], (($row['Total_Margin'])/$row['Total_Jual']) ]); + } + $xls->add_row_bold([ "", "GRAND TOTAL", $tot_modal, $tot_jual, $tot_margin, (($tot_margin)/$tot_jual) ]); + + } else { + $xls->add_field("No. Nota", 15, "@"); + $xls->add_field("Tgl. Nota", 12, "@date"); + $xls->add_field("Nama Kasir", 20, "@text"); + $xls->add_field("Harga Modal", 15, "#,##0.00"); + $xls->add_field("Harga Jual", 15, "#,##0.00"); + $xls->add_field("Margin", 15, "#,##0.00"); + $xls->add_field("%", 8, "0.00%"); + $xls->add_sheet("".str_replace("s/d","-",$apre['periode'])); + + $xls->show_titles(); + $xls->show_headers(); + + $tot_jual = 0; $tot_modal = 0; $tot_margin = 0; + while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) { + $tot_jual += $row['Total_Jual']; + $tot_modal += $row['Total_Modal']; + $tot_margin += $row['Total_Margin']; + $xls->add_row([ $row['No_Jual'], $row['Tgl_Jual'], $row['Nama_User'], $row['Total_Modal'], $row['Total_Jual'], $row['Total_Margin'], (($row['Total_Margin'])/$row['Total_Jual']) ]); + } + $xls->add_row_bold([ "", "", "GRAND TOTAL", $tot_modal, $tot_jual, $tot_margin, (($tot_margin)/$tot_jual) ]); + } + $xls->add_stamp(1, true); + $xls->download("Data Margin Penjualan per Kasir ".str_replace("s/d","-",$apre['periode']).".xlsx"); + unset($xls); + } + + public function index() { + $form = new Form($this->app); + $ttipe = $form->radio("_", "Tipe", "R", true, false, ["R"=>"Rekap","D"=>"Detail"]); + $tcab = $form->option_db("_", "CabID", $this->id_cab, true, false, "para_cabang", ["CabID","Nama_Cab"], "Aktif=1 ORDER BY CabID", [0,"SEMUA CABANG"]); + $tfrom = $form->datebox("_", "Tgl_From", tgl_ymd(), true, false); + $tto = $form->datebox("_", "Tgl_To", tgl_ymd(), true, false); + $ajson['html'] = ' +
+ +
'.$ttipe.'
+
+
+ +
'.$tcab.'
+
+
+ +
'.$tfrom.'
+
+
+ +
'.$tto.'
+
'; + $this->app->json($ajson); + } + +} diff --git a/app/Controller/Report/Jual/MutasiController.php b/app/Controller/Report/Jual/MutasiController.php new file mode 100644 index 0000000..8aacd03 --- /dev/null +++ b/app/Controller/Report/Jual/MutasiController.php @@ -0,0 +1,195 @@ +app = $app; + $this->db = $db; + $this->id_cab = Param::Int("CabID", 0); + $this->reg_name = $session->get('WEB_APP')['REG_NAME']; + } + + public function brow_member() { + $tcari = Param::Get("Cari_Member"); + $tsql = ''; $asql = [1]; + if (!empty($tcari)) { + $tsql .= " AND CONCAT_WS(Kode_Member,Nama_Member,Alamat_Member,Telp_Member) LIKE ?"; + $asql[] = '%' . $tcari . '%'; + } + + $obj = new Table($this->app); + $obj->set_table("para_member", "*,CONCAT(IF(Kode_Member='','',CONCAT(Kode_Member,' - ')),Nama_Member) Kode_Nama", "Aktif=?".$tsql, $asql); + $obj->add_field("MemberID", "ID", "hid"); + $obj->add_field("Kode_Nama", "Kode_Nama", "hid"); + $obj->add_field("Kode_Member", "Kode", "c"); + $obj->add_field("Nama_Member", "Nama Member", "awr"); + $obj->add_field("Alamat_Member", "Alamat", "awr"); + $obj->add_field("Telp_Member", "Telp.", "awr"); + $obj->set_field_order("Nama_Member", "A"); + $obj->set_func_select("RepoJualMutasiJS.member_select"); + $this->app->json([ $obj->db_table("divBrowMember") ]); + } + + public function auto_member() { + $tcari = Param::Get("Auto_Query", ""); + $ajson['autodata'] = []; + + $stat = $this->db->runQuery("SELECT MemberID,Grup_MemberID,Kode_Member,Nama_Member,CONCAT(IF(Kode_Member='','',CONCAT(Kode_Member,' - ')),Nama_Member) Kode_Nama FROM para_member WHERE Aktif=1 AND CONCAT(Kode_Member,Nama_Member,Alamat_Member,Telp_Member) LIKE ? ORDER BY Nama_Member LIMIT 50", ['%'.$tcari.'%']); + while ($row = $stat->fetch(SimplePdo::FETCH_ASSOC)) { + $ajson['autodata'][] = ['value'=>$row['MemberID'], 'text'=>$row['Kode_Nama'], 'html'=>''.$row['Kode_Member'].' '.$row['Nama_Member'], 'data'=>0, 'bc'=>0]; + } + $this->app->json($ajson); + } + + private function prepare() { + $apre = [ + 'id_mem' => Param::Int("MemberID", 0), + 'tgl_from' => Param::Get("Tgl_From"), + 'tgl_to' => Param::Get("Tgl_To"), + ]; + + $apre['nama_mem'] = $this->db->fetchField("SELECT CONCAT(Nama_Member,' (',Kode_Member,')') Nama FROM para_member WHERE MemberID=?", [$apre['id_mem']]) ?? ''; + + // generate report header + $apre['periode'] = $apre['tgl_from'] . ($apre['tgl_from'] !== $apre['tgl_to'] ? ' s/d '.$apre['tgl_to'] : ''); + + $tsql = ''; $asql = [$apre['id_mem']]; + if ($this->id_cab > 0) { + $tsql .= " AND CabID=?"; + array_push($asql, $this->id_cab); + } + + $n_saldo = (float) $this->db->fetchField("SELECT SUM(Total_Jual-Total_Diskon) Total FROM inv_jual WHERE MemberID=?".$tsql." AND Tgl_Jualdb->fetchField("SELECT SUM(Total_Bayar+Total_Potong) Bayar FROM inv_jual_lunas WHERE No_Jual IN (SELECT No_Jual FROM inv_jual WHERE MemberID=?".$tsql.") AND Tgl_Bayardb->runQuery("(SELECT Tgl_Jual,SUM(Total_Jual-Total_Diskon) Total,0 Bayar FROM inv_jual WHERE (Tgl_Jual BETWEEN ? AND ?) AND MemberID=?".$tsql." GROUP BY Tgl_Jual) UNION ALL (SELECT Tgl_Bayar Tgl_Jual,0 Total,SUM(Total_Bayar+Total_Potong) Bayar FROM inv_jual_lunas WHERE No_Jual IN (SELECT No_Jual FROM inv_jual WHERE MemberID=?".$tsql.") AND (Tgl_Bayar BETWEEN ? AND ?) GROUP BY Tgl_Bayar) ORDER BY Tgl_Jual,Total DESC", array_merge([tgl_sql2str($apre['tgl_from']),tgl_sql2str($apre['tgl_to'])], $asql, $asql, [tgl_sql2str($apre['tgl_from']),tgl_sql2str($apre['tgl_to'])])); + return $apre; + } + + public function print() { + $apre = $this->prepare(); + + $pre = new PrintHTML($this->app); + $pre->add_title([strtoupper($this->reg_name), "MUTASI PENJUALAN", "Periode : ".$apre['periode']]); + + $pre->add_field("Tanggal",10,"C","tgl_sql2str"); + $pre->add_field("Nota / Bon",20,"R","rupiah"); + $pre->add_field("Bayar",20,"R","rupiah"); + $pre->add_field("Sisa",20,"R","rupiah"); + + $pre->add_sub_title("Nama Member : ".$apre['nama_mem']); + + $pre->show_titles(); + $pre->show_headers(); + + $tot_sub = 0; $tot_bayar = 0; + $pre->add_span([ ["Saldo Awal",1,"R,B"],["0",1,"R,B"],["0",1,"R,B"],[$apre['Saldo'],1,"R,B","rupiah"] ]); + while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) { + $tot_sub += $row['Total']; + $tot_bayar += $row['Bayar']; + $apre['Saldo'] += $row['Total'] - $row['Bayar']; + $pre->add_row([ $row['Tgl_Beli'], $row['Total'], $row['Bayar'], $apre['Saldo'] ]); + } + $pre->add_span([ ["Saldo Akhir",1,"R,B"],[$tot_sub,1,"R,B","rupiah"],[$tot_bayar,1,"R,B","rupiah"],[$apre['Saldo'],1,"R,B","rupiah"] ]); + + $pre->add_stamp(1, true); + $pre->show(); + } + + public function excel() { + $apre = $this->prepare(); + $xls = new Xlsx($this->app); + $xls->set_meta([ + 'title' => "Data Mutasi Penjualan", + 'desc' => "Export Data Mutasi Penjualan" + ]); + $xls->add_title([ $this->reg_name, "DATA MUTASI PENJUALAN", "Periode : ".$apre['periode'] ]); + + $xls->add_field("Tanggal", 12, "@date"); + $xls->add_field("Nota / Bon", 15, "#,##0.00"); + $xls->add_field("Bayar", 15, "#,##0.00"); + $xls->add_field("Sisa", 15, "#,##0.00"); + $xls->add_sheet("".str_replace("s/d","-",$apre['periode'])); + + $xls->add_sub_title("Nama Member : ".$apre['nama_mem']); + + $xls->show_titles(); + $xls->show_headers(); + + $tot_sub = 0; $tot_bayar = 0; + $xls->add_row_bold([ "Saldo Awal", 0, 0, $apre['Saldo'] ]); + while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) { + $tot_sub += $row['Total']; + $tot_bayar += $row['Bayar']; + $apre['Saldo'] += $row['Total'] - $row['Bayar']; + $xls->add_row([ $row['Tgl_Beli'], $row['Total'], $row['Bayar'], $apre['Saldo'] ]); + } + $xls->add_row_bold([ "Saldo Akhir", $tot_sub, $tot_bayar, $apre['Saldo'] ]); + + $xls->add_stamp(1, true); + $xls->download("Data Mutasi Penjualan ".str_replace("s/d","-",$apre['periode']).".xlsx"); + unset($xls); + } + + public function index() { + $form = new Form($this->app); + $tcab = $form->option_db("_", "CabID", $this->id_cab, true, false, "para_cabang", ["CabID","Nama_Cab"], "Aktif=1 ORDER BY CabID", [0,"SEMUA CABANG"]); + $tmember = $form->textauto("_", "Nama_Member", ['value'=>0,'text'=>""], true, true, "nama member"); + $tfrom = $form->datebox("_", "Tgl_From", tgl_ymd(), true, false); + $tto = $form->datebox("_", "Tgl_To", tgl_ymd(), true, false); + $ajson['html'] = ' +
+ +
'.$tcab.'
+
+
+ +
'.$tmember.'
+
+
+ +
'.$tfrom.'
+
+
+ +
'.$tto.'
+
+ '; + $this->app->json($ajson); + } + +} diff --git a/app/Controller/Report/Jual/RekapController.php b/app/Controller/Report/Jual/RekapController.php new file mode 100644 index 0000000..001adb3 --- /dev/null +++ b/app/Controller/Report/Jual/RekapController.php @@ -0,0 +1,242 @@ +app = $app; + $this->db = $db; + $this->id_cab = Param::Int("CabID", 0); + $this->reg_name = $session->get('WEB_APP')['REG_NAME']; + } + + public function brow_member() { + $tcari = Param::Get("Cari_Member"); + $tsql = ''; $asql = [1]; + if (!empty($tcari)) { + $tsql .= " AND CONCAT_WS(Kode_Member,Nama_Member,Alamat_Member,Telp_Member) LIKE ?"; + $asql[] = '%' . $tcari . '%'; + } + + $obj = new Table($this->app); + $obj->set_table("para_member", "*,CONCAT(IF(Kode_Member='','',CONCAT(Kode_Member,' - ')),Nama_Member) Kode_Nama", "Aktif=?".$tsql, $asql); + $obj->add_field("MemberID", "ID", "hid"); + $obj->add_field("Kode_Nama", "Kode_Nama", "hid"); + $obj->add_field("Kode_Member", "Kode", "c"); + $obj->add_field("Nama_Member", "Nama Member", "awr"); + $obj->add_field("Alamat_Member", "Alamat", "awr"); + $obj->add_field("Telp_Member", "Telp.", "awr"); + $obj->set_field_order("Nama_Member", "A"); + $obj->set_func_select("RepoJualRekapJS.member_select"); + $this->app->json([ $obj->db_table("divBrowMember") ]); + } + + public function brow_produk() { + $tcari = Param::Get("Cari_Produk"); + $tsql = ''; $asql = [1]; + if (!empty($tcari)) { + $tsql .= " AND Barcode_Nama LIKE ?"; + $asql[] = '%' . $tcari . '%'; + } + + $obj = new Table($this->app); + $obj->set_table("vi_inv_produk", "*", "Aktif=?".$tsql, $asql); + $obj->add_field("InvID", "ID", "hid"); + $obj->add_field("SatuanID", "ID", "hid"); + $obj->add_field("VarianID", "ID", "hid"); + $obj->add_field("Kode_SKU", "SKU", "c"); + $obj->add_field("Kode_Barcode", "Barcode", "c"); + $obj->add_field("Nama_Lengkap", "Nama Barang", "awr"); + $obj->set_field_order("Kode_SKU", "A"); + $obj->set_func_select("RepoJualRekapJS.produk_select"); + $this->app->json([ $obj->db_table("divBrowProduk") ]); + } + + public function auto_member() { + $tcari = Param::Get("Auto_Query", ""); + $ajson['autodata'] = []; + + $stat = $this->db->runQuery("SELECT MemberID,Grup_MemberID,Kode_Member,Nama_Member,CONCAT(IF(Kode_Member='','',CONCAT(Kode_Member,' - ')),Nama_Member) Kode_Nama FROM para_member WHERE Aktif=1 AND CONCAT(Kode_Member,Nama_Member,Alamat_Member,Telp_Member) LIKE ? ORDER BY Nama_Member LIMIT 50", ['%'.$tcari.'%']); + while ($row = $stat->fetch(SimplePdo::FETCH_ASSOC)) { + $ajson['autodata'][] = ['value'=>$row['MemberID'], 'text'=>$row['Kode_Nama'], 'html'=>''.$row['Kode_Member'].' '.$row['Nama_Member'], 'data'=>0, 'bc'=>0]; + } + $this->app->json($ajson); + } + + public function auto_produk() { + $tcari = Param::Get("Auto_Query", ""); + $ajson['autodata'] = []; + $bcode = 0; $arec = []; + + // Cari by SKU + Barcode + $_row = $this->db->fetchRow("SELECT P.InvID,P.Nama_Lengkap FROM (SELECT * FROM vi_inv_produk WHERE Aktif=1 AND (Kode_SKU=? OR Kode_Barcode=?)) P", [$tcari, $tcari]); + if ($_row) { + $bcode = 1; + $arec = $_row->getData(); + } + if ($bcode === 1) { + $ajson['autodata'][] = ['value'=>$arec['InvID'], 'text'=>$arec['Nama_Lengkap'], 'data'=>0, 'bc'=>1]; + } else { + $stat = $this->db->runQuery("SELECT P.InvID,P.Nama_Lengkap,P.Kode_SKU FROM (SELECT * FROM vi_inv_produk WHERE Barcode_Nama LIKE ? AND Aktif=1) P ORDER BY P.Nama_Produk,P.Qty LIMIT 50", ['%'.$tcari.'%']); + while ($row = $stat->fetch(SimplePdo::FETCH_ASSOC)) { + $ajson['autodata'][] = ['value'=>$row['InvID'], 'text'=>$row['Nama_Lengkap'], 'html'=>''.$row['Kode_SKU'].' '.$row['Nama_Lengkap'], 'data'=>0, 'bc'=>0]; + } + } + $this->app->json($ajson); + } + + private function prepare() { + $apre = [ + 'id_mem' => Param::Int("MemberID", 0), + 'id_inv' => Param::Int("InvID", 0), + 'tgl_from' => Param::Get("Tgl_From"), + 'tgl_to' => Param::Get("Tgl_To"), + 'Nama_Produk' => "", + 'Qty' => 1, + 'Satuan_Stok' => "", + 'Satuan_Kemasan' => "", + ]; + + $apre['nama_mem'] = $this->db->fetchField("SELECT CONCAT(Nama_Member,' (',Kode_Member,')') Nama FROM para_member WHERE MemberID=?", [$apre['id_mem']]) ?? ''; + $_produk = $this->db->fetchRow("SELECT Nama_Produk,Qty,Satuan_Stok,Nama_Satuan Satuan_Kemasan FROM vi_inv_produk WHERE InvID=? ORDER BY Qty LIMIT 1", [$apre['id_inv']]); + if ($_produk) $apre = array_merge($apre, $_produk->getData()); + + // generate report header + $apre['periode'] = $apre['tgl_from'] . ($apre['tgl_from'] !== $apre['tgl_to'] ? ' s/d '.$apre['tgl_to'] : ''); + + $tsql = ''; $asql = [$apre['id_inv'], tgl_sql2str($apre['tgl_from']), tgl_sql2str($apre['tgl_to'])]; + if ($this->id_cab > 0) { + $tsql .= " AND CabID=?"; + array_push($asql, $this->id_cab); + } + array_push($asql, tgl_sql2str($apre['tgl_from']), tgl_sql2str($apre['tgl_to']), $apre['id_mem']); + + $apre['query'] = $this->db->runQuery("SELECT D.*,C.Nama_Cab FROM (SELECT No_Ref,Tgl_Ref,-Qty Qty FROM inv_detail WHERE NotaID IN (5,6) AND InvID=? AND (Tgl_Ref BETWEEN ? AND ?)".$tsql." ORDER BY No_Ref) D LEFT JOIN (SELECT No_Jual,CabID FROM inv_jual WHERE (Tgl_Jual BETWEEN ? AND ?) AND MemberID=?) J ON (J.No_Jual=D.No_Ref) LEFT JOIN para_cabang C ON (J.CabID=C.CabID) ORDER BY D.Tgl_Ref", $asql); + return $apre; + } + + public function print() { + $apre = $this->prepare(); + + $pre = new PrintHTML($this->app); + $pre->add_title([strtoupper($this->reg_name), "REKAP PENJUALAN PER MEMBER", "Periode : ".$apre['periode']]); + + $pre->add_field("No.",10,"C"); + $pre->add_field("No. Nota",30,"C"); + $pre->add_field("Tgl. Nota",30,"C", "tgl_sql2str"); + $pre->add_field("Cabang",50,"L"); + $pre->add_field("Qty",20,"R"); + + $pre->add_sub_title("Nama Member : ".$apre['nama_mem']); + $pre->add_sub_title("Nama Barang : ".$apre['Nama_Produk']); + + $pre->show_titles(); + $pre->show_headers(); + + $no_urut = 0; $tot_qty = 0; + while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) { + $tot_qty += $row['Qty']; + $pre->add_row([ ++$no_urut, $row['No_Ref'], $row['Tgl_Ref'], $row['Nama_Cab'], Invesa::Format_Stok($row['Qty'], $apre['Qty'], $apre['Satuan_Kemasan'], $apre['Satuan_Stok']) ]); + } + $pre->add_span([ ["TOTAL PENJUALAN",4,"R,B"],[Invesa::Format_Stok($tot_qty, $apre['Qty'], $apre['Satuan_Kemasan'], $apre['Satuan_Stok']),1,"R,B"] ]); + $pre->add_stamp(1, true); + $pre->show(); + } + + public function excel() { + $apre = $this->prepare(); + $xls = new Xlsx($this->app); + $xls->set_meta([ + 'title' => "Data Rekap Penjualan", + 'desc' => "Export Data Rekap Penjualan" + ]); + $xls->add_title([ $this->reg_name, "DATA REKAP PENJUALAN", "Periode : ".$apre['periode'] ]); + + $xls->add_field("No.", 6, "@integer"); + $xls->add_field("No. Nota", 15, "@text"); + $xls->add_field("Tgl. Nota", 12, "@date"); + $xls->add_field("Cabang", 20, "@text"); + $xls->add_field("Qty", 15, "@"); + $xls->add_sheet("".str_replace("s/d","-",$apre['periode'])); + + $xls->add_sub_title("Nama Member : ".$apre['nama_mem']); + $xls->add_sub_title("Nama Barang : ".$apre['Nama_Produk']); + + $xls->show_titles(); + $xls->show_headers(); + + $no_urut = 0; $tot_qty = 0; + while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) { + $tot_qty += $row['Qty']; + $xls->add_row([ ++$no_urut, $row['No_Ref'], $row['Tgl_Ref'], $row['Nama_Cab'], Invesa::Format_Stok($row['Qty'], $apre['Qty'], $apre['Satuan_Kemasan'], $apre['Satuan_Stok']) ]); + } + $xls->add_row_bold([ "", "", "", "GRAND TOTAL", Invesa::Format_Stok($tot_qty, $apre['Qty'], $apre['Satuan_Kemasan'], $apre['Satuan_Stok']) ]); + $xls->add_stamp(1, true); + $xls->download("Data Rekap Penjualan ".str_replace("s/d","-",$apre['periode']).".xlsx"); + unset($xls); + } + + public function index() { + $form = new Form($this->app); + $tcab = $form->option_db("_", "CabID", $this->id_cab, true, false, "para_cabang", ["CabID","Nama_Cab"], "Aktif=1 ORDER BY CabID", [0,"SEMUA CABANG"]); + $tmember = $form->textauto("_", "Nama_Member", ['value'=>0,'text'=>""], true, true, "nama member"); + $tproduk = $form->textauto("_", "Nama_Produk", ['value'=>0,'text'=>""], true, true, "nama barang"); + $tfrom = $form->datebox("_", "Tgl_From", tgl_ymd(), true, false); + $tto = $form->datebox("_", "Tgl_To", tgl_ymd(), true, false); + $ajson['html'] = ' +
+ +
'.$tcab.'
+
+
+ +
'.$tmember.'
+
+
+ +
'.$tproduk.'
+
+
+ +
'.$tfrom.'
+
+
+ +
'.$tto.'
+
+ + '; + $this->app->json($ajson); + } + +} diff --git a/app/Controller/Report/Member/HistoriController.php b/app/Controller/Report/Member/HistoriController.php new file mode 100644 index 0000000..e71151d --- /dev/null +++ b/app/Controller/Report/Member/HistoriController.php @@ -0,0 +1,203 @@ +app = $app; + $this->db = $db; + $this->id_cab = Param::Int("CabID", 0); + $this->reg_name = $session->get('WEB_APP')['REG_NAME']; + } + + public function brow_member() { + $tcari = Param::Get("Cari_Member"); + $tsql = ''; $asql = [1]; + if (!empty($tcari)) { + $tsql .= " AND CONCAT_WS(Kode_Member,Nama_Member,Alamat_Member,Telp_Member) LIKE ?"; + $asql[] = '%' . $tcari . '%'; + } + + $obj = new Table($this->app); + $obj->set_table("para_member", "*,CONCAT(IF(Kode_Member='','',CONCAT(Kode_Member,' - ')),Nama_Member) Kode_Nama", "Aktif=?".$tsql, $asql); + $obj->add_field("MemberID", "ID", "hid"); + $obj->add_field("Kode_Nama", "Kode_Nama", "hid"); + $obj->add_field("Kode_Member", "Kode", "c"); + $obj->add_field("Nama_Member", "Nama Member", "awr"); + $obj->add_field("Alamat_Member", "Alamat", "awr"); + $obj->add_field("Telp_Member", "Telp.", "awr"); + $obj->set_field_order("Nama_Member", "A"); + $obj->set_func_select("RepoMemberHistoriJS.member_select"); + $this->app->json([ $obj->db_table("divBrowMember") ]); + } + + public function auto_member() { + $tcari = Param::Get("Auto_Query", ""); + $ajson['autodata'] = []; + + $stat = $this->db->runQuery("SELECT MemberID,Grup_MemberID,Kode_Member,Nama_Member,CONCAT(IF(Kode_Member='','',CONCAT(Kode_Member,' - ')),Nama_Member) Kode_Nama FROM para_member WHERE Aktif=1 AND CONCAT(Kode_Member,Nama_Member,Alamat_Member,Telp_Member) LIKE ? ORDER BY Nama_Member LIMIT 50", ['%'.$tcari.'%']); + while ($row = $stat->fetch(SimplePdo::FETCH_ASSOC)) { + $ajson['autodata'][] = ['value'=>$row['MemberID'], 'text'=>$row['Kode_Nama'], 'html'=>''.$row['Kode_Member'].' '.$row['Nama_Member'], 'data'=>0, 'bc'=>0]; + } + $this->app->json($ajson); + } + + private function prepare() { + $apre = [ + 'id_tipe' => Param::Int("Point_TipeID", 0), + 'id_mem' => Param::Int("MemberID", 0), + 'tgl_from' => Param::Get("Tgl_From"), + 'tgl_to' => Param::Get("Tgl_To"), + ]; + + $apre['nama_tipe'] = ($apre['id_tipe'] > 0) ? ($this->db->fetchField("SELECT UPPER(Nama_Tipe) FROM inv_point_tipe WHERE Point_TipeID=?", [$apre['id_tipe']]) ?? '') : ''; + $apre['nama_mem'] = ($apre['id_mem'] > 0) ? ($this->db->fetchField("SELECT CONCAT(IFNULL(Kode_Member,'000000'),' - ',UPPER(Nama_Member)) FROM para_member WHERE MemberID=?", [$apre['id_mem']]) ?? '') : ''; + + // generate report header + $apre['periode'] = $apre['tgl_from'] . ($apre['tgl_from'] !== $apre['tgl_to'] ? ' s/d '.$apre['tgl_to'] : ''); + + $tsql = ''; $asql = [$apre['id_tipe'], $apre['id_mem'], tgl_sql2str($apre['tgl_from']), tgl_sql2str($apre['tgl_to'])]; + if ($this->id_cab > 0) { + $tsql .= " AND CabID=?"; + array_push($asql, $this->id_cab); + } + + $apre['saldo'] = $this->db->fetchField("SELECT SUM(Nilai_Point) Saldo FROM inv_point_tx WHERE Point_TipeID=? AND MemberID=? AND Tgl_TXdb->runQuery("SELECT P.*,C.Nama_Cab FROM (SELECT No_TX,Tgl_TX,CabID,IF(Nilai_Point>0,Nilai_Point,0) Tambah,IF(Nilai_Point<0,-Nilai_Point,0) Kurang,Nilai_Point FROM inv_point_tx WHERE Point_TipeID=? AND MemberID=? AND (Tgl_TX BETWEEN ? AND ?)".$tsql." ORDER BY CabID) P LEFT JOIN para_cabang C ON (C.CabID=P.CabID) ORDER BY DATE(P.Tgl_TX) ASC,P.Nilai_Point DESC", $asql); + return $apre; + } + + public function print() { + $apre = $this->prepare(); + + $pre = new PrintHTML($this->app); + $pre->add_title([strtoupper($this->reg_name), "SEJARAH POINT MEMBER ".$apre['nama_tipe'], "Periode : ".$apre['periode']]); + + $pre->add_field("No.",10,"C"); + $pre->add_field("No. TX",20,"L"); + $pre->add_field("Tgl. TX",20,"C","tgl_sql2str"); + $pre->add_field("Cabang",40,"L"); + $pre->add_field("Perolehan",20,"R","rupiah"); + $pre->add_field("Penukaran",20,"R","rupiah"); + $pre->add_field("Sisa Point",20,"R","rupiah"); + + if ($apre['id_mem'] > 0) $pre->add_sub_title("Nama Member : ".$apre['nama_mem']); + + $pre->show_titles(); + $pre->show_headers(); + + $nomor = 0; $tot_tambah = 0; $tot_kurang = 0; + $pre->add_span([ ["Point Sebelumnya",4,"R,B"],['',1],['',1],[$apre['saldo'],1,"R,B","rupiah"] ]); + while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) { + $tot_tambah += $row['Tambah']; + $tot_kurang += $row['Kurang']; + $apre['saldo'] += $row['Nilai_Point']; + $pre->add_row([ ++$nomor, $row['No_TX'], $row['Tgl_TX'], $row['Nama_Cab'], $row['Tambah'], $row['Kurang'], $apre['saldo'] ]); + } + $pre->add_span([ ["Jumlah / Sisa Point",4,"R,B"],[$tot_tambah,1,"R,B","rupiah"],[$tot_kurang,1,"R,B","rupiah"],[$apre['saldo'],1,"R,B","rupiah"] ]); + + $pre->add_stamp(1, true); + $pre->show(); + } + + public function excel() { + $apre = $this->prepare(); + $xls = new Xlsx($this->app); + $xls->set_meta([ + 'title' => "Data Sejarah Point Member", + 'desc' => "Export Data Sejarah Point Member" + ]); + $xls->add_title([ $this->reg_name, "DATA SEJARAH POINT MEMBER ".$apre['nama_tipe'], "Periode : ".$apre['periode'] ]); + + $xls->add_field("No.", 5, "@integer"); + $xls->add_field("No. TX", 10, "@text"); + $xls->add_field("Tgl. TX", 12, "@date"); + $xls->add_field("Cabang", 15, "@text"); + $xls->add_field("Perolehan", 15, "#,##0"); + $xls->add_field("Penukaran", 15, "#,##0"); + $xls->add_field("Sisa Point", 15, "#,##0"); + $xls->add_sheet("".str_replace("s/d","-",$apre['periode'])); + + if ($apre['id_mem'] > 0) $xls->add_sub_title("Nama Member : ".$apre['nama_mem']); + + $xls->show_titles(); + $xls->show_headers(); + + $nomor = 0; $tot_tambah = 0; $tot_kurang = 0; + $xls->add_row_bold([ "", "", "", "Point Sebelumnya", "", "", $apre['saldo'] ]); + while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) { + $tot_tambah += $row['Tambah']; + $tot_kurang += $row['Kurang']; + $apre['saldo'] += $row['Nilai_Point']; + $xls->add_row([ ++$nomor, $row['No_TX'], $row['Tgl_TX'], $row['Nama_Cab'], $row['Tambah'], $row['Kurang'], $apre['saldo'] ]); + } + $xls->add_row_bold([ "", "", "", "Jumlah / Sisa Point", $tot_tambah, $tot_kurang, $apre['saldo'] ]); + + $xls->add_stamp(1, true); + $xls->download("Data Sejarah Point Member ".str_replace("s/d","-",$apre['periode']).".xlsx"); + unset($xls); + } + + public function index() { + $form = new Form($this->app); + $ttipe = $form->option_db("_", "Point_TipeID", 0, true, false, "inv_point_tipe", ["Point_TipeID","Nama_Tipe"], "TRUE ORDER BY Point_TipeID", [0," "]); + $tcab = $form->option_db("_", "CabID", $this->id_cab, true, false, "para_cabang", ["CabID","Nama_Cab"], "Aktif=1 ORDER BY CabID", [0,"SEMUA CABANG"]); + $tmem = $form->textauto("_", "Nama_Member", ['value'=>0,'text'=>""], true, true, "nama member"); + $tfrom = $form->datebox("_", "Tgl_From", tgl_ymd(), true, false); + $tto = $form->datebox("_", "Tgl_To", tgl_ymd(), true, false); + $ajson['html'] = ' +
+ +
'.$tcab.'
+
+
+ +
'.$ttipe.'
+
+
+ +
'.$tmem.'
+
+
+ +
'.$tfrom.'
+
+
+ +
'.$tto.'
+
+ '; + $this->app->json($ajson); + } + +} diff --git a/app/Controller/Report/Member/PointController.php b/app/Controller/Report/Member/PointController.php new file mode 100644 index 0000000..cc8b2e3 --- /dev/null +++ b/app/Controller/Report/Member/PointController.php @@ -0,0 +1,176 @@ +app = $app; + $this->db = $db; + $this->id_cab = Param::Int("CabID", 0); + $this->reg_name = $session->get('WEB_APP')['REG_NAME']; + } + + private function prepare() { + $apre = [ + 'id_tipe' => Param::Int("Point_TipeID", 0), + 'id_grup_mem' => Param::Int("Grup_MemberID", 0), + 'urut' => Param::Get("Urut", "P"), + 'tgl_from' => Param::Get("Tgl_From"), + 'tgl_to' => Param::Get("Tgl_To"), + ]; + + $apre['nama_tipe'] = ($apre['id_tipe'] > 0) ? ($this->db->fetchField("SELECT UPPER(Nama_Tipe) FROM inv_point_tipe WHERE Point_TipeID=?", [$apre['id_tipe']]) ?? '') : ''; + + // generate report header + $apre['periode'] = $apre['tgl_from'] . ($apre['tgl_from'] !== $apre['tgl_to'] ? ' s/d '.$apre['tgl_to'] : ''); + + $tsql1 = ''; $tsql2 = ''; $asql1 = []; $asql2 = [$apre['id_tipe'], tgl_sql2str($apre['tgl_from']), tgl_sql2str($apre['tgl_to'])]; + if ($this->id_cab > 0) { + $tsql2 .= " AND CabID=?"; + array_push($asql2, $this->id_cab); + } + if ($apre['id_grup_mem'] > 0) { + $tsql1 .= " AND Grup_MemberID=?"; + array_push($asql1, $apre['id_grup_mem']); + } + $torder = ($apre['urut'] === "N") ? "M.Nama_Member ASC" : "P.Sisa_Point DESC"; + $torder = ($apre['urut'] === "P") ? "P.Tambah_Point DESC" : $torder; + + $apre['query'] = $this->db->runQuery("SELECT M.*,G.Nama_Grup,P.* FROM (SELECT * FROM para_member WHERE (IM=1 OR (IM=0 AND Kode_Member<>''))".$tsql1.") M LEFT JOIN para_member_grup G ON (G.Grup_MemberID=M.Grup_MemberID) LEFT JOIN (SELECT MemberID,SUM(IF(Nilai_Point>0,Nilai_Point,0)) Tambah_Point,SUM(IF(Nilai_Point<0,-Nilai_Point,0)) Kurang_Point,SUM(Nilai_Point) Sisa_Point FROM inv_point_tx WHERE Point_TipeID=? AND Tgl_TX BETWEEN ? AND ?".$tsql2." GROUP BY MemberID ORDER BY MemberID) P ON (P.MemberID=M.MemberID) ORDER BY ".$torder, array_merge($asql1, $asql2)); + return $apre; + } + + public function print() { + $apre = $this->prepare(); + + $pre = new PrintHTML($this->app); + $pre->add_title([strtoupper($this->reg_name), "JUMLAH POINT MEMBER ".$apre['nama_tipe'], "Periode : ".$apre['periode']]); + + $pre->add_field("No.",10,"C"); + $pre->add_field("ID Member",20,"L"); + $pre->add_field("Grup Member",40,"L"); + $pre->add_field("Nama Member",80,"L"); + $pre->add_field("No. Telp",80,"L"); + $pre->add_field("Alamat Member",120,"L"); + $pre->add_field("Jumlah Point",20,"R","rupiah"); + $pre->add_field("Jumlah Tukar",20,"R","rupiah"); + $pre->add_field("Sisa Point",20,"R","rupiah"); + + $pre->show_titles(); + $pre->show_headers(); + + $nomor = 0; $tot_point = 0; $tot_tukar = 0; $tot_sisa = 0; + while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) { + $tot_point += $row['Tambah_Point']; + $tot_tukar += $row['Kurang_Point']; + $tot_sisa += $row['Sisa_Point']; + $pre->add_row([ ++$nomor, $row['Kode_Member'], $row['Nama_Grup'], $row['Nama_Member'], $row['Telp_Member'], $row['Alamat_Member'], $row['Tambah_Point'], $row['Kurang_Point'], $row['Sisa_Point'] ]); + } + $pre->add_span([ ["GRAND TOTAL",6,"R,B"],[$tot_point,1,"R,B","rupiah"],[$tot_tukar,1,"R,B","rupiah"],[$tot_sisa,1,"R,B","rupiah"] ]); + + $pre->add_stamp(1, true); + $pre->show(); + } + + public function excel() { + $apre = $this->prepare(); + $xls = new Xlsx($this->app); + $xls->set_meta([ + 'title' => "Data Jumlah Point Member", + 'desc' => "Export Data Jumlah Point Member" + ]); + $xls->add_title([ $this->reg_name, "DATA JUMLAH POINT MEMBER ".$apre['nama_tipe'], "Periode : ".$apre['periode'] ]); + + $xls->add_field("No.", 5, "@integer"); + $xls->add_field("ID Member", 10, "@text"); + $xls->add_field("Grup Member", 15, "@text"); + $xls->add_field("Nama Member", 15, "@text"); + $xls->add_field("No. Telp", 12, "@text"); + $xls->add_field("Alamat Member", 25, "@text"); + $xls->add_field("Jumlah Point", 15, "#,##0.00"); + $xls->add_field("Jumlah Tukar", 15, "#,##0.00"); + $xls->add_field("Sisa Point", 15, "#,##0.00"); + $xls->add_sheet("".str_replace("s/d","-",$apre['periode'])); + + $xls->show_titles(); + $xls->show_headers(); + + $nomor = 0; $tot_point = 0; $tot_tukar = 0; $tot_sisa = 0; + while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) { + $tot_point += $row['Tambah_Point']; + $tot_tukar += $row['Kurang_Point']; + $tot_sisa += $row['Sisa_Point']; + $xls->add_row([ ++$nomor, $row['Kode_Member'], $row['Nama_Grup'], $row['Nama_Member'], $row['Telp_Member'], $row['Alamat_Member'], $row['Tambah_Point'], $row['Kurang_Point'], $row['Sisa_Point'] ]); + } + $xls->add_row_bold([ "", "", "", "GRAND TOTAL", "", "", $tot_point, $tot_tukar, $tot_sisa ]); + + $xls->add_stamp(1, true); + $xls->download("Data Jumlah Point Member ".str_replace("s/d","-",$apre['periode']).".xlsx"); + unset($xls); + } + + public function index() { + $form = new Form($this->app); + $ttipe = $form->option_db("_", "Point_TipeID", 0, true, false, "inv_point_tipe", ["Point_TipeID","Nama_Tipe"], "TRUE ORDER BY Point_TipeID", [0," "]); + $tcab = $form->option_db("_", "CabID", $this->id_cab, true, false, "para_cabang", ["CabID","Nama_Cab"], "Aktif=1 ORDER BY CabID", [0,"SEMUA CABANG"]); + $tgrup_mem = $form->option_db("_", "Grup_MemberID", 0, true, false, "para_member_grup", ["Grup_MemberID","Nama_Grup"], "TRUE ORDER BY Nama_Grup", [0,"SEMUA GRUP"]); + $turut = $form->radio("_", "Urut", "B", true, false, ['N'=>"Nama (A-Z)",'P'=>"Jumlah Point (Z-A)",'S'=>"Sisa Point (Z-A)"]); + $tfrom = $form->datebox("_", "Tgl_From", tgl_ymd(), true, false); + $tto = $form->datebox("_", "Tgl_To", tgl_ymd(), true, false); + $ajson['html'] = ' +
+ +
'.$tcab.'
+
+
+ +
'.$ttipe.'
+
+
+ +
'.$tgrup_mem.'
+
+
+ +
'.$turut.'
+
+
+ +
'.$tfrom.'
+
+
+ +
'.$tto.'
+
'; + $this->app->json($ajson); + } + +} diff --git a/app/Controller/Report/Member/TukarController.php b/app/Controller/Report/Member/TukarController.php new file mode 100644 index 0000000..7475c18 --- /dev/null +++ b/app/Controller/Report/Member/TukarController.php @@ -0,0 +1,157 @@ +app = $app; + $this->db = $db; + $this->id_cab = Param::Int("CabID", 0); + $this->reg_name = $session->get('WEB_APP')['REG_NAME']; + } + + private function prepare() { + $apre = [ + 'id_tipe' => Param::Int("Point_TipeID", 0), + 'id_grup_mem' => Param::Int("Grup_MemberID", 0), + 'tgl_from' => Param::Get("Tgl_From"), + 'tgl_to' => Param::Get("Tgl_To"), + ]; + + $apre['nama_tipe'] = ($apre['id_tipe'] > 0) ? ($this->db->fetchField("SELECT UPPER(Nama_Tipe) FROM inv_point_tipe WHERE Point_TipeID=?", [$apre['id_tipe']]) ?? '') : ''; + + // generate report header + $apre['periode'] = $apre['tgl_from'] . ($apre['tgl_from'] !== $apre['tgl_to'] ? ' s/d '.$apre['tgl_to'] : ''); + + $tsql = ''; $asql = [$apre['id_tipe'], tgl_sql2str($apre['tgl_from']), tgl_sql2str($apre['tgl_to'])]; + if ($this->id_cab > 0) { + $tsql .= " AND CabID=?"; + array_push($asql, $this->id_cab); + } + if ($apre['id_grup_mem'] > 0) { + $tsql .= " AND MemberID IN (SELECT MemberID FROM para_member WHERE Grup_MemberID=?)"; + array_push($asql, $apre['id_grup_mem']); + } + + $apre['query'] = $this->db->runQuery("SELECT P.*,B.Nama_Barang FROM (SELECT InvPID,SUM(Nilai_Point) Nilai_Point,COUNT(*) Qty FROM inv_point_tx WHERE Point_TipeID=? AND (Tgl_TX BETWEEN ? AND ?)".$tsql." GROUP BY InvPID ORDER BY InvPID) P LEFT JOIN inv_point_barang B ON (P.InvPID=B.InvPID) ORDER BY B.Nama_Barang", $asql); + return $apre; + } + + public function print() { + $apre = $this->prepare(); + + $pre = new PrintHTML($this->app); + $pre->add_title([strtoupper($this->reg_name), "PENUKARAN BARANG ".$apre['nama_tipe'], "Periode : ".$apre['periode']]); + + $pre->add_field("No.",10,"C"); + $pre->add_field("Nama Barang",80,"L"); + $pre->add_field("Qty Tukar",20,"R","rupiah"); + $pre->add_field("Point Tukar",20,"R","rupiah"); + + $pre->show_titles(); + $pre->show_headers(); + + $nomor = 0; $tot_point = 0; $tot_tukar = 0; + while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) { + $tot_point += $row['Nilai_Point']; + $tot_tukar += $row['Qty']; + $pre->add_row([ ++$nomor, $row['Nama_Barang'], $row['Qty'], $row['Nilai_Point'] ]); + } + $pre->add_span([ ["Grand Total",2,"R,B"],[$tot_point,1,"R,B","rupiah"],[$tot_tukar,1,"R,B","rupiah"] ]); + + $pre->add_stamp(1, true); + $pre->show(); + } + + public function excel() { + $apre = $this->prepare(); + $xls = new Xlsx($this->app); + $xls->set_meta([ + 'title' => "Data Penukaran Barang", + 'desc' => "Export Data Penukaran Barang" + ]); + $xls->add_title([ $this->reg_name, "DATA PENUKARAN BARANG ".$apre['nama_tipe'], "Periode : ".$apre['periode'] ]); + + $xls->add_field("No.", 5, "@integer"); + $xls->add_field("Nama Barang", 25, "@text"); + $xls->add_field("Qty Tukar", 15, "#,##0"); + $xls->add_field("Point Tukar", 15, "#,##0"); + $xls->add_sheet("".str_replace("s/d","-",$apre['periode'])); + + $xls->show_titles(); + $xls->show_headers(); + + $nomor = 0; $tot_point = 0; $tot_tukar = 0; + while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) { + $tot_point += $row['Nilai_Point']; + $tot_tukar += $row['Qty']; + $xls->add_row([ ++$nomor, $row['Nama_Barang'], $row['Qty'], $row['Nilai_Point'] ]); + } + $xls->add_row_bold([ "", "Grand Total", $tot_point, $tot_tukar ]); + + $xls->add_stamp(1, true); + $xls->download("Data Penukaran Barang ".str_replace("s/d","-",$apre['periode']).".xlsx"); + unset($xls); + } + + public function index() { + $form = new Form($this->app); + $tcab = $form->option_db("_", "CabID", $this->id_cab, true, false, "para_cabang", ["CabID","Nama_Cab"], "Aktif=1 ORDER BY CabID", [0,"SEMUA CABANG"]); + $ttipe = $form->option_db("_", "Point_TipeID", 0, true, false, "inv_point_tipe", ["Point_TipeID","Nama_Tipe"], "TRUE ORDER BY Point_TipeID", [0," "]); + $tgrup_mem = $form->option_db("_", "Grup_MemberID", 0, true, false, "para_member_grup", ["Grup_MemberID","Nama_Grup"], "Aktif=1 ORDER BY Nama_Grup", [0,"SEMUA GRUP"]); + $tfrom = $form->datebox("_", "Tgl_From", tgl_ymd(), true, false); + $tto = $form->datebox("_", "Tgl_To", tgl_ymd(), true, false); + $ajson['html'] = ' +
+ +
'.$tcab.'
+
+
+ +
'.$ttipe.'
+
+
+ +
'.$tgrup_mem.'
+
+
+ +
'.$tfrom.'
+
+
+ +
'.$tto.'
+
+ '; + $this->app->json($ajson); + } + +} diff --git a/app/Controller/Report/NotaController.php b/app/Controller/Report/NotaController.php new file mode 100644 index 0000000..6c0082d --- /dev/null +++ b/app/Controller/Report/NotaController.php @@ -0,0 +1,523 @@ +app = $app; + $this->db = $db; + $this->web_app = (array) $session->get('WEB_APP'); + $this->app_inv = (array) $session->get('APP_INV'); + $this->no_cetak = Param::Get("Nomor_Cetak", ""); + $this->op_cash = Param::Int("Open_Cash", 0); + } + + public function pos(): void { + if (empty($this->no_cetak)) return; + + $ncetak = 1; $is_orig = ($this->op_cash > 0) ? true : false; $apromo = []; + $ainfo = $this->db->fetchRow("SELECT J.*,UCASE(O.Nama) Nama_User,UCASE(LEFT(B.Nama_Kartu,23)) Kode_Kartu2,UCASE(J.Nama_Kartu) Nama_Kartu2,RIGHT(J.No_Kartu,4) No_Kartu2 FROM (SELECT *,DATE_FORMAT(Tgl_Jual,'%d-%m-%Y') Tgl_Jual2,DATE_FORMAT(DateStamp,'%H:%i:%s') Jam_Jual,(Total_Bayar-Total_Kartu) Total_Tunai,(Total_Bayar-Total_Jual+Total_Diskon+Total_Potong) Total_Sisa FROM inv_jual WHERE No_Jual=?) J LEFT JOIN app_operator O ON (J.UserID=O.UserID) LEFT JOIN para_rek_pos B ON (J.KartuID=B.KartuID)", [$this->no_cetak]); + if ($ainfo) $ainfo = $ainfo->getData(); + if ($ainfo['KartuID'] > 0) $ncetak++; + + $is_member = !in_array($ainfo['MemberID'], [0,36,103,90,146]); + if ($is_member) { + $_member = $this->db->fetchRow("SELECT IM,Kode_Member,Nama_Member FROM para_member WHERE MemberID=?", [$ainfo['MemberID']]); + $_member = ($_member) ? $_member->getData() : ['IM'=>0, 'Kode_Member'=>"", 'Nama_Member'=>""]; + $ainfo = array_merge($ainfo, $_member); + } + + $aitem = $this->db->fetchAll("SELECT D.*,P.Kode_SKU,P.Nama_Produk_Varian,P.Nama_Lengkap,P.Nama_Satuan FROM (SELECT No_Ref,ID,InvID,SatuanID,VarianID,Harga_Jual,Disk_Rupiah,SUM(-Qty) Qty,SUM(-Qty*Harga_Jual) Jual,SUM(-Qty*Disk_Rupiah) Diskon,Total_Diskon,Promo FROM inv_detail WHERE No_Ref=? AND Qty<>0 GROUP BY InvID,SatuanID,VarianID,Harga_Jual,Promo) D LEFT JOIN vi_inv_produk P ON (D.InvID=P.InvID AND D.SatuanID=P.SatuanID AND D.VarianID=P.VarianID) ORDER BY P.Nama_Produk_Varian", [$this->no_cetak]); + if (count($aitem) === 0) return; + + $pre = new PrintPOS($this->app); + $pre->set_fontsize(2);//thermal + $pre->set_header_logo("logo-nota.png");//thermal + if ($this->app_inv['PRINT_OPENCD'] === 1 && $this->op_cash === 1) $pre->set_opendrawer(); + if ($this->app_inv['PRINT_AUTOCUT'] === 1) $pre->set_cutpaper(); + if (!empty($this->app_inv['TITLE_BEGIN'])) { + $_ahead = explode("[br]", stripslashes($this->app_inv['TITLE_BEGIN'])); + foreach($_ahead as $val) $pre->addc($val); + } + + if ($is_member) { + $pre->add([$ainfo['No_Jual'],14], [$ainfo['Nama_User'],26,"R"]); + $pre->add([$ainfo['Kode_Member'] ?? "00000000",28], [$ainfo['Tgl_Jual2'],12,"R"]); + $pre->add([$ainfo['Nama_Member'],30], [$ainfo['Jam_Jual'],10,"R"]); + } else { + $pre->add([$ainfo['No_Jual'],20], [$ainfo['Tgl_Jual2'],20,"R"]); + $pre->add([$ainfo['Nama_User'],20], [$ainfo['Jam_Jual'],20,"R"]); + } + $pre->add_line(); + + $items = 0; $qty = 0; + foreach ($aitem as $item) { + if ($item['Promo'] > 1) { + $apromo[] = rupiah($item['Qty'])." ".$item['Nama_Satuan']." ".$item['Nama_Produk_Varian']; + continue; + } + if ($is_member) { + $pre->add($item['Nama_Produk_Varian']); + $pre->add([rupiah($item['Qty']),8,"R"], [" ".$item['Nama_Satuan'],7], [" @",2], [rupiah($item['Harga_Jual']),10,"R"], [rupiah($item['Jual']),13,"R"]); + } else { + $pre->add($item['Nama_Lengkap']); + $pre->add([$item['Kode_SKU'],8], [rupiah($item['Qty']),8,"R"], [" @",2], [rupiah($item['Harga_Jual']),9,"R"], [rupiah($item['Jual']),13,"R"]); + } + if ($item['Disk_Rupiah'] > 0) { + if ($item['Promo'] === 1) { + $pre->add([" DISKON PROMO",27], [rupiah($item['Total_Diskon']*-1),13,"R"]); + } else { + if ($is_member) { + $pre->add([rupiah($item['Qty']),8,"R"], [" ".$item['Nama_Satuan'],7], [" @",2], [rupiah($item['Disk_Rupiah']*-1),10,"R"], [" DISC",5], [rupiah($item['Diskon']*-1),8,"R"]); + } else { + $pre->add([" DISC",8], [rupiah($item['Qty']),8,"R"], [" @",2], [rupiah($item['Disk_Rupiah']*-1),9,"R"], [rupiah($item['Diskon']*-1),13,"R"]); + } + } + } + $qty += (int) $item['Qty']; + $items++; + } + + $pre->add_line(); + if ($ainfo['POS'] === 1) { + $pre->add([(string) $items."I/".(string) $qty."Q",14], ["JUMLAH Rp.",13,"R"], [rupiah($ainfo['Total_Jual']-$ainfo['Total_Diskon']),13,"R"]); + if ($ainfo['Total_Tunai'] > 0) $pre->add(["TUNAI Rp.",27,"R"], [rupiah($ainfo['Total_Tunai']),13,"R"]); + if ($ainfo['Total_Kartu'] > 0) $pre->add(["NON TUNAI Rp.",27,"R"], [rupiah($ainfo['Total_Kartu']),13,"R"]); + } else { + $pre->add($pre->set_align((string) $items."I/".(string) $qty."Q",14,"L") . $pre->set_align("JUMLAH",9,"R") ."_BOLD_ Rp.". $pre->set_align(rupiah($ainfo['Total_Jual']-$ainfo['Total_Diskon']),13,"R") ."_NORM_", "X"); + } + if ($ainfo['Total_Potong'] > 0) { + $pre->add([" ",14], ["PROMO Rp.",13,"R"], [rupiah($ainfo['Total_Potong']),13,"R"]); + $apromo[] = "Potongan Promo Rp. ".rupiah($ainfo['Total_Potong']); + } + + if ($ainfo['POS'] === 1) { + if ($ainfo['KartuID'] === 0) { + $pre->add(["KEMBALI Rp.",27,"R"], [rupiah($ainfo['Total_Sisa']),13,"R"]); + } else { + $pre->add_empty(); + $pre->add("* ".$ainfo['Kode_Kartu2']." - ".($ainfo['No_Kartu2'] ?? "XXXX")); + if (!empty($ainfo['Nama_Kartu2'])) $pre->add(" ".$ainfo['Nama_Kartu2']); + } + } + + // CETAK POINT + if ($is_member) { + $apoint = $this->db->fetchAll("SELECT P.*,T.Nilai_Point,IF(S.Sisa_Point-T.Nilai_Point<0,0,S.Sisa_Point) Sisa_Point FROM inv_point_tipe P LEFT JOIN (SELECT * FROM inv_point_tx WHERE No_TX=?) T ON (P.Point_TipeID=T.Point_TipeID) LEFT JOIN (SELECT Point_TipeID,SUM(Nilai_Point) Sisa_Point FROM inv_point_tx WHERE MemberID=? GROUP BY Point_TipeID ORDER BY Point_TipeID) S ON (S.Point_TipeID=P.Point_TipeID) WHERE P.Aktif=1 ORDER BY P.Point_TipeID", [$ainfo['No_Jual'], $ainfo['MemberID']]); + if (count($apoint) > 0) $pre->add_line(); + $is_2line = false; + foreach ($apoint as $point) { + if ($point['Point_TipeID'] === 1 && $ainfo['IM'] === 0) continue; + if ($point['Point_TipeID'] > 1 && $ainfo['IM'] === 0 && empty($ainfo['Kode_Member'])) continue; + if ($is_2line === true) $pre->add_empty(); + if ($point['Nilai_Point'] > 0) $pre->addc(str_replace('[POINT]', rupiah($point['Nilai_Point']), $point['Txt_Struk2'])); + if ($point['Sisa_Point'] > 0) $pre->addc(str_replace('[TOT_POINT]', rupiah($point['Sisa_Point']), $point['Txt_Struk1'])); + $is_2line = true; + } + } + + if (count($apromo) > 0) { + $pre->add_line(); + $pre->add("HADIAH PROMO :"); + foreach ($apromo as $promo) $pre->add($promo); + } + $pre->add_empty(); + if (!empty($this->app_inv['TITLE_END'])) { + $_afoo = explode("[br]", stripslashes($this->app_inv['TITLE_END'])); + foreach($_afoo as $val) $pre->addc($val); + } + if ($is_orig === false) $pre->addc("-- SALINAN / COPY --"); + $pre->add_stamp(1, false); + $pre->add_empty($this->app_inv['PRINT_ROW']); + $pre->show($ncetak); + } + + public function beli(): void { + if (empty($this->no_cetak)) return; + + $ainfo = $this->db->fetchRow("SELECT B.*,DATE_FORMAT(B.Tgl_Beli,'%d-%m-%Y') Tgl_Beli2,DATE_FORMAT(B.Tgl_Faktur,'%d-%m-%Y') Tgl_Faktur2,S.Kode_Sup,S.Nama_Sup,S.Alamat_Sup,B.Total_Beli-B.Total_Diskon Jumlah FROM (SELECT * FROM inv_beli WHERE No_Beli=?) B LEFT JOIN para_supplier S ON (S.SupID=B.SupID)", [$this->no_cetak]); + $ainfo['Alamat_Sup'] = str_replace("\n", "
", $ainfo['Alamat_Sup']); + + $aitem = $this->db->fetchAll("SELECT D.*,P.Nama_Produk_Varian,P.Nama_Satuan FROM (SELECT InvID,SatuanID,VarianID,Harga_Beli,SUM(Total_Diskon) Total_Diskon,SUM(Qty) Qty,SUM(Qty*Harga_Beli) Jumlah FROM inv_detail WHERE No_Ref=? GROUP BY InvID,SatuanID,VarianID,Harga_Beli) D LEFT JOIN vi_inv_produk P ON (P.InvID=D.InvID AND P.SatuanID=D.SatuanID AND P.VarianID=D.VarianID) ORDER BY P.Nama_Produk_Varian", [$this->no_cetak]); + if (count($aitem) === 0) return; + + // menampilkan judul dibagian atas laporan + $kop = '
'.$this->web_app['REG_NAME'].'
FAKTUR PEMBELIAN
'; + $kop .= ''; + $kop .= ''; + $kop .= ''; + $kop .= ''; + $kop .= ''; + $kop .= '
Nomor Transaksi'.$ainfo['No_Beli'].'Tanggal Transaksi'.$ainfo['Tgl_Beli2'].'
Nomor Faktur'.$ainfo['No_Faktur'].'Tanggal Faktur'.$ainfo['Tgl_Faktur2'].'
Nama Supplier'.$ainfo['Nama_Sup'].(($ainfo['Kode_Sup'])?" [".$ainfo['Kode_Sup']."]":"").'
Alamat Supplier'.$ainfo['Alamat_Sup'].'
'; + + $header = ''; + $_line = ''; + $_sline = ''; + + $body = $kop.$header; $no_urut = 1; + foreach ($aitem as $item) { + $body .= sprintf($_line, $no_urut++, $item['Nama_Produk_Varian'], rupiah2($item['Qty']), $item['Nama_Satuan'], rupiah2($item['Harga_Beli']), rupiah2($item['Jumlah'])); + } + $body .= sprintf($_sline, "Sub. Total Rp.", rupiah2($ainfo['Total_Beli'])); + $body .= sprintf($_sline, "Diskon Rp.", rupiah2($ainfo['Total_Diskon'])); + $body .= sprintf($_sline, "Total Rp.", rupiah2($ainfo['Jumlah'])); + + $t_catat = empty($ainfo['Catatan']) ? ' ' : 'Catatan : '.$ainfo['Catatan'].'.'; + $body .= '
No.Nama BarangQtySatuanHarga @Jumlah
%s%s%s%s%s%s
%s%s
'.$t_catat.'
 '.$this->Report_Stamp(1,true).'
'; + + echo '
' . $body . '
'; + } + + public function beli_retur(): void { + if (empty($this->no_cetak)) return; + + $ainfo = $this->db->fetchRow("SELECT B.*,DATE_FORMAT(B.Tgl_Beli,'%d-%m-%Y') Tgl_Beli2,S.Kode_Sup,S.Nama_Sup,S.Alamat_Sup,-B.Total_Beli Jumlah FROM (SELECT * FROM inv_beli WHERE No_Beli=?) B LEFT JOIN para_supplier S ON (S.SupID=B.SupID)", [$this->no_cetak]); + $ainfo['Alamat_Sup'] = str_replace("\n", "
", $ainfo['Alamat_Sup']); + + $aitem = $this->db->fetchAll("SELECT D.*,P.Nama_Produk,P.Nama_Satuan_Varian FROM (SELECT InvID,SatuanID,VarianID,Harga_Beli,SUM(-Qty) Qty,SUM(-Qty*Harga_Beli) Jumlah FROM inv_detail WHERE No_Ref=? GROUP BY InvID,SatuanID,VarianID,Harga_Beli) D LEFT JOIN vi_inv_produk P ON (P.InvID=D.InvID AND P.SatuanID=D.SatuanID AND P.VarianID=D.VarianID) ORDER BY P.Nama_Produk", [$this->no_cetak]); + if (count($aitem) === 0) return; + + // menampilkan judul dibagian atas laporan + $kop = '
'.$this->web_app['REG_NAME'].'
RETUR PEMBELIAN
'; + $kop .= ''; + $kop .= ''; + $kop .= ''; + $kop .= ''; + $kop .= '
Nomor Transaksi'.$ainfo['No_Beli'].'Tanggal Transaksi'.$ainfo['Tgl_Beli2'].'
Nama Supplier'.$ainfo['Nama_Sup'].(($ainfo['Kode_Sup'])?" [".$ainfo['Kode_Sup']."]":"").'
Alamat Supplier'.$ainfo['Alamat_Sup'].'
'; + + $header = ''; + $_line = ''; + $_sline = ''; + + $body = $kop.$header; $no_urut = 1; + foreach ($aitem as $item) { + $body .= sprintf($_line, $no_urut++, $item['Nama_Produk'], rupiah2($item['Qty']), $item['Nama_Satuan'], rupiah2($item['Harga_Beli']), rupiah2($item['Jumlah'])); + } + $body .= sprintf($_sline, "Total (Rp.)", rupiah2($ainfo['Jumlah'])); + + $t_catat = empty($ainfo['No_Faktur']) ? ' ' : 'Catatan : '.$ainfo['No_Faktur'].'.'; + $body .= '
No.Nama BarangQtySatuanHarga @Jumlah
%s%s%s%s%s%s
%s%s
'.$t_catat.'
 '.$this->Report_Stamp(1,true).'
'; + + echo '
' . $body . '
'; + } + + public function jual(): void { + if (empty($this->no_cetak)) return; + + $ainfo = $this->db->fetchRow("SELECT J.*,DATE_FORMAT(J.Tgl_Jual,'%d-%m-%Y') Tgl_Jual2,B.Kode_Member,B.Nama_Member,B.Alamat_Member,J.Total_Jual-J.Total_Diskon Jumlah FROM inv_jual J LEFT JOIN para_member B ON (J.MemberID=B.MemberID) WHERE J.No_Jual=?", [$this->no_cetak]); + $ainfo['Alamat_Member'] = str_replace("\n", "
", $ainfo['Alamat_Member']); + + $aitem = $this->db->fetchAll("SELECT D.*,P.Nama_Produk_Varian,P.Nama_Satuan FROM (SELECT InvID,SatuanID,VarianID,Harga_Jual,Disk_Rupiah,SUM(-Qty) Qty,SUM(-Qty*Harga_Jual)-SUM(Total_Diskon) Jumlah FROM inv_detail WHERE No_Ref=? GROUP BY InvID,SatuanID,VarianID,Harga_Jual,Disk_Rupiah) D LEFT JOIN vi_inv_produk P ON (D.InvID=P.InvID AND D.SatuanID=P.SatuanID AND D.VarianID=P.VarianID) ORDER BY P.Nama_Produk_Varian", [$this->no_cetak]); + if (count($aitem) === 0) return; + + // menampilkan judul dibagian atas laporan + $kop = ''; + $kop .= ''; + $kop .= ''; + $kop .= ''; + $kop .= ''; + $kop .= '
'.$this->web_app['REG_NAME'].'Kepada Yth.,
'.$this->web_app['REG_CITY'].''.$ainfo['Nama_Member'].''.(($ainfo['Kode_Member'])?" [".$ainfo['Kode_Member']."]":"").'
'.$this->web_app['REG_PHONE'].''.$ainfo['Alamat_Member'].'
No. Faktur : '.$ainfo['No_Jual'].'Tanggal : '.$ainfo['Tgl_Jual2'].'
'; + + $header = ''; + $_line = ''; + $_sline = ''; + $_empt = ''; + + $body = $kop.$header; $no_urut = 0; + foreach ($aitem as $item) { + $body .= sprintf($_line, ++$no_urut, $item['Nama_Produk_Varian'], rupiah2($item['Qty']), $item['Nama_Satuan'], rupiah2($item['Harga_Jual']), rupiah2($item['Disk_Rupiah']), rupiah2($item['Jumlah'])); + } + if ($no_urut < 8) { + $body .= str_repeat($_empt, 8-$no_urut); + } + $body .= sprintf($_sline, "Total (Rp.)", rupiah2($ainfo['Total_Diskon']), rupiah2($ainfo['Jumlah'])); + + $body .= '
No.Nama BarangBanyaknyaHarga @Diskon @Jumlah
%s%s%s%s%s%s%s
%s%s%s
 
Penerima,Hormat Kami,
 '.$this->Report_Stamp(1,true).'
'; + + echo '
' . $body . '
'; + } + + function opname(): void { + if (empty($this->no_cetak)) return; + + $ainfo = $this->db->fetchRow("SELECT *,DATE_FORMAT(Tgl_Opname,'%d-%m-%Y') Tgl_Opname2 FROM inv_opname WHERE No_Opname=?", [$this->no_cetak]); + $ainfo['Catatan'] = str_replace("\n", "
", $ainfo['Catatan']); + + $aitem = $this->db->fetchAll("SELECT D.*,P.Nama_Produk_Varian,P.Nama_Satuan FROM (SELECT InvID,SatuanID,VarianID,SUM(Qty) Qty FROM inv_detail WHERE No_Ref=? GROUP BY InvID,SatuanID,VarianID,Harga_Beli) D LEFT JOIN vi_inv_produk P ON (P.InvID=D.InvID AND P.SatuanID=D.SatuanID AND P.VarianID=D.VarianID) ORDER BY P.Nama_Produk_Varian", [$this->no_cetak]); + if (count($aitem) === 0) return; + + // menampilkan judul dibagian atas laporan + $kop = '
'.$this->web_app['REG_NAME'].'
STOK OPNAME
'; + $kop .= ''; + $kop .= ''; + $kop .= ''; + $kop .= '
No. Opname'.$ainfo['No_Opname'].'  
Tanggal Opname'.$ainfo['Tgl_Opname2'].'  
'; + + $header = ''; + $_line = ''; + + $body = $kop.$header; $no_urut = 1; + foreach ($aitem as $item) { + $body .= sprintf($_line, $no_urut++, $item['Nama_Produk_Varian'], rupiah2($item['Qty']), $item['Nama_Satuan']); + } + + $t_catat = empty($ainfo['Catatan']) ? ' ' : 'Catatan : '.$ainfo['Catatan'].'.'; + $body .= '
No.Nama BarangQtySatuan
%s%s%s%s
'.$t_catat.'
 '.$this->Report_Stamp(1,true).'
'; + + echo '
' . $body . '
'; + } + + function mutasi(): void { + if (empty($this->no_cetak)) return; + + $ainfo = $this->db->fetchRow("SELECT M.*,C1.Nama_Cab Cabang1,C2.Nama_Cab Cabang2 FROM (SELECT * FROM inv_mutasi WHERE No_Mutasi=?) M LEFT JOIN para_cabang C1 ON (C1.CabID=M.Dari_CabID) LEFT JOIN para_cabang C2 ON (C2.CabID=M.Ke_CabID)", [$this->no_cetak]); + $ainfo['Catatan'] = str_replace("\n", "
", $ainfo['Catatan']); + + $aitem = $this->db->fetchAll("SELECT D.*,P.Nama_Produk_Varian,P.Nama_Satuan FROM (SELECT InvID,SatuanID,VarianID,Harga_Beli,SUM(Qty) Qty,SUM(Qty*Harga_Beli) Jumlah FROM inv_detail WHERE No_Ref=? AND Qty>0 GROUP BY InvID,SatuanID,VarianID,Harga_Beli) D LEFT JOIN vi_inv_produk P ON (P.InvID=D.InvID AND P.SatuanID=D.SatuanID AND P.VarianID=D.VarianID) ORDER BY P.Nama_Produk_Varian", [$this->no_cetak]); + if (count($aitem) === 0) return; + + // menampilkan judul dibagian atas laporan + $kop = '
'.$this->web_app['REG_NAME'].'
MUTASI STOK
'; + $kop .= ''; + $kop .= ''; + $kop .= ''; + $kop .= '
No. Mutasi'.$ainfo['No_Mutasi'].'Dari Cabang'.$ainfo['Cabang1'].'
Tanggal Mutasi'.tgl_sql2str($ainfo['Tgl_Mutasi']).'Ke Cabang'.$ainfo['Cabang2'].'
'; + + $header = ''; + $_line = ''; + $_sline = ''; + + $body = $kop.$header; $no_urut = 1; + foreach ($aitem as $item) { + $body .= sprintf($_line, $no_urut++, $item['Nama_Produk_Varian'], rupiah2($item['Qty']), $item['Nama_Satuan'], rupiah2($item['Harga_Beli']), rupiah2($item['Jumlah'])); + } + $body .= sprintf($_sline, "Total (Rp.)", rupiah2($ainfo['Total_Mutasi'])); + + $t_catat = empty($ainfo['Catatan']) ? ' ' : 'Catatan : '.$ainfo['Catatan'].'.'; + $body .= '
No.Nama BarangQtySatuanHarga @Jumlah
%s%s%s%s%s%s
%s%s
'.$t_catat.'
 '.$this->Report_Stamp(1,true).'
'; + + echo '
' . $body . '
'; + } + + public function mutasi_pos() { + if (empty($this->no_cetak)) return; + + $ainfo = $this->db->fetchRow("SELECT M.*,C1.Nama_Cab Cabang1,C2.Nama_Cab Cabang2 FROM (SELECT * FROM inv_mutasi WHERE No_Mutasi=?) M LEFT JOIN para_cabang C1 ON (C1.CabID=M.Dari_CabID) LEFT JOIN para_cabang C2 ON (C2.CabID=M.Ke_CabID)", [$this->no_cetak]); + $ainfo['Catatan'] = str_replace("\n", "
", $ainfo['Catatan']); + + $aitem = $this->db->fetchAll("SELECT D.*,P.Nama_Produk_Varian,P.Nama_Satuan FROM (SELECT InvID,SatuanID,VarianID,Harga_Beli,SUM(Qty) Qty,SUM(Qty*Harga_Beli) Jumlah FROM inv_detail WHERE No_Ref=? AND Qty>0 GROUP BY InvID,SatuanID,VarianID,Harga_Beli) D LEFT JOIN vi_inv_produk P ON (P.InvID=D.InvID AND P.SatuanID=D.SatuanID AND P.VarianID=D.VarianID) ORDER BY P.Nama_Produk_Varian", [$this->no_cetak]); + if (count($aitem) === 0) return; + + $pre = new PrintPOS($this->app); + $pre->set_fontsize(2); + $pre->set_header_logo("logo-nota.png"); + if ($this->app_inv['PRINT_AUTOCUT'] === 1) $pre->set_cutpaper(); + $pre->add([$ainfo['No_Mutasi'],20,"L"], [tgl_sql2str($ainfo['Tgl_Mutasi']),20,"R"]); + $pre->add(["Dari Cabang : ",14,"L"], [$ainfo['Cabang1'],36,"L"]); + $pre->add(["Ke Cabang : ",14,"L"], [$ainfo['Cabang2'],36,"L"]); + $pre->add_line("-"); + + foreach ($aitem as $item) { + $pre->add([$item['Nama_Produk_Varian'],29,"L"], [rupiah2($item['Qty']),7,"R"], [$item['Nama_Satuan'],4,"L"]); + } + + $pre->add_line("-"); + $pre->add_stamp(1, false); + $pre->add_empty($this->app_inv['PRINT_ROW']); + $pre->show(); + } + + public function tukarpoint_pos() { + if (empty($this->no_cetak)) return; + + $ainfo = $this->db->fetchRow("SELECT T.*,DATE_FORMAT(T.Tgl_TX,'%d-%m-%Y') Tgl_TX2,DATE_FORMAT(T.DateStamp,'%H:%i:%s') Jam_TX,UCASE(O.Nama) Nama_User,M.Kode_Member,M.Nama_Member,M.IM,B.Nama_Barang,UPPER(P.Nama_Tipe) Nama_Tipe FROM (SELECT * FROM inv_point_tx WHERE No_TX=?) T LEFT JOIN app_operator O ON (T.UserID=O.UserID) LEFT JOIN para_member M ON (M.MemberID=T.MemberID) LEFT JOIN inv_point_barang B ON (T.InvPID=B.InvPID) LEFT JOIN inv_point_tipe P ON (P.Point_TipeID=T.Point_TipeID)", [$this->no_cetak]); + + $pre = new PrintPOS($this->app); + $pre->set_fontsize(2); + $pre->set_header_logo("logo-nota.png"); + if ($this->app_inv['PRINT_AUTOCUT'] === 1) $pre->set_cutpaper(); + if (!empty($this->app_inv['TITLE_BEGIN'])) { + $_ahead = explode("[br]", stripslashes($this->app_inv['TITLE_BEGIN'])); + foreach($_ahead as $val) $pre->addc($val); + } + + $pre->add([$ainfo['No_TX'],20,"L"], [$ainfo['Tgl_TX2'],20,"R"]); + $pre->add([$ainfo['Nama_User'],20,"L"], [$ainfo['Jam_TX'],20,"R"]); + $pre->add_line("-"); + + $pre->add("Kode Member : ".$ainfo['Kode_Member']); + $pre->add("Nama Member : ".$ainfo['Nama_Member']); + $pre->add_empty(); + $pre->addc("PENUKARAN POINT MEMBER ".$ainfo['Nama_Tipe']); + $pre->add(rupiah($ainfo['Qty'])." ".$ainfo['Nama_Barang']." @ ".rupiah($ainfo['Point']*-1)); + $pre->add("Sejumlah ".rupiah($ainfo['Nilai_Point']*-1)." Point"); + + $apoint = $this->db->fetchAll("SELECT P.*,S.Sisa_Point FROM inv_point_tipe P LEFT JOIN (SELECT Point_TipeID,SUM(Nilai_Point) Sisa_Point FROM inv_point_tx WHERE MemberID=? GROUP BY Point_TipeID ORDER BY Point_TipeID) S ON (S.Point_TipeID=P.Point_TipeID) WHERE P.Aktif=1 ORDER BY P.Point_TipeID", [$ainfo['MemberID']]); + if (count($apoint) > 0) $pre->add_line(); + foreach ($apoint as $point) { + if ($point['Point_TipeID'] === 1 && $ainfo['IM'] === 0) continue; + if ($point['Point_TipeID'] > 1 && $ainfo['IM'] === 0 && empty($ainfo['Kode_Member'])) continue; + $pre->addc(str_replace('[TOT_POINT]', rupiah($point['Sisa_Point']), $point['Txt_Struk1'])); + } + + $pre->add_empty(); + if (!empty($this->app_inv['TITLE_END'])) { + $_afoo = explode("[br]", stripslashes($this->app_inv['TITLE_END'])); + foreach($_afoo as $val) $pre->addc($val); + } + $pre->add_stamp(1, false); + $pre->add_empty($this->app_inv['PRINT_ROW']); + $pre->show(); + } + + public function gaji(): void { + $list_id = Param::Get("List_CB_ID", "0"); + if (empty($this->no_cetak) && $list_id === "0") return; + $abulan = bulan_array(); + + $pre = new PrintPOS($this->app); + $pre->set_fontsize(2); + $pre->set_header_logo("logo-nota.png"); + if ($this->app_inv['PRINT_AUTOCUT'] === 1) $pre->set_cutpaper(); + + $_info = $this->db->fetchRow("SELECT DATE_FORMAT(Tgl_Gaji,'%d-%m-%Y') Tgl_Gaji,Tgl_Gaji Tgl_Gaji2,Minggu,Bulan,Tahun,Kode_Jurnal,Catatan Catatan1,UserID FROM gel_gaji WHERE No_Gaji=?", [$this->no_cetak]); + $ainfo = ($_info) ? $_info->getData() : []; + if ($ainfo['UserID']) { + $ainfo['Nama_OP'] = $this->db->fetchField("SELECT CONCAT(LPAD(UserID,3,'0'),'/',Nama) FROM app_operator WHERE UserID=?", [$ainfo['UserID']]) ?? ''; + } + $aitem = $this->db->fetchAll("SELECT D.*,K.Nama_Karya,P.Sisa_Pinjam FROM (SELECT * FROM gel_gaji_detail WHERE No_Gaji=? AND ID IN (?)) D LEFT JOIN para_karyawan K ON (K.KaryaID=D.KaryaID) LEFT JOIN (SELECT KaryaID,SUM(Total_Pinjam-Total_Bayar) Sisa_Pinjam FROM gel_karyawan WHERE Tgl_Trans<=? GROUP BY KaryaID) P ON (P.KaryaID=D.KaryaID)", [$this->no_cetak, explode(',', $list_id), $ainfo['Tgl_Gaji2']]); + if (count($aitem) === 0) return; + + foreach ($aitem as $item) { + $ainfo = array_merge($ainfo, $item); + $acatat = []; + if (!empty($ainfo['Catatan1'])) { + $acatat = str_split(ucfirst(trim($ainfo['Catatan1'])), 40); + } + if (!empty($ainfo['Catatan'])) { + $acatat = array_merge($acatat, str_split(ucfirst(trim($ainfo['Catatan'])), 40)); + } + + $txt_qty_hari = ($ainfo['Qty_Harian'] === round($ainfo['Qty_Harian'])) ? rupiah($ainfo['Qty_Harian']) : rupiah($ainfo['Qty_Harian'],1); + $pre->add(["SLIP GAJI",20,"L"], [$ainfo['Tgl_Gaji'],20,"R"]); + $pre->add("Minggu ".$ainfo['Minggu']." / Bulan ".$abulan[$ainfo['Bulan']]." ".$ainfo['Tahun']); + $pre->add_empty(); + $pre->add("Nama Karyawan : ".$ainfo['Nama_Karya']); + if ($ainfo['Sisa_Pinjam'] !== 0 ) $pre->add([($ainfo['Sisa_Pinjam']>0?"Sisa Pinjaman ":"Saldo Tabungan")." : Rp.",20], [rupiah(abs($ainfo['Sisa_Pinjam'])),20,"R"]); + $pre->add("Hari Kerja : ".$txt_qty_hari." Hari"); + $pre->add(["Gaji Mingguan : Rp.",20], [rupiah($ainfo['Total_Gaji']),20,"R"]); + if ($ainfo['Total_Lembur'] > 0) $pre->add(["Lembur Harian : Rp.",20], [rupiah($ainfo['Total_Lembur']),20,"R"]); + if ($ainfo['Total_BonusM'] > 0) $pre->add(["Bonus Mingguan : Rp.",20], [rupiah($ainfo['Total_BonusM']),20,"R"]); + if ($ainfo['Total_BonusB'] > 0) $pre->add(["Bonus Bulanan : Rp.",20], [rupiah($ainfo['Total_BonusB']),20,"R"]); + if ($ainfo['Total_Potong'] > 0) $pre->add(["Potongan : Rp.",20], [rupiah($ainfo['Total_Potong']*-1),20,"R"]); + $pre->add_line("-"); + $pre->add(["GAJI BERSIH : RP.",20], [rupiah($ainfo['Total_Semua']),20,"R"]); + $pre->add_line("="); + $pre->add([date("YmdHis")."=",15], [$ainfo['Nama_OP'],25,"R"]); + if (count($acatat) > 0) { + $pre->add_empty(1); + $pre->add("INFORMASI :"); + foreach ($acatat as $val) $pre->add($val); + } + $pre->add_empty($this->app_inv['PRINT_ROW']); + $pre->add_sheet(); + } + $pre->show(); + } + + public function ppob(): void { + if (empty($this->no_cetak)) return; + + $ncetak = 1; $is_orig = ($this->op_cash > 0) ? true : false; + $is_token = 0; + $ainfo = $this->db->fetchRow("SELECT P.*,UCASE(O.Nama) Nama_User,UCASE(LEFT(B.Nama_Kartu,23)) Kode_Kartu2,UCASE(P.Nama_Kartu) Nama_Kartu2,RIGHT(P.No_Kartu,4) No_Kartu2,U.Nama_Produk,U.KateID FROM (SELECT *,DATE_FORMAT(Tgl_TX,'%d-%m-%Y') Tgl_TX2,DATE_FORMAT(DateStamp,'%H:%i:%s') Jam_Jual,(Total_Bayar-Harga_Jual) Total_Sisa FROM ppob_tx WHERE No_TX=?) P LEFT JOIN app_operator O ON (P.UserID=O.UserID) LEFT JOIN para_rek_pos B ON (P.KartuID=B.KartuID) LEFT JOIN ppob_produk U ON (P.ProdukID=U.ProdukID)", [$this->no_cetak]); + if ((int) $ainfo['KartuID'] > 0) $ncetak++; + if ((int) $ainfo['KateID'] === 5) $is_token = 1; + + $pre = new PrintPOS($this->app); + $pre->set_fontsize(2); + $pre->set_header_logo("logo-nota.png"); + if ($this->app_inv['PRINT_OPENCD'] === 1 && $this->op_cash === 1) $pre->set_opendrawer(); + if ($this->app_inv['PRINT_AUTOCUT'] === 1) $pre->set_cutpaper(); + if (!empty($this->app_inv['TITLE_BEGIN'])) { + $_ahead = explode("[br]", stripslashes($this->app_inv['TITLE_BEGIN'])); + foreach($_ahead as $val) $pre->addc($val); + } + + $pre->add([$ainfo['No_TX'],20], [$ainfo['Tgl_TX2'],20,"R"]); + $pre->add([$ainfo['Nama_User'],20], [$ainfo['Jam_Jual'],20,"R"]); + $pre->add_line("-"); + $pre->add(["Nomor Tujuan",14], [": ".$ainfo['Tujuan'],27,"L"]); + $pre->add(["Isi Ulang",14], [": ".$ainfo['Nama_Produk'],27,"L"]); + if ($is_token === 1) { + $atoken = PPOBClient::SN_PLN($ainfo['SN']); + $pre->add(["Nama Pelanggan",14], [": ".$atoken['Nama'],27,"L"]); + $pre->add(["Tarif / Daya",14], [": ".$atoken['Daya'],27,"L"]); + $pre->add(["Nilai Token",14], [": ".$atoken['Kwh'],27,"L"]); + $pre->add(["Kode Token",14], [": ",27,"L"]); + $pre->add("_SBOLD_".$atoken['Token']."_NORM_", "X"); + } + $pre->add_line("-"); + $pre->add(["JUMLAH Rp.",25,"R"], [rupiah($ainfo['Harga_Jual']),15,"R"]); + if ((float) $ainfo['Total_Tunai'] > 0) $pre->add(["TUNAI Rp.",25,"R"], [rupiah($ainfo['Total_Tunai']),15,"R"]); + if ((float) $ainfo['Total_Kartu'] > 0) $pre->add(["NON TUNAI Rp.",25,"R"], [rupiah($ainfo['Total_Kartu']),15,"R"]); + + if ((int) $ainfo['KartuID'] === 0) { + $pre->add(["KEMBALI Rp.",25,"R"], [rupiah($ainfo['Total_Sisa']),15,"R"]); + } else { + $pre->add_empty(); + $pre->add("* ".$ainfo['Kode_Kartu2']." - ".($ainfo['No_Kartu2'] ?: "XXXX")); + if (!empty($ainfo['Nama_Kartu2'])) $pre->add(" ".$ainfo['Nama_Kartu2']); + } + + $pre->add_empty(); + if (!empty($this->app_inv['TITLE_END'])) { + $_afoo = explode("[br]", stripslashes($this->app_inv['TITLE_END'])); + foreach($_afoo as $val) $pre->addc($val); + } + if ($is_orig === false) $pre->addc("-- SALINAN / COPY --"); + $pre->add_stamp(1, false); + $pre->add_empty($this->app_inv['PRINT_ROW']); + $pre->show($ncetak); + } + + public function open_cash(): void { + $pre = new PrintPOS($this->app); + if ($this->app_inv['PRINT_OPENCD'] === 1) $pre->set_opendrawer(); + $pre->show(); + } + + private function Report_Stamp(int $ctk_ke=1, bool $bnama=false): string { + return $this->web_app['APP_NAME']."v".$this->web_app['APP_VER'].date("\@ymd.His")."-".$this->app->user()->id(3).(($bnama==true)?"/".strtoupper($this->app->user()->username()):"").(($ctk_ke>0)?"#".isi_nol($ctk_ke,2):""); + } + +} diff --git a/app/Controller/Report/Ppob/JualController.php b/app/Controller/Report/Ppob/JualController.php new file mode 100644 index 0000000..cc6d967 --- /dev/null +++ b/app/Controller/Report/Ppob/JualController.php @@ -0,0 +1,195 @@ +app = $app; + $this->db = $db; + $this->id_cab = Param::Int("CabID", 0); + $this->reg_name = $session->get('WEB_APP')['REG_NAME']; + } + + private function prepare() { + $apre = [ + 'tipe' => Param::Get("Tipe", "R"), // R or D + 'tgl_from' => Param::Get("Tgl_From"), + 'tgl_to' => Param::Get("Tgl_To"), + ]; + + // generate report header + $apre['periode'] = $apre['tgl_from'] . ($apre['tgl_from'] !== $apre['tgl_to'] ? ' s/d '.$apre['tgl_to'] : ''); + + $tsql = ''; $asql = [tgl_sql2str($apre['tgl_from']), tgl_sql2str($apre['tgl_to'])]; + if ($this->id_cab > 0) { + $tsql .= " AND CabID=?"; + array_push($asql, $this->id_cab); + } + + if ($apre['tipe'] === "R") { + $apre['query'] = $this->db->runQuery("SELECT P.Nama_Produk,J.*,O.OpeID,O.N_Ope FROM (SELECT ProdukID,SUM(Harga_Jual) Total,COUNT(*) Qty FROM ppob_tx WHERE (Tgl_TX BETWEEN ? AND ?)".$tsql." GROUP BY ProdukID) J LEFT JOIN ppob_produk P ON (J.ProdukID=P.ProdukID) LEFT JOIN ppob_operator O ON (P.OpeID=O.OpeID) ORDER BY P.Nama_Produk", $asql); + } else { + $apre['query'] = $this->db->runQuery("SELECT J.*,P.Nama_Produk FROM (SELECT * FROM ppob_tx WHERE (Tgl_TX BETWEEN ? AND ?)".$tsql.") J LEFT JOIN ppob_produk P ON (J.ProdukID=P.ProdukID) ORDER BY J.No_TX", $asql); + } + return $apre; + } + + public function print() { + $apre = $this->prepare(); + + $pre = new PrintHTML($this->app); + $pre->add_title([strtoupper($this->reg_name), ($apre['tipe']==="R"?"REKAP":"DETAIL")." PENJUALAN PRABAYAR PPOB", "Periode : ".$apre['periode']]); + + if ($apre['tipe'] === "R") { + $pre->add_field("No.",10,"C"); + $pre->add_field("Nama Produk",50,"L"); + $pre->add_field("Qty",20,"R","rupiah"); + $pre->add_field("Total",20,"R","rupiah"); + + $pre->show_titles(); + $pre->show_headers(); + + $tot_jual = 0; $tot_qty = 0; $nomor = 0; $id_ope = 0; + while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) { + if ($id_ope <> $row['OpeID']) { + $pre->add_span([$row['N_Ope'],4,"L,B"]); + $id_ope = $row['OpeID']; + } + $tot_jual += $row['Total']; + $tot_qty += $row['Qty']; + $pre->add_row([ ++$nomor, $row['Nama_Produk'], $row['Qty'], $row['Total'] ]); + } + $pre->add_span([ ["GRAND TOTAL",2,"R,B"],[$tot_qty,1,"R,B","rupiah"],[$tot_jual,1,"R,B","rupiah"] ]); + + } else { + $pre->add_field("No. Nota",30,"C"); + $pre->add_field("Tgl. Nota",30,"C", "tgl_sql2str"); + $pre->add_field("Nama Produk",50,"L"); + $pre->add_field("No. Tujuan",20,"L"); + $pre->add_field("No. HP",20,"L"); + $pre->add_field("Total",30,"R","rupiah"); + + $pre->show_titles(); + $pre->show_headers(); + + $tot_jual = 0; + while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) { + $tot_jual += $row['Harga_Jual']; + $pre->add_row([ $row['No_TX'], $row['Tgl_TX'], $row['Nama_Produk'], $row['Tujuan'], $row['No_HP'], $row['Harga_Jual'] ]); + } + $pre->add_span([ ["GRAND TOTAL",5,"R,B"],[$tot_jual,1,"R,B","rupiah"] ]); + } + $pre->add_stamp(1, true); + $pre->show(); + } + + public function excel() { + $apre = $this->prepare(); + $xls = new Xlsx($this->app); + $xls->set_meta([ + 'title' => "Data Penjualan Prabayar PPOB", + 'desc' => "Export Data Penjualan Prabayar PPOB Periode : ".$apre['periode'], + ]); + $xls->add_title([ $this->reg_name, "DATA ".($apre['tipe']==="R"?"REKAP":"DETAIL")." PENJUALAN PRABAYAR PPOB", "Periode : ".$apre['periode'] ]); + + if ($apre['tipe'] === "R") { + $xls->add_field("No.", 5, "@integer"); + $xls->add_field("Nama Produk", 25, "@text"); + $xls->add_field("Qty", 15, "#,##0.00"); + $xls->add_field("Total", 15, "#,##0.00"); + $xls->add_sheet("".str_replace("s/d","-",$apre['periode'])); + + $xls->show_titles(); + $xls->show_headers(); + + $tot_jual = 0; $tot_qty = 0; $nomor = 0; $id_ope = 0; + while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) { + if ($id_ope <> $row['OpeID']) { + $xls->add_row_bold([ $row['N_Ope'] ]); + $id_ope = $row['OpeID']; + } + $tot_jual += $row['Total']; + $tot_qty += $row['Qty']; + $xls->add_row([ ++$nomor, $row['Nama_Produk'], $row['Qty'], $row['Total'] ]); + } + $xls->add_row_bold([ "", "GRAND TOTAL", $tot_qty, $tot_jual ]); + + } else { + $xls->add_field("No. Nota", 15, "@"); + $xls->add_field("Tgl. Nota", 12, "@date"); + $xls->add_field("Nama Produk", 20, "@text"); + $xls->add_field("No. Tujuan", 15, "@text"); + $xls->add_field("No. HP", 15, "@text"); + $xls->add_field("Total", 15, "#,##0.00"); + $xls->add_sheet("".str_replace("s/d","-",$apre['periode'])); + + $xls->show_titles(); + $xls->show_headers(); + + $tot_jual = 0; + while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) { + $tot_jual += $row['Harga_Jual']; + $xls->add_row([ $row['No_TX'], $row['Tgl_TX'], $row['Nama_Produk'], $row['Tujuan'], $row['No_HP'], $row['Harga_Jual'] ]); + } + $xls->add_row_bold([ "", "", "GRAND TOTAL", "", "", $tot_jual ]); + } + $xls->add_stamp(1, true); + $xls->download("Data Penjualan Prabayar PPOB ".str_replace("s/d","-",$apre['periode']).".xlsx"); + unset($xls); + } + + public function index() { + $form = new Form($this->app); + $ttipe = $form->radio("_", "Tipe", "R", true, false, ["R"=>"Rekap","D"=>"Detail"]); + $tcab = $form->option_db("_", "CabID", $this->id_cab, true, false, "para_cabang", ["CabID","Nama_Cab"], "Aktif=1 ORDER BY CabID", [0,"SEMUA CABANG"]); + $tfrom = $form->datebox("_", "Tgl_From", tgl_ymd(), true, false); + $tto = $form->datebox("_", "Tgl_To", tgl_ymd(), true, false); + $ajson['html'] = ' +
+ +
'.$ttipe.'
+
+
+ +
'.$tcab.'
+
+
+ +
'.$tfrom.'
+
+
+ +
'.$tto.'
+
'; + $this->app->json($ajson); + } + +} diff --git a/app/Controller/Report/Ppob/MarginController.php b/app/Controller/Report/Ppob/MarginController.php new file mode 100644 index 0000000..bf434f5 --- /dev/null +++ b/app/Controller/Report/Ppob/MarginController.php @@ -0,0 +1,211 @@ +app = $app; + $this->db = $db; + $this->id_cab = Param::Int("CabID", 0); + $this->reg_name = $session->get('WEB_APP')['REG_NAME']; + } + + private function prepare() { + $apre = [ + 'tipe' => Param::Get("Tipe", "R"), // R or D + 'tgl_from' => Param::Get("Tgl_From"), + 'tgl_to' => Param::Get("Tgl_To"), + ]; + + // generate report header + $apre['periode'] = $apre['tgl_from'] . ($apre['tgl_from'] !== $apre['tgl_to'] ? ' s/d '.$apre['tgl_to'] : ''); + + $tsql = ''; $asql = [tgl_sql2str($apre['tgl_from']), tgl_sql2str($apre['tgl_to'])]; + if ($this->id_cab > 0) { + $tsql .= " AND CabID=?"; + array_push($asql, $this->id_cab); + } + + if ($apre['tipe'] === "R") { + $apre['query'] = $this->db->runQuery("SELECT P.Nama_Produk,J.*,(J.Total_Jual-J.Total_Beli) Total_Margin,O.OpeID,O.N_Ope FROM (SELECT ProdukID,SUM(Harga_Beli) Total_Beli,SUM(Harga_Jual) Total_Jual,COUNT(*) Qty FROM ppob_tx WHERE (Tgl_TX BETWEEN ? AND ?)".$tsql." GROUP BY ProdukID) J LEFT JOIN ppob_produk P ON (J.ProdukID=P.ProdukID) LEFT JOIN ppob_operator O ON (P.OpeID=O.OpeID) ORDER BY P.Nama_Produk", $asql); + } else { + $apre['query'] = $this->db->runQuery("SELECT J.*,(J.Harga_Jual-J.Harga_Beli) Harga_Margin,P.Kode,P.Nama_Produk FROM (SELECT * FROM ppob_tx WHERE (Tgl_TX BETWEEN ? AND ?)".$tsql.") J LEFT JOIN ppob_produk P ON (J.ProdukID=P.ProdukID) ORDER BY J.No_TX", $asql); + } + return $apre; + } + + public function print() { + $apre = $this->prepare(); + + $pre = new PrintHTML($this->app); + $pre->add_title([strtoupper($this->reg_name), ($apre['tipe']==="R"?"REKAP":"DETAIL")." MARGIN PENJUALAN PRABAYAR PPOB", "Periode : ".$apre['periode']]); + + if ($apre['tipe'] === "R") { + $pre->add_field("No.",10,"C"); + $pre->add_field("Nama Produk",50,"L"); + $pre->add_field("Qty",20,"R","rupiah"); + $pre->add_field("Total HPP",20,"R","rupiah"); + $pre->add_field("Total Jual",20,"R","rupiah"); + $pre->add_field("Total Margin",20,"R","rupiah"); + + $pre->show_titles(); + $pre->show_headers(); + + $tot_hpp = 0; $tot_jual = 0; $tot_margin = 0; $tot_qty = 0; $nomor = 0; $id_ope = 0; + while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) { + if ($id_ope <> $row['OpeID']) { + $pre->add_span([$row['N_Ope'],6,"L,B"]); + $id_ope = $row['OpeID']; + } + $tot_hpp += $row['Total_Beli']; + $tot_jual += $row['Total_Jual']; + $tot_margin += $row['Total_Margin']; + $tot_qty += $row['Qty']; + $pre->add_row([ ++$nomor, $row['Nama_Produk'], $row['Qty'], $row['Total_Beli'], $row['Total_Jual'], $row['Total_Margin'] ]); + } + $pre->add_span([ ["GRAND TOTAL",2,"R,B"],[$tot_qty,1,"R,B","rupiah"],[$tot_hpp,1,"R,B","rupiah"],[$tot_jual,1,"R,B","rupiah"],[$tot_margin,1,"R,B","rupiah"] ]); + + } else { + $pre->add_field("No. Nota",30,"C"); + $pre->add_field("Tgl. Nota",30,"C", "tgl_sql2str"); + $pre->add_field("Kode",10,"L"); + $pre->add_field("Nama Produk",50,"L"); + $pre->add_field("No. Tujuan",20,"L"); + $pre->add_field("Total HPP",30,"R","rupiah"); + $pre->add_field("Total Jual",30,"R","rupiah"); + $pre->add_field("Total Margin",30,"R","rupiah"); + + $pre->show_titles(); + $pre->show_headers(); + + $tot_hpp = 0; $tot_jual = 0; $tot_margin = 0; + while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) { + $tot_hpp += $row['Harga_Beli']; + $tot_jual += $row['Harga_Jual']; + $tot_margin += $row['Harga_Margin']; + $pre->add_row([ $row['No_TX'], $row['Tgl_TX'], $row['Kode'], $row['Nama_Produk'], $row['Tujuan'], $row['Harga_Beli'], $row['Harga_Jual'], $row['Harga_Margin'] ]); + } + $pre->add_span([ ["GRAND TOTAL",5,"R,B"],[$tot_hpp,1,"R,B","rupiah"],[$tot_jual,1,"R,B","rupiah"],[$tot_margin,1,"R,B","rupiah"] ]); + } + $pre->add_stamp(1, true); + $pre->show(); + } + + public function excel() { + $apre = $this->prepare(); + $xls = new Xlsx($this->app); + $xls->set_meta([ + 'title' => "Data Margin Penjualan Prabayar PPOB", + 'desc' => "Export Data Margin Penjualan Prabayar PPOB Periode : ".$apre['periode'], + ]); + $xls->add_title([ $this->reg_name, "DATA ".($apre['tipe']==="R"?"REKAP":"DETAIL")." MARGIN PENJUALAN PRABAYAR PPOB", "Periode : ".$apre['periode'] ]); + + if ($apre['tipe'] === "R") { + $xls->add_field("No.", 5, "@integer"); + $xls->add_field("Nama Produk", 25, "@text"); + $xls->add_field("Qty", 15, "#,##0.00"); + $xls->add_field("Total HPP", 15, "#,##0.00"); + $xls->add_field("Total Jual", 15, "#,##0.00"); + $xls->add_field("Total Margin", 15, "#,##0.00"); + $xls->add_sheet("".str_replace("s/d","-",$apre['periode'])); + + $xls->show_titles(); + $xls->show_headers(); + + $tot_hpp = 0; $tot_jual = 0; $tot_margin = 0; $tot_qty = 0; $nomor = 0; $id_ope = 0; + while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) { + if ($id_ope <> $row['OpeID']) { + $xls->add_row_bold([ $row['N_Ope'] ]); + $id_ope = $row['OpeID']; + } + $tot_hpp += $row['Harga_Beli']; + $tot_jual += $row['Harga_Jual']; + $tot_margin += $row['Harga_Margin']; + $tot_qty += $row['Qty']; + $xls->add_row([ ++$nomor, $row['Nama_Produk'], $row['Qty'], $row['Harga_Beli'], $row['Harga_Jual'], $row['Harga_Margin'] ]); + } + $xls->add_row_bold([ "", "GRAND TOTAL", $tot_qty, $tot_hpp, $tot_jual, $tot_margin ]); + + } else { + $xls->add_field("No. Nota", 15, "@"); + $xls->add_field("Tgl. Nota", 12, "@date"); + $xls->add_field("Kode", 8, "@text"); + $xls->add_field("Nama Produk", 20, "@text"); + $xls->add_field("No. Tujuan", 15, "@text"); + $xls->add_field("Total HPP", 15, "#,##0.00"); + $xls->add_field("Total Jual", 15, "#,##0.00"); + $xls->add_field("Total Margin", 15, "#,##0.00"); + $xls->add_sheet("".str_replace("s/d","-",$apre['periode'])); + + $xls->show_titles(); + $xls->show_headers(); + + $tot_hpp = 0; $tot_jual = 0; $tot_margin = 0; + while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) { + $tot_hpp += $row['Harga_Beli']; + $tot_jual += $row['Harga_Jual']; + $tot_margin += $row['Harga_Margin']; + $xls->add_row([ $row['No_TX'], $row['Tgl_TX'], $row['Kode'], $row['Nama_Produk'], $row['Tujuan'], $row['Harga_Beli'], $row['Harga_Jual'], $row['Harga_Margin'] ]); + } + $xls->add_row_bold([ "", "", "", "GRAND TOTAL", "", $tot_hpp, $tot_jual, $tot_margin ]); + } + $xls->add_stamp(1, true); + $xls->download("Data Margin Penjualan Prabayar PPOB ".str_replace("s/d","-",$apre['periode']).".xlsx"); + unset($xls); + } + + public function index() { + $form = new Form($this->app); + $ttipe = $form->radio("_", "Tipe", "R", true, false, ["R"=>"Rekap","D"=>"Detail"]); + $tcab = $form->option_db("_", "CabID", $this->id_cab, true, false, "para_cabang", ["CabID","Nama_Cab"], "Aktif=1 ORDER BY CabID", [0,"SEMUA CABANG"]); + $tfrom = $form->datebox("_", "Tgl_From", tgl_ymd(), true, false); + $tto = $form->datebox("_", "Tgl_To", tgl_ymd(), true, false); + $ajson['html'] = ' +
+ +
'.$ttipe.'
+
+
+ +
'.$tcab.'
+
+
+ +
'.$tfrom.'
+
+
+ +
'.$tto.'
+
'; + $this->app->json($ajson); + } + +} diff --git a/app/Controller/Report/Rekap/MarginController.php b/app/Controller/Report/Rekap/MarginController.php new file mode 100644 index 0000000..706ea7f --- /dev/null +++ b/app/Controller/Report/Rekap/MarginController.php @@ -0,0 +1,190 @@ +app = $app; + $this->db = $db; + $this->id_cab = Param::Int("CabID", 0); + $this->reg_name = $session->get('WEB_APP')['REG_NAME']; + } + + private function prepare() { + $apre = [ + 'tgl_from' => Param::Get("Tgl_From"), + 'tgl_to' => Param::Get("Tgl_To"), + ]; + + // generate report header + $apre['periode'] = $apre['tgl_from'] . ($apre['tgl_from'] !== $apre['tgl_to'] ? ' s/d '.$apre['tgl_to'] : ''); + + $tsql = ''; $asql = []; + if ($this->id_cab > 0) { + $tsql .= " AND CabID=?"; + array_push($asql, $this->id_cab); + } + + $this->db->delete("rep_rekap_margin", "UserID=?", [$this->app->user()->id()]); + // insert jual dan terima pos + $this->db->runQuery("INSERT INTO rep_rekap_margin (Tanggal,Jual,Masuk,UserID) SELECT Tgl_Jual,SUM(Total_Jual-Total_Diskon) Jual, SUM(IF(POS=1,Total_Jual-Total_Diskon,0)) Masuk,? FROM inv_jual WHERE (Tgl_Jual BETWEEN ? AND ?)".$tsql." GROUP BY Tgl_Jual", array_merge([$this->app->user()->id(), tgl_sql2str($apre['tgl_from']), tgl_sql2str($apre['tgl_to'])], $asql)); + // insert tgl sesuai range + $dtgl = $apre['tgl_from']; + while ($dtgl <= $apre['tgl_to']) { + $this->db->runQuery("INSERT IGNORE INTO rep_rekap_margin (Tanggal,UserID) VALUES (?,?)", [tgl_sql2str($dtgl), $this->app->user()->id()]); + $dtgl = tgl_operasi($dtgl, 1); + } + // insert beli + $arow = $this->db->fetchAll("SELECT Tgl_Beli, SUM(Real_Beli) Beli FROM inv_beli WHERE (Tgl_Beli BETWEEN ? AND ?)".$tsql." GROUP BY Tgl_Beli", array_merge([tgl_sql2str($apre['tgl_from']), tgl_sql2str($apre['tgl_to'])], $asql)); + foreach ($arow as $row) { + $this->db->runQuery("UPDATE rep_rekap_margin SET Beli=? WHERE Tanggal=? AND UserID=?", [$row['Beli'], $row['Tgl_Beli'], $this->app->user()->id()]); + } + // insert keluar / lunas beli + $arow = $this->db->fetchAll("SELECT Tgl_Bayar, SUM(Total_Bayar-Total_Potong) Keluar FROM inv_beli_lunas WHERE (Tgl_Bayar BETWEEN ? AND ?)".$tsql." GROUP BY Tgl_Bayar", array_merge([tgl_sql2str($apre['tgl_from']), tgl_sql2str($apre['tgl_to'])], $asql)); + foreach ($arow as $row) { + $this->db->runQuery("UPDATE rep_rekap_margin SET Keluar=? WHERE Tanggal=? AND UserID=?", [$row['Keluar'], $row['Tgl_Bayar'], $this->app->user()->id()]); + } + // insert modal + $arow = $this->db->fetchAll("SELECT Tgl_Ref, SUM(-Qty*Harga_Beli) Modal FROM inv_detail WHERE (Tgl_Ref BETWEEN ? AND ?) AND NotaID IN (5,6)".$tsql." GROUP BY Tgl_Ref", array_merge([tgl_sql2str($apre['tgl_from']), tgl_sql2str($apre['tgl_to'])], $asql)); + foreach ($arow as $row) { + $this->db->runQuery("UPDATE rep_rekap_margin SET Modal=? WHERE Tanggal=? AND UserID=?", [$row['Modal'], $row['Tgl_Ref'], $this->app->user()->id()]); + } + // update margin dan persen + $this->db->runQuery("UPDATE rep_rekap_margin SET Margin=Jual-Modal,Persen=(Margin/Jual)*100 WHERE UserID=?", [$this->app->user()->id()]); + $apre['query'] = $this->db->runQuery("SELECT * FROM rep_rekap_margin WHERE UserID=? ORDER BY Tanggal ASC", [$this->app->user()->id()]); + return $apre; + } + + public function print() { + $apre = $this->prepare(); + + $pre = new PrintHTML($this->app); + $pre->add_title([strtoupper($this->reg_name), "REKAP MARGIN HARIAN", "Periode : ".$apre['periode']]); + + $pre->add_field("Hari",10,"C"); + $pre->add_field("Tanggal",20,"C","sqltgl"); + $pre->add_field("Penjualan",20,"R","rupiah"); + $pre->add_field("Pembelian",20,"R","rupiah"); + $pre->add_field("Modal",20,"R","rupiah"); + $pre->add_field("Penerimaan",20,"R","rupiah"); + $pre->add_field("Pengeluaran",20,"R","rupiah"); + $pre->add_field("Margin",20,"R","rupiah"); + $pre->add_field("%",10,"R","rupiah2"); + + $pre->show_titles(); + $pre->show_headers(); + + $item = 0; $tot_j = 0; $tot_b = 0; $tot_p = 0; $tot_m = 0; $tot_k = 0; $tot_mar = 0; $tot_psn = 0; + while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) { + $item++; + $tot_j += $row['Jual']; + $tot_b += $row['Beli']; + $tot_m += $row['Masuk']; + $tot_k += $row['Keluar']; + $tot_p += $row['Modal']; + $tot_mar += $row['Margin']; + $pre->add_row([ tgl_hari(tgl_sql2str($row['Tanggal'])), $row['Tanggal'], $row['Jual'], $row['Beli'], $row['Modal'], $row['Masuk'], $row['Keluar'], $row['Margin'], $row['Persen'] ]); + } + if ($item > 0 && $tot_j > 0) { + $pre->add_span([ ["JUMLAH",2,"R,B"],[$tot_j,1,"R,B","rupiah"],[$tot_b,1,"R,B","rupiah"],[$tot_p,1,"R,B","rupiah"],[$tot_m,1,"R,B","rupiah"],[$tot_k,1,"R,B","rupiah"],[$tot_mar,1,"R,B","rupiah"],[($tot_j===0?0:($tot_mar/$tot_j)*100),1,"R,B","rupiah2"] ]); + $pre->add_span([ ["RATA-RATA",2,"R,B"],[$tot_j/$item,1,"R,B","rupiah"],[$tot_b/$item,1,"R,B","rupiah"],[$tot_p/$item,1,"R,B","rupiah"],[$tot_m/$item,1,"R,B","rupiah"],[$tot_k/$item,1,"R,B","rupiah"],[$tot_mar/$item,1,"R,B","rupiah"],[($tot_mar/$tot_j)*100/$item,1,"R,B","rupiah2"] ]); + } + + $pre->add_stamp(1, true); + $pre->show(); + } + + public function excel() { + $apre = $this->prepare(); + $xls = new Xlsx($this->app); + $xls->set_meta([ + 'title' => "Data Rekap Margin Harian", + 'desc' => "Export Data Rekap Margin Harian" + ]); + $xls->add_title([ $this->reg_name, "DATA REKAP MARGIN HARIAN", "Periode : ".$apre['periode'] ]); + + $xls->add_field("Hari", 15, "@"); + $xls->add_field("Tanggal", 12, "@date"); + $xls->add_field("Penjualan", 15, "#,##0.00"); + $xls->add_field("Pembelian", 15, "#,##0.00"); + $xls->add_field("Modal", 15, "#,##0.00"); + $xls->add_field("Penerimaan", 15, "#,##0.00"); + $xls->add_field("Pengeluaran", 15, "#,##0.00"); + $xls->add_field("Margin", 15, "#,##0.00"); + $xls->add_field("%", 15, "#,##0.00"); + $xls->add_sheet("".str_replace("s/d","-",$apre['periode'])); + + $xls->show_titles(); + $xls->show_headers(); + + $item = 0; $tot_j = 0; $tot_b = 0; $tot_p = 0; $tot_m = 0; $tot_k = 0; $tot_mar = 0; $tot_psn = 0; + while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) { + $item++; + $tot_j += $row['Jual']; + $tot_b += $row['Beli']; + $tot_m += $row['Masuk']; + $tot_k += $row['Keluar']; + $tot_p += $row['Modal']; + $tot_mar += $row['Margin']; + $xls->add_row([ tgl_hari(tgl_sql2str($row['Tanggal'])), $row['Tanggal'], $row['Jual'], $row['Beli'], $row['Modal'], $row['Masuk'], $row['Keluar'], $row['Margin'], $row['Persen'] ]); + } + if ($item > 0 && $tot_j > 0) { + $xls->add_row_bold([ "", "JUMLAH", $tot_j, $tot_b, $tot_p, $tot_m, $tot_k, $tot_mar, ($tot_j===0?0:($tot_mar/$tot_j)*100) ]); + $xls->add_row_bold([ "", "RATA-RATA", $tot_j/$item, $tot_b/$item, $tot_p/$item, $tot_m/$item, $tot_k/$item, $tot_mar/$item, ($tot_mar/$tot_j)*100/$item ]); + } + + $xls->add_stamp(1, true); + $xls->download("Data Rekap Margin Harian ".str_replace("s/d","-",$apre['periode']).".xlsx"); + unset($xls); + } + + public function index() { + $form = new Form($this->app); + $tcab = $form->option_db("_", "CabID", $this->id_cab, true, false, "para_cabang", ["CabID","Nama_Cab"], "Aktif=1 ORDER BY CabID", [0,"SEMUA CABANG"]); + $tfrom = $form->datebox("_", "Tgl_From", tgl_ymd(), true, false); + $tto = $form->datebox("_", "Tgl_To", tgl_ymd(), true, false); + $ajson['html'] = ' +
+ +
'.$tcab.'
+
+
+ +
'.$tfrom.'
+
+
+ +
'.$tto.'
+
'; + $this->app->json($ajson); + } + +} diff --git a/app/Controller/Report/Rekap/ModalController.php b/app/Controller/Report/Rekap/ModalController.php new file mode 100644 index 0000000..ec8af79 --- /dev/null +++ b/app/Controller/Report/Rekap/ModalController.php @@ -0,0 +1,143 @@ +app = $app; + $this->db = $db; + $this->id_cab = Param::Int("CabID", 0); + $this->reg_name = $session->get('WEB_APP')['REG_NAME']; + } + + private function prepare() { + $apre = [ + 'tgl_from' => Param::Get("Tgl_From"), + 'tgl_to' => Param::Get("Tgl_To"), + ]; + + // generate report header + $apre['periode'] = $apre['tgl_from'] . ($apre['tgl_from'] !== $apre['tgl_to'] ? ' s/d '.$apre['tgl_to'] : ''); + + $tsql = ''; $asql = []; + if ($this->id_cab > 0) { + $tsql .= " AND CabID=?"; + array_push($asql, $this->id_cab); + } + + $this->db->delete("rep_rekap_modal", "UserID=?", [$this->app->user()->id()]); + $dtgl = $apre['tgl_from']; + while ($dtgl <= $apre['tgl_to']) { + $stok = $this->db->fetchField("SELECT SUM(D.Stok*P.Harga_Pokok) Stok FROM (SELECT * FROM inv_detail WHERE Tgl_Ref<=?".$tsql.") D LEFT JOIN inv_produk P ON (P.InvID=D.InvID)", array_merge([tgl_sql2str($dtgl)], $asql)) ?? 0; + $piutang = $this->db->fetchField("SELECT SUM(Total_Jual-Total_Diskon-Total_Bayar-Total_Potong) Piutang FROM inv_jual WHERE Tgl_Jual<=? AND Tgl_Lunas>?".$tsql, array_merge([tgl_sql2str($dtgl), tgl_sql2str($dtgl)], $asql)) ?? 0; + $hutang = $this->db->fetchField("SELECT SUM(Real_Beli) Hutang FROM inv_beli WHERE Tgl_Beli<=? AND (Lunas=0 OR (Lunas=1 AND Tgl_Lunas>?))".$tsql, array_merge([tgl_sql2str($dtgl), tgl_sql2str($dtgl)], $asql)) ?? 0; + $this->db->runQuery("INSERT IGNORE INTO rep_rekap_modal (Tanggal,Stok,Piutang,Hutang,Jumlah,UserID) VALUES (?,?,?,?,?,?)", [tgl_sql2str($dtgl), $stok, $piutang, $hutang, $stok + $piutang - $hutang, $this->app->user()->id()]); + $dtgl = tgl_operasi($dtgl, 1); + } + $apre['query'] = $this->db->runQuery("SELECT * FROM rep_rekap_modal WHERE UserID=? ORDER BY Tanggal ASC", [$this->app->user()->id()]); + return $apre; + } + + public function print() { + $apre = $this->prepare(); + + $pre = new PrintHTML($this->app); + $pre->add_title([strtoupper($this->reg_name), "REKAP MODAL HARIAN", "Periode : ".$apre['periode']]); + + $pre->add_field("Hari",10,"C"); + $pre->add_field("Tanggal",20,"C","sqltgl"); + $pre->add_field("Stok Barang",20,"R","rupiah"); + $pre->add_field("Piutang",20,"R","rupiah"); + $pre->add_field("Hutang",20,"R","rupiah"); + $pre->add_field("Jumlah",20,"R","rupiah"); + + $pre->show_titles(); + $pre->show_headers(); + + while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) { + $pre->add_row([ tgl_hari(tgl_sql2str($row['Tanggal'])), $row['Tanggal'], $row['Stok'], $row['Piutang'], $row['Hutang'], $row['Jumlah'] ]); + } + + $pre->add_stamp(1, true); + $pre->show(); + } + + public function excel() { + $apre = $this->prepare(); + $xls = new Xlsx($this->app); + $xls->set_meta([ + 'title' => "Data Rekap Modal Harian", + 'desc' => "Export Data Rekap Modal Harian" + ]); + $xls->add_title([ $this->reg_name, "DATA REKAP MODAL HARIAN", "Periode : ".$apre['periode'] ]); + + $xls->add_field("Hari", 15, "@"); + $xls->add_field("Tanggal", 12, "@date"); + $xls->add_field("Stok Barang", 15, "#,##0.00"); + $xls->add_field("Piutang", 15, "#,##0.00"); + $xls->add_field("Hutang", 15, "#,##0.00"); + $xls->add_field("Jumlah", 15, "#,##0.00"); + $xls->add_sheet("".str_replace("s/d","-",$apre['periode'])); + + $xls->show_titles(); + $xls->show_headers(); + + while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) { + $xls->add_row([ tgl_hari(tgl_sql2str($row['Tanggal'])), $row['Tanggal'], $row['Stok'], $row['Piutang'], $row['Hutang'], $row['Jumlah'] ]); + } + + $xls->add_stamp(1, true); + $xls->download("Data Rekap Modal Harian ".str_replace("s/d","-",$apre['periode']).".xlsx"); + unset($xls); + } + + public function index() { + $form = new Form($this->app); + $tcab = $form->option_db("_", "CabID", $this->id_cab, true, false, "para_cabang", ["CabID","Nama_Cab"], "Aktif=1 ORDER BY CabID", [0,"SEMUA CABANG"]); + $tfrom = $form->datebox("_", "Tgl_From", tgl_ymd(), true, false); + $tto = $form->datebox("_", "Tgl_To", tgl_ymd(), true, false); + $ajson['html'] = ' +
+ +
'.$tcab.'
+
+
+ +
'.$tfrom.'
+
+
+ +
'.$tto.'
+
'; + $this->app->json($ajson); + } + +} diff --git a/app/Controller/Report/Stok/AkhirController.php b/app/Controller/Report/Stok/AkhirController.php new file mode 100644 index 0000000..2b4ac7b --- /dev/null +++ b/app/Controller/Report/Stok/AkhirController.php @@ -0,0 +1,229 @@ +app = $app; + $this->db = $db; + $this->app_inv = (array) $session->get('APP_INV'); + $this->id_cab = Param::Int("CabID", 0); + $this->reg_name = $session->get('WEB_APP')['REG_NAME']; + } + + private function prepare() { + $apre = [ + 'id_sup' => Param::Int("SupID", 0), + 'id_grup_inv' => Param::Int("Grup_InvID", 0), + 'ppn' => Param::Int("PPN", 9), + 'tgl' => Param::Get("Tanggal"), + 'urut' => Param::Get("Urut", "B"), + 'min' => Param::Get("Min_Stok", "N"), + 'qty' => Param::Int("Min_Qty", 0), + ]; + + $apre['nama_sup'] = ($apre['id_sup'] > 0) ? ($this->db->fetchField("SELECT CONCAT(Nama_Sup,' (',Kode_Sup,')') Nama FROM para_supplier WHERE SupID=?", [$apre['id_sup']]) ?? '') : ''; + $apre['nama_grup_inv'] = ($apre['id_grup_inv'] > 0 && $apre['id_sup']===0) ? ($this->db->fetchField("SELECT Nama_Grup FROM inv_produk_grup WHERE Grup_InvID=?", [$apre['id_grup_inv']]) ?? '') : ''; + + // generate report header + $apre['periode'] = $apre['tgl']; + + $tsql1 = ''; $tsql2 = ''; + $asql1 = []; + $asql2 = []; + + if ($this->id_cab > 0) { + $tsql1 = " WHERE CabID=?"; + array_push($asql1, $this->id_cab); + } + if ($apre['id_sup'] > 0) { + $tsql2 .= " AND D.InvID IN (SELECT InvID FROM inv_produk_sup WHERE SupID=?)"; + array_push($asql2, $apre['id_sup']); + } + if ($apre['id_grup_inv'] > 0) { + $tsql2 .= " AND P.Grup_InvID=?"; + array_push($asql2, $apre['id_grup_inv']); + } + if ($apre['ppn'] !== 9) { + $tsql2 .= " AND P.PPN=?"; + array_push($asql2, $apre['ppn']); + } + if ($apre['min'] !== 'N') { + $tsql2 .= " AND D.Stok<=?"; + array_push($asql2, $apre['qty']); + } + $torder = ($apre['urut'] === "B") ? "P.Nama_Produk" : "Total"; + + $apre['query'] = $this->db->runQuery("SELECT P.Nama_Produk,P.Satuan_Normal,P.Satuan_Stok,D.Stok Jumlah,P.Harga_Pokok,D.Stok*P.Harga_Pokok Total,P.Qty Kali FROM (SELECT InvID,SUM(Stok) Stok FROM inv_stok".$tsql1." GROUP BY InvID) D LEFT JOIN vi_inv_produk2 P ON (P.InvID=D.InvID) WHERE (NOT (D.Stok=0 AND P.Aktif=0)) AND (P.InvID IS NOT NULL)".$tsql2." ORDER BY ".$torder, array_merge($asql1, $asql2)); + return $apre; + } + + public function pos() { + $apre = $this->prepare(); + + $pre = new PrintPOS($this->app); + $pre->set_fontsize(2);//thermal + $pre->set_header_logo("logo-nota.png");//thermal + if ($this->app_inv['PRINT_AUTOCUT'] === 1) $pre->set_cutpaper(); + $pre->add_empty(); + + $pre->addc("STOK AKHIR BARANG"); + $pre->addc("Periode : ".$apre['periode']); + $pre->add_line("-"); + while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) { + $stok = Invesa::Format_Stok(($row['Jumlah'] ?? 0), ($row['Kali'] ?? 1), ($row['Satuan_Normal'] ?? ''), ($row['Satuan_Stok'] ?? '')); + $pre->add([$row['Nama_Produk'],39-strlen($stok),"L"], [" ",1,"L"], [$stok,strlen($stok),"L"]); + } + $pre->add_line("-"); + $pre->add_stamp(1, false); + $pre->add_empty($this->app_inv['PRINT_ROW']); + $pre->show(); + } + + public function print() { + $apre = $this->prepare(); + + $pre = new PrintHTML($this->app); + $pre->add_title([strtoupper($this->reg_name), "STOK AKHIR BARANG", "Periode : ".$apre['periode']]); + + $pre->add_field("No.",10,"C"); + $pre->add_field("Nama Barang",50,"L"); + $pre->add_field("Stok",20,"R"); + if ($this->app->user()->is_level(2)) { + $pre->add_field("Harga",20,"R","rupiah"); + $pre->add_field("Total",20,"R","rupiah"); + } + + if ($apre['id_sup'] > 0) $pre->add_sub_title("Nama Supplier : ".$apre['nama_sup']); + if ($apre['id_grup_inv'] > 0) $pre->add_sub_title("Grup Barang : ".$apre['nama_grup_inv']); + + $pre->show_titles(); + $pre->show_headers(); + + $nomor = 0; $tot_stok = 0; + while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) { + $tot_stok += $row['Total']; + $_row = [ ++$nomor, $row['Nama_Produk'], Invesa::Format_Stok(($row['Jumlah'] ?? 0), ($row['Kali'] ?? 1), ($row['Satuan_Normal'] ?? ''), ($row['Satuan_Stok'] ?? '')) ]; + if ($this->app->user()->is_level(2)) array_push($_row, $row['Harga_Pokok'], $row['Total']); + $pre->add_row($_row); + } + if ($this->app->user()->is_level(2)) $pre->add_span([ ["GRAND TOTAL",4,"R,B"], [$tot_stok,1,"R,B","rupiah"] ]); + + $pre->add_stamp(1, true); + $pre->show(); + } + + public function excel() { + $apre = $this->prepare(); + $xls = new Xlsx($this->app); + $xls->set_meta([ + 'title' => "Data Stok Akhir Barang", + 'desc' => "Export Data Stok Akhir Barang" + ]); + $xls->add_title([ $this->reg_name, "STOK AKHIR BARANG", "Periode : ".$apre['periode'] ]); + + $xls->add_field("No.", 10, "@integer"); + $xls->add_field("Nama Barang", 35, "@text"); + $xls->add_field("Stok", 15, "@"); + if ($this->app->user()->is_level(2)) { + $xls->add_field("Harga", 15, "#,##0.00"); + $xls->add_field("Total", 15, "#,##0.00"); + } + $xls->add_sheet("".str_replace("s/d","-",$apre['periode'])); + + if ($apre['id_sup'] > 0) $xls->add_sub_title("Nama Supplier : ".$apre['nama_sup']); + if ($apre['id_grup_inv'] > 0) $xls->add_sub_title("Grup Barang : ".$apre['nama_grup_inv']); + + $xls->show_titles(); + $xls->show_headers(); + + $nomor = 0; $tot_stok = 0; + while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) { + $tot_stok += $row['Total']; + $_row = [ ++$nomor, $row['Nama_Produk'], Invesa::Format_Stok(($row['Jumlah'] ?? 0), ($row['Kali'] ?? 1), ($row['Satuan_Normal'] ?? ''), ($row['Satuan_Stok'] ?? '')) ]; + if ($this->app->user()->is_level(2)) array_push($_row, $row['Harga_Pokok'], $row['Total']); + $xls->add_row($_row); + } + if ($this->app->user()->is_level(2)) $xls->add_row_bold([ "", "GRAND TOTAL", "", "", $tot_stok ]); + + $xls->add_stamp(1, true); + $xls->download("Data Stok Akhir Barang ".str_replace("s/d","-",$apre['periode']).".xlsx"); + unset($xls); + } + + public function index() { + $form = new Form($this->app); + $tcab = $form->option_db("_", "CabID", $this->id_cab, true, false, "para_cabang", ["CabID","Nama_Cab"], "Aktif=1 ORDER BY CabID", [0,"SEMUA CABANG"]); + $tsup = $form->option_db("_", "SupID", 0, true, false, "para_supplier", ["SupID","Nama_Sup"], "Aktif=1 ORDER BY Nama_Sup", [0,"SEMUA SUPPLIER"]); + $tgrup_inv = $form->option_db("_", "Grup_InvID", 0, true, false, "inv_produk_grup", ["Grup_InvID","Nama_Grup"], "Aktif=1 ORDER BY Nama_Grup", [0,"SEMUA GRUP"]); + $tppn = $form->option("_", "PPN", 9, true, false, [9 => "SEMUA STATUS"] + Invesa::PPN_Array()); + $ttgl = $form->datebox("_", "Tanggal", tgl_ymd(), false, false); + $turut = $form->radio("_", "Urut", "B", true, false, ['B'=>"Nama Barang",'J'=>"Jumlah / Nilai"]); + $tstok = $form->radio("_", "Min_Stok", "N", true, false, ["Y"=>"Ya","N"=>"Tidak"], null, "RepoStokAkhirJS.oc_MinStok"); + $tqty = $form->textbox("_", "Min_Qty", 0, false, false, "double"); + $ajson['html'] = ' +
+ +
'.$tcab.'
+
+
+ +
'.$tsup.'
+
+
+ +
'.$tgrup_inv.'
+
+
+ +
'.$tppn.'
+
+
+ +
'.$ttgl.'
+
+

+
+ +
'.$turut.'
+
+
+ +
'.$tstok.'
+
'.$tqty.'
+
'; + $this->app->json($ajson); + } + +} diff --git a/app/Controller/Report/Stok/CabangController.php b/app/Controller/Report/Stok/CabangController.php new file mode 100644 index 0000000..736f74e --- /dev/null +++ b/app/Controller/Report/Stok/CabangController.php @@ -0,0 +1,162 @@ +app = $app; + $this->db = $db; + $this->id_cab1 = Param::Int("Cab1ID", 0); + $this->id_cab2 = Param::Int("Cab2ID", 0); + $this->reg_name = $session->get('WEB_APP')['REG_NAME']; + } + + private function prepare() { + $apre = [ + 'tgl_from' => Param::Get("Tgl_From"), + 'tgl_to' => Param::Get("Tgl_To"), + 'cab_from' => "Semua Cabang", + 'cab_to' => "Semua Cabang", + ]; + + if ($this->id_cab1 > 0) $apre['cab_from'] = $this->db->fetchField("SELECT Nama_Cab FROM para_cabang WHERE CabID=?", [$this->id_cab1]); + if ($this->id_cab2 > 0) $apre['cab_to'] = $this->db->fetchField("SELECT Nama_Cab FROM para_cabang WHERE CabID=?", [$this->id_cab2]); + + // generate report header + $apre['periode'] = $apre['tgl_from'] . ($apre['tgl_from'] !== $apre['tgl_to'] ? ' s/d '.$apre['tgl_to'] : ''); + + $tsql = ''; $asql = [tgl_sql2str($apre['tgl_from']), tgl_sql2str($apre['tgl_to'])]; + if ($this->id_cab1 > 0) { + $tsql .= " AND Dari_CabID=?"; + array_push($asql, $this->id_cab1); + } + if ($this->id_cab2 > 0) { + $tsql .= " AND Ke_CabID=?"; + array_push($asql, $this->id_cab2); + } + + $apre['query'] = $this->db->runQuery("SELECT M.*,C1.Nama_Cab Nama1,C2.Nama_Cab Nama2 FROM (SELECT * FROM inv_mutasi WHERE (Tgl_Mutasi BETWEEN ? AND ?)".$tsql.") M LEFT JOIN para_cabang C1 ON (M.Dari_CabID=C1.CabID) LEFT JOIN para_cabang C2 ON (M.Ke_CabID=C2.CabID) ORDER BY M.Tgl_Mutasi,M.No_Mutasi", $asql); + return $apre; + } + + public function print() { + $apre = $this->prepare(); + + $pre = new PrintHTML($this->app); + $pre->add_title([strtoupper($this->reg_name), "MUTASI STOK CABANG", "Periode : ".$apre['periode']]); + + $pre->add_field("Tanggal",30,"C", "tgl_sql2str"); + $pre->add_field("No. Mutasi",30,"L"); + $pre->add_field("Dari Cabang",20,"L"); + $pre->add_field("Ke Cabang",20,"L"); + $pre->add_field("Total",20,"R","rupiah"); + $pre->add_field("Catatan",50,"L"); + + $pre->add_sub_title("Cari Cabang : ".$apre['cab_from']); + $pre->add_sub_title("Ke Cabang : ".$apre['cab_to']); + + $pre->show_titles(); + $pre->show_headers(); + + $tot_m = 0; + while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) { + $tot_m += $row['Total_Mutasi']; + $pre->add_row([ $row['Tgl_Mutasi'], $row['No_Mutasi'], $row['Nama1'], $row['Nama2'], $row['Total_Mutasi'], $row['Catatan'] ]); + } + $pre->add_span([ ["GRAND TOTAL",4,"R,B"],[$tot_m,1,"R,B","rupiah"],["",1,"L,B"] ]); + + $pre->add_stamp(1, true); + $pre->show(); + } + + public function excel() { + $apre = $this->prepare(); + $xls = new Xlsx($this->app); + $xls->set_meta([ + 'title' => "Data Mutasi Stok Cabang", + 'desc' => "Export Data Mutasi Stok Cabang" + ]); + $xls->add_title([ $this->reg_name, "DATA MUTASI STOK CABANG", "Periode : ".$apre['periode'] ]); + + $xls->add_field("Tanggal", 12, "@date"); + $xls->add_field("No. Mutasi", 15, "@text"); + $xls->add_field("Dari Cabang", 10, "@text"); + $xls->add_field("Ke Cabang", 10, "@text"); + $xls->add_field("Total", 15, "#,##0.00"); + $xls->add_field("Catatan", 30, "@text"); + $xls->add_sheet("".str_replace("s/d","-",$apre['periode'])); + + $xls->add_sub_title("Dari Cabang : ".$apre['cab_from']); + $xls->add_sub_title("Ke Cabang : ".$apre['cab_to']); + + $xls->show_titles(); + $xls->show_headers(); + + $tot_m = 0; + while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) { + $tot_m += $row['Total_Mutasi']; + $xls->add_row([ $row['Tgl_Mutasi'], $row['No_Mutasi'], $row['Nama1'], $row['Nama2'], $row['Total_Mutasi'], $row['Catatan'] ]); + } + $xls->add_row_bold([ "", "", "Stok Akhir", "", $tot_m, "" ]); + + $xls->add_stamp(1, true); + $xls->download("Data Mutasi Stok Cabang ".str_replace("s/d","-",$apre['periode']).".xlsx"); + unset($xls); + } + + public function index() { + $form = new Form($this->app); + $tcab1 = $form->option_db("_", "Cab1ID", $this->id_cab1, true, false, "para_cabang", ["CabID","Nama_Cab"], "Aktif=1 ORDER BY CabID", [0,"SEMUA CABANG"]); + $tcab2 = $form->option_db("_", "Cab2ID", $this->id_cab2, true, false, "para_cabang", ["CabID","Nama_Cab"], "Aktif=1 ORDER BY CabID", [0,"SEMUA CABANG"]); + $tfrom = $form->datebox("_", "Tgl_From", tgl_ymd(), true, false); + $tto = $form->datebox("_", "Tgl_To", tgl_ymd(), true, false); + $ajson['html'] = ' +
+ +
'.$tcab1.'
+
+
+ +
'.$tcab2.'
+
+
+ +
'.$tfrom.'
+
+
+ +
'.$tto.'
+
'; + $this->app->json($ajson); + } + +} diff --git a/app/Controller/Report/Stok/MutasiController.php b/app/Controller/Report/Stok/MutasiController.php new file mode 100644 index 0000000..a94e18b --- /dev/null +++ b/app/Controller/Report/Stok/MutasiController.php @@ -0,0 +1,218 @@ +app = $app; + $this->db = $db; + $this->id_cab = Param::Int("CabID", 0); + $this->reg_name = $session->get('WEB_APP')['REG_NAME']; + } + + public function brow_produk() { + $tcari = Param::Get("Cari_Produk"); + $tsql = ''; $asql = [1]; + if (!empty($tcari)) { + $tsql .= " AND Barcode_Nama LIKE ?"; + $asql[] = '%' . $tcari . '%'; + } + + $obj = new Table($this->app); + $obj->set_table("vi_inv_produk", "*", "Aktif=?".$tsql, $asql); + $obj->add_field("InvID", "ID", "hid"); + $obj->add_field("SatuanID", "ID", "hid"); + $obj->add_field("VarianID", "ID", "hid"); + $obj->add_field("Kode_SKU", "SKU", "c"); + $obj->add_field("Kode_Barcode", "Barcode", "c"); + $obj->add_field("Nama_Lengkap", "Nama Barang", "awr"); + $obj->set_field_order("Kode_SKU", "A"); + $obj->set_func_select("RepoStokMutasiJS.produk_select"); + $this->app->json([ $obj->db_table("divBrowProduk") ]); + } + + public function auto_produk() { + $tcari = Param::Get("Auto_Query", ""); + $ajson['autodata'] = []; + $bcode = 0; $arec = []; + + // Cari by SKU + Barcode + $_row = $this->db->fetchRow("SELECT P.InvID,P.Nama_Lengkap FROM (SELECT * FROM vi_inv_produk WHERE Aktif=1 AND (Kode_SKU=? OR Kode_Barcode=?)) P", [$tcari, $tcari]); + if ($_row) { + $bcode = 1; + $arec = $_row->getData(); + } + if ($bcode === 1) { + $ajson['autodata'][] = ['value'=>$arec['InvID'], 'text'=>$arec['Nama_Lengkap'], 'data'=>0, 'bc'=>1]; + } else { + $stat = $this->db->runQuery("SELECT P.InvID,P.Nama_Lengkap,P.Kode_SKU FROM (SELECT * FROM vi_inv_produk WHERE Barcode_Nama LIKE ? AND Aktif=1) P ORDER BY P.Nama_Produk,P.Qty LIMIT 50", ['%'.$tcari.'%']); + while ($row = $stat->fetch(SimplePdo::FETCH_ASSOC)) { + $ajson['autodata'][] = ['value'=>$row['InvID'], 'text'=>$row['Nama_Lengkap'], 'html'=>''.$row['Kode_SKU'].' '.$row['Nama_Lengkap'], 'data'=>0, 'bc'=>0]; + } + } + $this->app->json($ajson); + } + + private function prepare() { + $apre = [ + 'id_inv' => Param::Int("InvID", 0), + 'tgl_from' => Param::Get("Tgl_From"), + 'tgl_to' => Param::Get("Tgl_To"), + 'Nama_Produk' => "", + 'Qty' => 1, + 'Satuan_Stok' => "", + 'Satuan_Kemasan' => "", + ]; + + $_produk = $this->db->fetchRow("SELECT Nama_Produk,Qty,Satuan_Stok,Nama_Satuan Satuan_Kemasan FROM vi_inv_produk WHERE InvID=? ORDER BY Qty LIMIT 1", [$apre['id_inv']]); + if ($_produk) $apre = array_merge($apre, $_produk->getData()); + + // generate report header + $apre['periode'] = $apre['tgl_from'] . ($apre['tgl_from'] !== $apre['tgl_to'] ? ' s/d '.$apre['tgl_to'] : ''); + + $tsql = ''; $asql = [tgl_sql2str($apre['tgl_from']), tgl_sql2str($apre['tgl_to']), $apre['id_inv']]; + if ($this->id_cab > 0) { + $tsql .= " AND CabID=?"; + array_push($asql, $this->id_cab); + } + + $apre['query'] = $this->db->runQuery("SELECT D.Tgl_Ref,D.No_Ref,SUM(IF((D.Stok<0 OR D.NotaID=5 OR D.NotaID=6) AND D.NotaID<>3,-D.Stok,0)) Keluar,SUM(IF((D.Stok>0 OR D.NotaID=3) AND (D.NotaID<>5 AND D.NotaID<>6),D.Stok,0)) Masuk, IF(ISNULL(S.Nama_Sup),T.Nama_Member,CONCAT(S.Nama_Sup,IF(B.Data_Beli=1,'',' (Retur)'))) Nama,C.Kode_Cab FROM (SELECT No_Ref,Tgl_Ref,CabID,NotaID,SUM(Stok) Stok FROM inv_detail WHERE (Tgl_Ref BETWEEN ? AND ?) AND InvID=? AND Stok<>0".$tsql." GROUP BY No_Ref) D LEFT JOIN inv_beli B ON (B.No_Beli=D.No_Ref) LEFT JOIN inv_jual J ON (J.No_Jual=D.No_Ref) LEFT JOIN inv_opname O ON (O.No_Opname=D.No_Ref) LEFT JOIN para_supplier S ON (S.SupID=B.SupID) LEFT JOIN app_operator Q ON (Q.UserID=J.UserID) LEFT JOIN para_member T ON (T.MemberID=J.MemberID) LEFT JOIN para_cabang C ON (C.CabID=D.CabID) LEFT JOIN inv_nota N ON (D.NotaID=N.NotaID) GROUP BY D.No_Ref ORDER BY D.Tgl_Ref,N.Urut,D.No_Ref", $asql); + + unset($asql[1]); $asql = array_values($asql); + $apre['stok'] = $this->db->fetchField("SELECT SUM(Stok) Stok FROM inv_detail WHERE Tgl_Refprepare(); + + $pre = new PrintHTML($this->app); + $pre->add_title([strtoupper($this->reg_name), "MUTASI STOK BARANG", "Periode : ".$apre['periode']]); + + $pre->add_field("Tanggal",30,"C", "tgl_sql2str"); + $pre->add_field("No. Nota",30,"L"); + $pre->add_field("Nama Supplier / Member",80,"L"); + $pre->add_field("Cabang",10,"L"); + $pre->add_field("Masuk",20,"R"); + $pre->add_field("Keluar",20,"R"); + $pre->add_field("Stok",20,"R"); + + $pre->add_sub_title("Nama Barang : ".$apre['Nama_Produk']); + + $pre->show_titles(); + $pre->show_headers(); + + $tot_m = 0; $tot_k = 0; + $pre->add_span([ ["Stok Awal",4,"R,B"],["",1,"R,B"],["",1,"R,B"],[Invesa::Format_Stok($apre['stok'], $apre['Qty'], $apre['Satuan_Kemasan'], $apre['Satuan_Stok']),1,"R,B"] ]); + while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) { + $msk = $row['Masuk']; + $klr = $row['Keluar']; + $apre['stok'] += $msk - $klr; + $tot_m += $msk; + $tot_k += $klr; + $pre->add_row([ $row['Tgl_Ref'], $row['No_Ref'], $row['Nama'], $row['Kode_Cab'], ($msk===0?'':Invesa::Format_Stok($msk, $apre['Qty'], $apre['Satuan_Kemasan'], $apre['Satuan_Stok'])), ($klr===0?'':Invesa::Format_Stok($klr, $apre['Qty'], $apre['Satuan_Kemasan'], $apre['Satuan_Stok'])), Invesa::Format_Stok($apre['stok'], $apre['Qty'], $apre['Satuan_Kemasan'], $apre['Satuan_Stok']) ]); + } + $pre->add_span([ ["Stok Akhir",4,"R,B"],[Invesa::Format_Stok($tot_m, $apre['Qty'], $apre['Satuan_Kemasan'], $apre['Satuan_Stok']),1,"R,B"],[Invesa::Format_Stok($tot_k, $apre['Qty'], $apre['Satuan_Kemasan'], $apre['Satuan_Stok']),1,"R,B"],[Invesa::Format_Stok($apre['stok'], $apre['Qty'], $apre['Satuan_Kemasan'], $apre['Satuan_Stok']),1,"R,B"] ]); + + $pre->add_stamp(1, true); + $pre->show(); + } + + public function excel() { + $apre = $this->prepare(); + $xls = new Xlsx($this->app); + $xls->set_meta([ + 'title' => "Data Mutasi Stok Barang", + 'desc' => "Export Data Mutasi Stok Barang" + ]); + $xls->add_title([ $this->reg_name, "DATA MUTASI STOK BARANG", "Periode : ".$apre['periode'] ]); + + $xls->add_field("Tanggal", 12, "@date"); + $xls->add_field("No. Nota", 15, "@text"); + $xls->add_field("Nama Supplier / Member", 40, "@text"); + $xls->add_field("Cabang", 10, "@text"); + $xls->add_field("Masuk", 15, "@"); + $xls->add_field("Keluar", 15, "@"); + $xls->add_field("Stok", 15, "@"); + $xls->add_sheet("".str_replace("s/d","-",$apre['periode'])); + + $xls->add_sub_title("Nama Barang : ".$apre['Nama_Produk']); + + $xls->show_titles(); + $xls->show_headers(); + + $tot_m = 0; $tot_k = 0; + $xls->add_row_bold([ "", "", "Stok Awal", "", "", "", Invesa::Format_Stok($apre['stok'], $apre['Qty'], $apre['Satuan_Kemasan'], $apre['Satuan_Stok']) ]); + while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) { + $msk = $row['Masuk']; + $klr = $row['Keluar']; + $apre['stok'] += $msk - $klr; + $tot_m += $msk; + $tot_k += $klr; + $xls->add_row([ $row['Tgl_Ref'], $row['No_Ref'], $row['Nama'], $row['Kode_Cab'], ($msk===0?'':Invesa::Format_Stok($msk, $apre['Qty'], $apre['Satuan_Kemasan'], $apre['Satuan_Stok'])), ($klr===0?'':Invesa::Format_Stok($klr, $apre['Qty'], $apre['Satuan_Kemasan'], $apre['Satuan_Stok'])), Invesa::Format_Stok($apre['stok'], $apre['Qty'], $apre['Satuan_Kemasan'], $apre['Satuan_Stok']) ]); + } + $xls->add_row_bold([ "", "", "Stok Akhir", "", Invesa::Format_Stok($tot_m, $apre['Qty'], $apre['Satuan_Kemasan'], $apre['Satuan_Stok']), Invesa::Format_Stok($tot_k, $apre['Qty'], $apre['Satuan_Kemasan'], $apre['Satuan_Stok']), Invesa::Format_Stok($apre['stok'], $apre['Qty'], $apre['Satuan_Kemasan'], $apre['Satuan_Stok']) ]); + + $xls->add_stamp(1, true); + $xls->download("Data Mutasi Stok Barang ".str_replace("s/d","-",$apre['periode']).".xlsx"); + unset($xls); + } + + public function index() { + $form = new Form($this->app); + $tcab = $form->option_db("_", "CabID", $this->id_cab, true, false, "para_cabang", ["CabID","Nama_Cab"], "Aktif=1 ORDER BY CabID", [0,"SEMUA CABANG"]); + $tproduk = $form->textauto("_", "Nama_Produk", ['value'=>0,'text'=>""], true, true, "nama barang"); + $tfrom = $form->datebox("_", "Tgl_From", tgl_ymd(), true, false); + $tto = $form->datebox("_", "Tgl_To", tgl_ymd(), true, false); + $ajson['html'] = ' +
+ +
'.$tcab.'
+
+
+ +
'.$tproduk.'
+
+
+ +
'.$tfrom.'
+
+
+ +
'.$tto.'
+
+ '; + $this->app->json($ajson); + } + +} diff --git a/app/Controller/Report/Stok/OpnameController.php b/app/Controller/Report/Stok/OpnameController.php new file mode 100644 index 0000000..c355a13 --- /dev/null +++ b/app/Controller/Report/Stok/OpnameController.php @@ -0,0 +1,161 @@ +app = $app; + $this->db = $db; + $this->app_inv = (array) $session->get('APP_INV'); + $this->id_cab = Param::Int("CabID", 0); + $this->reg_name = $session->get('WEB_APP')['REG_NAME']; + } + + private function prepare() { + $apre = [ + 'id_grup_inv' => Param::Int("Grup_InvID", 0), + 'tgl_from' => Param::Get("Tgl_From"), + 'tgl_to' => Param::Get("Tgl_To"), + ]; + + $apre['nama_grup_inv'] = ($apre['id_grup_inv'] > 0 && $apre['id_sup']===0) ? ($this->db->fetchField("SELECT Nama_Grup FROM inv_produk_grup WHERE Grup_InvID=?", [$apre['id_grup_inv']]) ?? '') : ''; + + // generate report header + $apre['periode'] = $apre['tgl_from'] . (($apre['tgl_from']!==$apre['tgl_to']) ? " s/d ".$apre['tgl_to'] : ''); + + $tsql1 = ''; $tsql2 = ''; + $asql1 = [tgl_sql2str($apre['tgl_from']), tgl_sql2str($apre['tgl_to'])]; + $asql2 = []; + + if ($this->id_cab > 0) { + $tsql1 .= " AND CabID=?"; + array_push($asql1, $this->id_cab); + } + if ($apre['id_grup_inv'] > 0) { + $tsql2 = " WHERE P.Grup_InvID=?"; + array_push($asql2, $apre['id_grup_inv']); + } + + $apre['query'] = $this->db->runQuery("SELECT D.*,P.Nama_Produk,P.Nama_Satuan FROM (SELECT InvID,SatuanID,-Qty Qty,Harga_Beli,(-Qty*Harga_Beli) Jumlah FROM inv_detail WHERE NotaID=1 AND (Tgl_Ref BETWEEN ? AND ?)".$tsql1.") D LEFT JOIN vi_inv_produk P ON (P.InvID=D.InvID AND P.SatuanID=D.SatuanID)".$tsql2." ORDER BY P.Nama_Produk", array_merge($asql1, $asql2)); + return $apre; + } + + public function print() { + $apre = $this->prepare(); + + $pre = new PrintHTML($this->app); + $pre->add_title([strtoupper($this->reg_name), "OPNAME STOK BARANG", "Periode : ".$apre['periode']]); + + $pre->add_field("No.",10,"C"); + $pre->add_field("Nama Barang",50,"L"); + $pre->add_field("Satuan",30,"L"); + $pre->add_field("Qty",20,"R","rupiah2"); + $pre->add_field("HPP",20,"R","rupiah2"); + $pre->add_field("Jumlah",20,"R","rupiah2"); + + if ($apre['id_grup_inv'] > 0) $pre->add_sub_title("Grup Barang : ".$apre['nama_grup_inv']); + + $pre->show_titles(); + $pre->show_headers(); + + $nomor = 0; $tot_opname = 0; + while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) { + $tot_opname += $row['Jumlah']; + $pre->add_row([ ++$nomor, $row['Nama_Produk'], $row['Nama_Satuan'], $row['Qty'], $row['Harga_Beli'], $row['Jumlah'] ]); + } + $pre->add_span([ ["GRAND TOTAL",5,"R,B"], [$tot_opname,1,"R,B","rupiah2"] ]); + + $pre->add_stamp(1, true); + $pre->show(); + } + + public function excel() { + $apre = $this->prepare(); + $xls = new Xlsx($this->app); + $xls->set_meta([ + 'title' => "Data Opname Stok Barang", + 'desc' => "Export Data Opname Stok Barang" + ]); + $xls->add_title([ $this->reg_name, "OPNAME STOK BARANG", "Periode : ".$apre['periode'] ]); + + $xls->add_field("No.", 10, "@integer"); + $xls->add_field("Nama Barang", 35, "@text"); + $xls->add_field("Satuan", 10, "@text"); + $xls->add_field("Qty", 15, "@"); + $xls->add_field("HPP", 15, "#,##0.00"); + $xls->add_field("Jumlah", 15, "#,##0.00"); + $xls->add_sheet("".str_replace("s/d","-",$apre['periode'])); + + if ($apre['id_grup_inv'] > 0) $xls->add_sub_title("Grup Barang : ".$apre['nama_grup_inv']); + + $xls->show_titles(); + $xls->show_headers(); + + $nomor = 0; $tot_opname = 0; + while ($row = $apre['query']->fetch(SimplePdo::FETCH_ASSOC)) { + $tot_opname += $row['Jumlah']; + $xls->add_row([ ++$nomor, $row['Nama_Produk'], $row['Nama_Satuan'], $row['Qty'], $row['Harga_Beli'], $row['Jumlah'] ]); + } + $xls->add_row_bold([ "", "GRAND TOTAL", "", "", "", $tot_opname ]); + + $xls->add_stamp(1, true); + $xls->download("Data Opname Stok Barang ".str_replace("s/d","-",$apre['periode']).".xlsx"); + unset($xls); + } + + public function index() { + $form = new Form($this->app); + $tcab = $form->option_db("_", "CabID", $this->id_cab, true, false, "para_cabang", ["CabID","Nama_Cab"], "Aktif=1 ORDER BY CabID", [0,"SEMUA CABANG"]); + $tgrup_inv = $form->option_db("_", "Grup_InvID", 0, true, false, "inv_produk_grup", ["Grup_InvID","Nama_Grup"], "Aktif=1 ORDER BY Nama_Grup", [0,"SEMUA GRUP"]); + $tfrom = $form->datebox("_", "Tgl_From", tgl_ymd(), true, false); + $tto = $form->datebox("_", "Tgl_To", tgl_ymd(), true, false); + $ajson['html'] = ' +
+ +
'.$tcab.'
+
+
+ +
'.$tgrup_inv.'
+
+
+ +
'.$tfrom.'
+
+
+ +
'.$tto.'
+
'; + $this->app->json($ajson); + } + +} diff --git a/app/Controller/System/AboutController.php b/app/Controller/System/AboutController.php new file mode 100644 index 0000000..4bae393 --- /dev/null +++ b/app/Controller/System/AboutController.php @@ -0,0 +1,142 @@ +app = $app; + $this->session = $session; + $this->update = new Update($app); + $this->check = new CheckSQL($app); + $this->check->ignore_table("app_auth","app_backup","app_config","app_menu","app_operator"); + } + + public function update_check() { + $ainfo = $this->update->check(); + $ajson['is_update'] = $ainfo['cur_sha1'] === $ainfo['new_sha1']; + $ajson['html'] = ' +
+
Versi Aplikasi
+
'.$ainfo['cur_version'].'
+
+
+
Commit Sekarang
+
'.$ainfo['cur_sha'].' '.$ainfo['cur_date'].'
+
+

+
+
Commit Update
+
'.$ainfo['new_sha'].' '.$ainfo['new_date'].'
+
+
+
Informasi Update
+
'.$ainfo['new_message'].'
+
+
+
Status Server
+
+ '.$ainfo['svr_message'].' +
+
'; + $this->app->json($ajson); + } + + public function update_proses() { + $ajson = $this->update->go(); + $this->app->json($ajson); + } + + public function db_check() { + $ajson['html'] = '
  • Proses ...
'; + $ajson['db_count'] = $this->check->count_db(); + $this->app->json($ajson); + } + + public function db_proses() { + $nomor = Param::Get('Nomor', 0); + $ajson['html'] = $this->check->check_db_step($nomor); + $this->app->json($ajson); + } + + public function opti_proses() { + $nomor = Param::Get('Nomor', 0); + $ajson['html'] = $this->check->optimize_db_step($nomor); + $this->app->json($ajson); + } + + public function index() { + $ajson = []; + $apps = $this->session->get('WEB_APP'); + + $ajson['html'] = '
+ +
+
+
+ '.$apps['REG_NAME'].'
'.$apps['REG_ADDRESS'].'
'.$apps['REG_CITY'].' '.$apps['REG_POSTCODE'].'

+ + + +
Register ID:'.Register::reg_id($this->session).'
Register Code:'.Register::reg_code($this->session).'
+
+
'.$apps['APP_NAMES'].' Ver. '.$apps['APP_VER'].'
Updated : '.$apps['APP_UPDATED'].'

'.$apps['CREATOR_YEARS'].', '.$apps['CREATOR_NAME'].'
'.$apps['CREATOR_WEBSITE'].'.
+
+
+
+
+
+
+
Proses Cek dan Otomatis Repair Database, jika terjadi masalah dengan database aplikasi.
+
+
+
+
Proses Optimalisasi database, merampingkan kembali database aplikasi.
+
+
+
+
Cek update aplikasi secara online.
+
+
+
+
+
'; + $this->app->json($ajson); + } +} diff --git a/app/Controller/System/ChpasswdController.php b/app/Controller/System/ChpasswdController.php new file mode 100644 index 0000000..1963db8 --- /dev/null +++ b/app/Controller/System/ChpasswdController.php @@ -0,0 +1,70 @@ +app = $app; + } + + public function simpan() { + $ajson['status'] = false; + + $l_pass = Param::Get("LPass"); + $b_pass1 = Param::Get("BPass1"); + + $auth = new Auth($this->app); + if ($auth->user_check($this->app->user()->username(), $l_pass)) { + $this->app->db()->update('app_operator', 'Password=MD5(?) WHERE UserID=?', [$b_pass1, $this->app->user()->id()]); + $ajson['status'] = true; + $ajson['message'] = "Sukses merubah password Anda!"; + } else { + $ajson['message'] = "Password lama Anda salah!"; + } + $this->app->json($ajson); + } + + public function index() { + $form = new Form($this->app); + $t_passl = $form->password("_", "LPass", '', true, true, "masukkan password lama", 20); + $t_passb1 = $form->password("_", "BPass1", '', true, true, "masukkan password baru 1", 20); + $t_passb2 = $form->password("_", "BPass2", '', true, true, "masukkan password baru 2", 20); + $ajson['html'] = ' +
+ +
'.$t_passl.'
+
+
+ +
'.$t_passb1.'
+
+
+ +
'.$t_passb2.'
+
'; + $this->app->json($ajson); + } +} diff --git a/app/Controller/System/ConfigController.php b/app/Controller/System/ConfigController.php new file mode 100644 index 0000000..432f009 --- /dev/null +++ b/app/Controller/System/ConfigController.php @@ -0,0 +1,82 @@ +app = $app; + $this->db = $db; + $this->session = $session; + } + + public function config() { + $mode = Param::Get('mode', 'view'); + + if ($mode === 'save') { + $sql = new SQL($this->app); + $sql->set_table("app_config"); + $sql->add_param("REG_ADDRESS"); + $sql->add_param("REG_CITY"); + $sql->add_param("REG_POSTCODE"); + $sql->add_param("REG_PHONE"); + //$sql->add_param("REG_FAX"); + $sql->add_param("REG_OWNER"); + $sql->add_param("REG_NPWP"); + //$sql->add_param("REG_WEBSITE"); + $sql->add_param("REG_EMAIL"); + $sql->add_param_userid(); + $sql->add_where("REG_ID"); + $sql->UpdateDB(); + } + + $benable = ($mode === 'edit') ? true : false; + $id_reg = Param::Get("REG_ID", $this->session->get('WEB_APP')['REG_ID']); + $para = $this->db->fetchRow('SELECT * FROM app_config WHERE REG_ID=?', [$id_reg]); + + $form = new Form($this->app); + $form->textbox("Nama Perusahaan", "REG_NAME", $para['REG_NAME'], false, false, "text", "masukkan nama instansi"); + $form->textarea("Alamat Perusahaan", "REG_ADDRESS", $para['REG_ADDRESS'], $benable, false, 1, "masukkan alamat instansi"); + $form->textbox("Kabupaten / Kota", "REG_CITY", $para['REG_CITY'], $benable, false, "text", "masukkan nama kota"); + $form->textbox("Kode Pos", "REG_POSTCODE", $para['REG_POSTCODE'], $benable, false, "angka", "masukkan nomor kodepos"); + $form->textbox("No. Telpon", "REG_PHONE", $para['REG_PHONE'], $benable, false, "phone", "masukkan nomor telphone"); + //$form->textbox("No. Fax", "REG_FAX", $para['REG_FAX'], $benable, false, "phone", "masukkan nomor faximile"); + //$form->textbox("Website", "REG_WEBSITE", $para['REG_WEBSITE'], $benable, false, "text", "masukkan alamat website"); + $form->textbox("Email", "REG_EMAIL", $para['REG_EMAIL'], $benable, false, "email", "masukkan alamat email"); + $form->textbox("Nama Pemilik", "REG_OWNER", $para['REG_OWNER'], $benable, false, "text", "masukkan nama owner"); + $form->textbox("NPWP Pemilik", "REG_NPWP", $para['REG_NPWP'], $benable, false, "text", "masukkan npwp owner"); + $form->hidden("REG_ID", $para['REG_ID']); + $form->hidden("mode", $mode); + $ajson['html'] = $form->show(3); + $this->app->json($ajson); + } + + public function index() { + $this->app->json(['html' => '
']); + } +} diff --git a/app/Controller/System/MenugrupController.php b/app/Controller/System/MenugrupController.php new file mode 100644 index 0000000..09759db --- /dev/null +++ b/app/Controller/System/MenugrupController.php @@ -0,0 +1,165 @@ +app = $app; + $this->db = $db; + $this->session = $session; + $this->mode = (string) Param::Get('mode'); + $this->id_grup = (int) Param::Get("Grup_MenuID", 0); + $this->parent_code = (string) $session->get('WEB_APP')['PARENT_CODE']; + } + + public function table_detail() { + if (in_array($this->mode, ['add','edit','del'])) { + $sql = new SQL($this->app); + $sql->set_table("app_menu_grup"); + $sql->add_param("Nama_Grup"); + $sql->add_param("Ket"); + $sql->add_param("Aktif"); + $sql->add_param_stamp(); + $sql->add_param_userid(); + $sql->add_where("Grup_MenuID"); + + if ($this->mode === "add") { + $sql->InsertDB(); + } else if ($this->mode === "edit") { + $sql->UpdateDB(); + } else if ($this->mode === "del") { + $sql->DeleteDB(); + } + } + + $tcari = Param::Get("Cari_Grup", ""); + $twhere = ''; $apar = []; + if (!empty($tcari)) { + $twhere = 'Nama_Grup LIKE ?'; + $apar[] = '%'.$tcari.'%'; + } + + $obj = new Table($this->app); + $obj->set_table('app_menu_grup', '*,IF(Grup_MenuID=1,0,1) IDel', $twhere, $apar); + $obj->add_field("Grup_MenuID", "ID", "hid"); + $obj->add_field("Nama_Grup", "Nama Grup"); + $obj->add_field("Ket", "Keterangan"); + $obj->add_field("DateStamp", "Update Terakhir", "c", 'sqljam'); + $obj->add_field("Aktif", "Aktif", "c", "checkbox"); + $obj->set_field_order("Nama_Grup", "A"); + $obj->add_row_btn("menu-button", "Menu", "MenuGrupJS.menu_show"); + $obj->add_row_btn("clipboard", "Ubah", "MenuGrupJS.detail_ubah"); + $obj->add_row_btn("trash", "Hapus", "MenuGrupJS.detail_hapus", "IDel", 1); + $obj->set_func_btn("MenuGrupJS.detail_tambah", "+ Grup"); + $this->app->json([ $obj->json_table("divDetail") ]); + } + + public function detail_grup() { + $agrup = [ 'Nama_Grup' => '', 'Ket' => '', 'Aktif' => 1, 'Grup_MenuID' => 0 ]; + if ($this->mode === 'edit') { + $agrup = $this->db->fetchRow('SELECT * FROM app_menu_grup WHERE Grup_MenuID=?', [$this->id_grup]); + } + + $form = new Form($this->app); + $form->textbox("Nama Grup Menu", "Nama_Grup", $agrup['Nama_Grup'], true, false, "text", "nama grup menu"); + $form->textarea("Keterangan Grup", "Ket", $agrup['Ket'], true, false, 1, "keterangan grup menu"); + $form->switch("Status Aktif", "Aktif", $agrup['Aktif'], true, false, ["1","0"]); + $form->hidden("Grup_MenuID", $agrup['Grup_MenuID']); + $form->hidden("mode", $this->mode); + $ajson['html'] = $form->show(3); + $this->app->json($ajson); + } + + public function detail_menu() { + $agrup = $this->db->fetchRow('SELECT Grup_MenuID,Nama_Grup,CONVERT(DECODE(Menu,?) USING UTF8MB4) Menu FROM app_menu_grup WHERE Grup_MenuID=?', [$this->session->get('WEB_APP')['PARENT_CODE'], $this->id_grup]); + $amenu = explode(",", $agrup['Menu']); + + $amodul = $this->db->fetchAll("SELECT * FROM app_menu WHERE Level=0 AND Modul<>'IND' AND Aktif=1 ORDER BY Urut ASC"); + $hasil = '
'; + $ajson = ['html' => '']; + if (count($amodul)>1) { + $hasil .= ''; + $hasil .= '
'; + foreach ($amodul as $i => $modul) { + $alist = $this->db->fetchAll("SELECT * FROM app_menu WHERE Modul=? AND Level>0 AND Aktif=1 ORDER BY Kode", [$modul['Modul']]); + $hasil .= '
'; + $hasil .= $this->modul_gen($alist, $amenu); + $hasil .= '
'; + } + $hasil .= '
'; + } else { + $alist = $this->db->fetchAll("SELECT * FROM app_menu WHERE Modul=? AND Level>0 AND Aktif=1 ORDER BY Kode", [$amodul[0]['Modul']]); + $hasil .= $this->modul_gen($alist, $amenu); + } + $ajson['html'] .= $hasil.'
'; + $ajson['html'] .= ''; + $this->app->json($ajson); + } + + public function save_menu() { + $amenu = explode(",", (string) Param::Get("Menu")); + $ahasil = []; + $amodul = $this->db->fetchAll("SELECT * FROM app_menu WHERE Level=0 AND Modul<>'IND' AND Aktif=1 ORDER BY Urut ASC"); + foreach ($amodul as $modul) { + $akode = $this->db->fetchColumn("SELECT Kode FROM app_menu WHERE Modul=? AND Level>0 AND Aktif=1 ORDER BY Kode", [$modul['Modul']]); + $asub = array_intersect($amenu, $akode); + if (count($asub)>0) $ahasil = array_merge($ahasil, [$modul['Kode']], $asub); + } + $this->db->runQuery("UPDATE app_menu_grup SET Menu=ENCODE('".implode(",",$ahasil)."',?),DateStamp=NOW(),UserID=? WHERE Grup_MenuID=?", [$this->parent_code, $this->session->get('WEB_USER')['UserID'], $this->id_grup]); + $this->app->json([ 'status' => true ]); + } + + private function modul_gen(array $alist = [], array $amenu = []): string { + $hasil = ''; + $hasil .= ''; + foreach ($alist as $list) { + $checked = (in_array($list['Kode'], $amenu)) ? "checked" : ""; + $hasil .= sprintf('', str_repeat("--", $list['Level']-1)."> ".$list['Menu'], $list['Judul'], $list['Modul'], $list['Kode'], $checked); + } + $hasil .= '
Nama MenuKeterangan
%s%s
'; + return $hasil; + } + + public function index() { + $this->app->json([ + 'html' => ' +
+
Daftar Grup Menu
 
+
' + ]); + } +} diff --git a/app/Controller/System/OperatorController.php b/app/Controller/System/OperatorController.php new file mode 100644 index 0000000..0e8df4b --- /dev/null +++ b/app/Controller/System/OperatorController.php @@ -0,0 +1,237 @@ +app = $app; + $this->db = $db; + $this->session = $session; + $this->mode = (string) Param::Get('mode'); + $this->id_user = (int) Param::Get("UserID"); + $this->filter = (int) Param::Get("Filter_Level"); + $this->parent_code = (string) $session->get('WEB_APP')['PARENT_CODE']; + } + + public function table_detail() { + $cari = Param::Get("Cari_User"); + $twhere = ''; $apar = []; + if ($this->filter === 99) { + $twhere = "Level>=?"; + $apar[] = $this->session->get('WEB_USER')['Level']; + } else { + $twhere = "Level=?"; + $apar[] = $this->filter; + } + if (!empty($cari)) { + $twhere .= ' AND CONCAT(Username,Nama) LIKE ?'; + $apar[] = '%'.$cari.'%'; + } + $id = (int) $this->session->get('WEB_USER')['UserID'] ?? 0; + $twhere .= ($id === 2) ? ' AND UserID>1' : ($id > 2 ? ' AND UserID>2' : ''); + + $obj = new Table($this->app); + $obj->set_table("app_operator", "*", $twhere, $apar); + $obj->add_field("UserID", "ID", "hid"); + $obj->add_field("Username", "Username"); + $obj->add_field("Nama", "Nama Pengguna", "awr"); + $obj->add_field("Posisi", "Posisi"); + $obj->add_field("Level", "Level", "l", $this->session->get('WEB_APP')['USER_LEVEL']); + $obj->add_field("Aktif", "Aktif", "c", "checkbox"); + $obj->set_field_order("Username", "A"); + $obj->add_row_btn("menu-button", "Menu", "OperatorJS.menu_show"); + $obj->add_row_btn("clipboard", "Ubah", "OperatorJS.detail_ubah"); + $obj->add_row_btn("trash", "Hapus", "OperatorJS.detail_hapus"); + $obj->set_func_btn("OperatorJS.detail_tambah", "+ Pengguna"); + $this->app->json([ $obj->json_table("divDetail") ]); + } + + public function detail_filter() { + $form = new Form($this->app); + $tfilter = $form->option("_", "Fi_Level", $this->filter, true, false, [99=>"SEMUA LEVEL PENGGUNA"] + $this->session->get('WEB_APP')['USER_LEVEL']); + $ajson['html'] = ' +
Tampilan Berdasarkan :
+
'.$tfilter.'
'; + $this->app->json($ajson); + } + + public function detail_user() { + $auser = [ 'UserID'=>0, 'Username'=>"", 'Nama'=>"", 'Posisi'=>"", 'Level' => 9, 'Aktif' => 1, 'Grup_MenuID' => 0 ]; + if ($this->mode === 'edit') { + $auser = $this->db->fetchRow('SELECT * FROM app_operator WHERE UserID=?', [$this->id_user]); + } + + $form = new Form($this->app); + $t_user = $form->textbox("_", "Username", $auser['Username'], true, true, "text", "username"); + $t_nama = $form->textbox("_", "Nama", $auser['Nama'], true, false, "text", "nama pengguna"); + $t_posi = $form->textbox("_", "Posisi", $auser['Posisi'], true, false, "text", "posisi pengguna"); + $t_level = $form->option_ulevel("_", "Level", $auser['Level'], true, false, "", "OperatorJS.oc_Level();"); + $t_pass = $form->password("_", "Password", "", true, true, "", 50, "biarkan kosong jika tidak ingin mengubah password."); + $t_status = $form->switch("_", "Aktif", $auser['Aktif'], true, false, ["1","0"]); + $t_grup = $form->option_db("_", "Grup_MenuID", $auser['Grup_MenuID'], true, false, "app_menu_grup", ["Grup_MenuID","Nama_Grup"], "Aktif=1", [0,"TANPA GRUP"]); + $ajson['html'] = ' +
+ +
'.$t_user.'
+
+
+ +
'.$t_nama.'
+
+
+ +
'.$t_posi.'
+
+
+ +
'.$t_level.'
+
+

+
+ +
'.$t_grup.'
+
+
+ +
'.$t_pass.Invesa::Form_Info("biarkan kosong jika tidak ingin mengubah password.").'
+
+
+ +
'.$t_status.'
+
+ + + '; + $this->app->json($ajson); + } + + public function detail_menu() { + $auser = $this->db->fetchRow("SELECT UserID,Nama,Grup_MenuID,CONVERT(DECODE(Menu,?) USING UTF8MB4) Menu FROM app_operator WHERE UserID=?", [$this->parent_code, $this->id_user]); + $amenu = explode(",", $auser['Menu']); + + $aglist = []; $ajson = ['html' => '']; + $glist = $this->db->fetchField("SELECT CONVERT(DECODE(Menu,?) USING UTF8MB4) FROM app_menu_grup WHERE Grup_MenuID=?", [$this->parent_code, $auser['Grup_MenuID']]); + if (!empty($glist)) $aglist = explode(",", $glist); + + $amodul = $this->db->fetchAll("SELECT * FROM app_menu WHERE Level=0 AND Modul<>'IND' AND Aktif=1 ORDER BY Urut ASC"); + $hasil = '
'; + if (count($amodul)>1) { + $hasil .= ''; + $hasil .= '
'; + foreach ($amodul as $i => $modul) { + $alist = $this->db->fetchAll("SELECT * FROM app_menu WHERE Modul=? AND Level>0 AND Aktif=1 ORDER BY Kode", [$modul['Modul']]); + $hasil .= '
'; + $hasil .= $this->modul_gen($alist, $amenu, $aglist); + $hasil .= '
'; + } + $hasil .= '
'; + } else { + $alist = $this->db->fetchAll("SELECT * FROM app_menu WHERE Modul=? AND Level>0 AND Aktif=1 ORDER BY Kode", [$amodul[0]['Modul']]); + $hasil .= $this->modul_gen($alist, $amenu, $aglist); + } + $ajson['html'] .= $hasil.'
'; + $ajson['html'] .= ''; + $this->app->json($ajson); + } + + public function save_user() { + $sql = new SQL($this->app); + $sql->set_table("app_operator"); + $sql->add_param("Grup_MenuID"); + $sql->add_param("Username"); + $sql->add_param("Nama"); + $sql->add_param("Posisi"); + $sql->add_param("Level"); + $sql->add_param("Aktif"); + $sql->add_param("SuperID", $this->session->get('WEB_USER')['UserID']); + $sql->add_where("UserID"); + + if ($this->mode === "add") { + $sql->InsertDB(); + } else if ($this->mode === "edit") { + $sql->UpdateDB(); + } else if ($this->mode === "del") { + $sql->DeleteDB(); + } + // SIMPAN PASSWORD + $pass = Param::Get("Password"); + if (($this->mode !== "del") and !empty($pass)) { + $this->db->runQuery("UPDATE app_operator SET Password=MD5(?) WHERE Username=?", [$pass, Param::Get("Username")]); + } + $this->app->json([ 'status' => true ]); + } + + public function save_menu() { + $amenu = explode(",", (string) Param::Get("Menu")); $ahasil = []; + $amodul = $this->db->fetchAll("SELECT * FROM app_menu WHERE Level=0 AND Modul<>'IND' AND Aktif=1 ORDER BY Urut ASC"); + foreach ($amodul as $modul) { + $akode = $this->db->fetchColumn("SELECT Kode FROM app_menu WHERE Modul=? AND Level>0 AND Aktif=1 ORDER BY Kode", [$modul['Modul']]); + $asub = array_intersect($amenu, $akode); + if (count($asub)>0) $ahasil = array_merge($ahasil, [$modul['Kode']], $asub); + } + $this->db->runQuery("UPDATE app_operator SET Menu=ENCODE('".implode(",",$ahasil)."',?),DateStamp=NOW(),SuperID=? WHERE UserID=?", [$this->parent_code, $this->session->get('WEB_USER')['UserID'], $this->id_user]); + $this->app->json([ 'status' => true ]); + } + + public function check_user() { + $ada = (int) $this->db->fetchField("SELECT COUNT(*) FROM app_operator WHERE Username=?", [Param::Get("Username")]) > 0; + $this->app->json([ 'ada' => $ada ]); + } + + private function modul_gen(array $alist = [], array $amenu = [], array $aglist = []): string { + $hasil = ''; + $hasil .= ''; + foreach ($alist as $list) { + $checked = (in_array($list['Kode'], $amenu)) ? "checked" : ""; + $gchecked = (in_array($list['Kode'], $aglist)) ? "checked" : ""; + $hasil .= sprintf('', str_repeat("--", $list['Level']-1)."> ".$list['Menu'], $list['Judul'], $list['Modul'], $list['Kode'], $checked, $gchecked); + } + $hasil .= '
Nama MenuKeterangan
%s%s
'; + return $hasil; + } + + public function index() { + $this->app->json([ + 'html' => ' +
+
Daftar Pengguna
 
+
' + ]); + } +} diff --git a/app/Controller/System/PrinterController.php b/app/Controller/System/PrinterController.php new file mode 100644 index 0000000..10b51aa --- /dev/null +++ b/app/Controller/System/PrinterController.php @@ -0,0 +1,128 @@ +app = $app; + $this->db = $db; + $this->session = $session; + $this->mode = Param::Get("mode", ""); + $this->curr_id_reg = (string) $session->get('WEB_APP')['REG_ID']; + $this->id_reg = Param::Get("REG_ID", $this->curr_id_reg); + } + + public function form_printer() { + if ( $this->mode === "save" ) { + $sql = new SQL($this->app); + $sql->set_table("inv_config"); + $sql->add_param("PRINT_AUTO"); + $sql->add_param("PRINT_OPENCD"); + $sql->add_param("PRINT_AUTOCUT"); + $sql->add_param("PRINT_ROW"); + $sql->add_param("TITLE_BEGIN"); + $sql->add_param("TITLE_END"); + $sql->add_where("REG_ID"); + $sql->UpdateDB(); + + if ($this->id_reg === $this->curr_id_reg) { + $_sess = $this->session->get('APP_INV', []); + $_sess['PRINT_AUTO'] = Param::Get("PRINT_AUTO", 1); + $_sess['PRINT_OPENCD'] = Param::Get("PRINT_OPENCD", 1); + $_sess['PRINT_AUTOCUT'] = Param::Get("PRINT_AUTOCUT", 1); + $_sess['PRINT_ROW'] = Param::Get("PRINT_ROW", 0); + $_sess['TITLE_BEGIN'] = Param::Get("TITLE_BEGIN", ""); + $_sess['TITLE_END'] = Param::Get("TITLE_END", ""); + $this->session->set('APP_INV', $_sess); + } + + $ajson['sukses'] = true; + $this->mode = "view"; + } + + $para = []; + if ($this->id_reg > 0) { + $para = $this->db->fetchRow("SELECT * FROM inv_config WHERE REG_ID=?", [$this->id_reg]); + $para['Nama_Cab'] = $this->db->fetchField("SELECT Nama_Cab FROM para_cabang WHERE CabID=?", [$para['CABANGID']]) ?? ''; + } + + $benable = ($this->mode === "edit") ? true : false; + $form = new Form($this->app); + $fautoprint = $form->checkbox("_", "PRINT_AUTO", $para['PRINT_AUTO'], $benable, false, [1,0]); + $fopencd = $form->checkbox("_", "PRINT_OPENCD", $para['PRINT_OPENCD'], $benable, false, [1,0]); + $fautocut = $form->checkbox("_", "PRINT_AUTOCUT", $para['PRINT_AUTOCUT'], $benable, false, [1,0]); + $ftitlebegin = $form->textbox("_", "TITLE_BEGIN", $para['TITLE_BEGIN'], $benable, false, "text", "catatan atas struk"); + $ftitleend = $form->textbox("_", "TITLE_END", $para['TITLE_END'], $benable, false, "text", "catatan bawah struk"); + $fprintrow = $form->textbox("_", "PRINT_ROW", $para['PRINT_ROW'], $benable, false, "number"); + + $ajson['html'] = ' +
+
+
'.$fautoprint.'
Otomatis Cetak Struk ?
+
'.$fopencd.'
Otomatis Buka Laci Kasir ?
+
'.$fautocut.'
Otomatis Potong Struk ?
+
+
+

+
+
Header Struk'.$ftitlebegin.Invesa::Form_Info("Gunakan [br] untuk header yang terdiri dari beberapa baris.").'
+
+
+
Footer Struk'.$ftitleend.Invesa::Form_Info("Gunakan [br] untuk footer yang terdiri dari beberapa baris.").'
+
+
+
Baris Cetak Kosong'.$fprintrow.Invesa::Form_Info("Jumlah baris kosong dibawah struk/nota sebelum potong.").'
+
+ '; + $ajson['Nama_Cab'] = $para['Nama_Cab']; + $this->app->json($ajson); + } + + public function brow_cabang() { + $obj = new Table($this->app); + $obj->set_table("(SELECT * FROM para_cabang WHERE Aktif=1) C LEFT JOIN inv_config G ON (G.CABANGID=C.CabID)", "C.*,G.REG_ID"); + $obj->add_field("REG_ID", "ID", "hid"); + $obj->add_field("Kode_Cab", "Kode", "c"); + $obj->add_field("Nama_Cab", "Nama Cabang", "awr"); + $obj->set_field_order("Kode_Cab", "A"); + $obj->set_func_select("PrinterJS.cab_select"); + $this->app->json([ $obj->json_table("divBrowCab") ]); + } + + public function index() { + $this->app->json(['html' => + '
 
' + ]); + } +} diff --git a/app/Controller/System/ProfileController.php b/app/Controller/System/ProfileController.php new file mode 100644 index 0000000..79ef0d1 --- /dev/null +++ b/app/Controller/System/ProfileController.php @@ -0,0 +1,114 @@ +app = $app; + $this->db = $db; + } + + public function save_profile() { + $_nama = Param::Get("Nama"); + $_posisi = Param::Get("Posisi"); + $_email = Param::Get("Email"); + $_hp = Param::Get("HP"); + $this->app->db()->update('app_operator', ['Nama'=>$_nama, 'Posisi'=>$_posisi, 'Email'=>$_email, 'HP'=>$_hp], 'UserID=?', [$this->app->user()->id()]); + $this->app->json([ 'status' => true ]); + } + + public function upload_picture() { + $ajson['result'] = 0; + $upload = $this->app->request()->getUploadedFiles(); + $file = $upload['Gambar1']; + + if ($file->getError() === UPLOAD_ERR_OK) { + $file_name = $file->getClientFilename(); + $file_size = $file->getSize(); + if ($file_size < 20480000) { + $file_ext = pathinfo($file_name, PATHINFO_EXTENSION); + if (in_array($file_ext, ["png","jpg","jpeg","gif"])) { + $file_name = $file->getTempName(); + $mime = $file->getClientMediaType(); + $this->db->runQuery("INSERT INTO app_operator_profile (UserID,Mime,Image) VALUES (?, ?, \"".addslashes(file_get_contents($file_name))."\") ON DUPLICATE KEY UPDATE Mime=VALUES(Mime), Image=VALUES(Image)", [$this->app->user()->id(), $mime]); + $ajson['result'] = 1; + } else { + $ajson['message'] = "File tidak dapat diterima !"; + } + } else { + $ajson['message'] = "Ukuran file diatas 20MB !"; + } + } else { + $ajson = ['result' => 0, 'message' => $file->getError()]; + } + $this->app->json($ajson); + } + + public function get_picture() { + $gambar = "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6CAYAAACI7Fo9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAK6wAACusBgosNWgAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNXG14zYAAB87SURBVHic7d15cKR3fefx9/P0Iaml1n2O5NGMxsdgE3yFa5d4TLCXBIxtliWuFKcJu1shVGpDbVLZJX8EAimSVJGtLJDaXRaHQCpFUmBMgITFxB6KggSCDQSPxzaW3R5do6PVal3dT/fzPPvHT92WNDq6paf79xzfV5XK8syon6+k59O/3/M8v8NwXRcRWINAGjgBpIDXAqNbf3c30Fnn6+WBr2x9Pg08AmwAM8AqMH/MeoUmhgTd1wxgBBgGxrc+zqCC3Q/0Am1AD5AEWoG4R8cuAwXAApaBTSALLKKC/yyQ2fqYA2YBOZl8SoLuHyZwGrgauAm4GXgJKugDGuuqxQIq6E8CjwM/An4GPAc4GusSWyTo+qSAs8CrgXNbn59CdcXDYBV4HrgInAe+t/X5hsaaIkuC3jwGcAMq1OdQrfY1WitqvmdQrf35rY8nkO5+U0jQG6sP1QV/E+pG2Uvw7ho66Mqorv4jwN+huvxLWisKMQm69/qB24B7gF8ExvSWExhTwD8CDwHfRt30Ex6RoHujDRXut6HCPXrwPxeHmEaF/q9Qod/UW07wSdCP56WocL+F6F1vN8szwBdRof+p5loCS4Jev07gDcC7gNcBCb3lREYJ+BbwWeDrqME9okYS9NqdAt4B3I963i30eQ54APgc6hGeOIQE/XA/j2q93w50a65F7JQDPo9q5f9Fcy2+JkHf3yuA/wLchxq1JvzLAb4A/A/g+5pr8SUJ+pVeDnwA+BUk4EHjAH8DfBz4geZafEWC/qJKwN8KxDTXIo7HBv4WCXyVBF3NBvtd4D1ICx42DvAZ4GOo2XaRFeWg9wK/CfwW9c/bFsGSB/4U+DPUVNvIiWrQ3wZ8FDW/W0RHBvggavBNpEQt6DcDfwzcobsQodXDwO+gJtJEQlSuSdtQ12nfRUIu1DnwXdQ50aa5lqaIQov+WuBPgFt1FyJ86YfAb6Omy4ZWmFv0DuATqFlQEnKxn1tR58gnUOdMKIW1RX8N6hd3o+5CRKD8GHg/8B3dhXgtbC26ibqb/ggSclG/G1Hnzu8RsmyEqUU/CXwKeKPuQkQofA14H/CC7kK8EJagvwH4NGppZCG8Mgu8FzX/PdCC3j0xgT9AvftKyIXXRlDn1h8Q8KwEuUXvA/4P8GbdhYhIeBD4jwR0pdqgBv0m4K9Rmx4I0SwXgV9FrU0fKEHsjtyFWvxfQi6a7Szq3LtLdyH1ClrQ34/qQslsM6FLJ/Al1LkYGEEK+h8B/xPZ6UTol0Cdix/SXUitgnKN/n9RC0MI4TefAX5NdxGH8XvQ08BfAP9ecx1CHORLwLtRO8j6kp+D3oHafO92zXUIUYtHUZtprmmuY09+vUbvAL6KhFwEx+2oc9aXM+D8GPQ06gd2TnchQtTpHOrcTesuZDe/BT2N6q5LyEVQnUOdw74Ku5+Cnga+goRcBN851Lnsm7D7JeidyI03ES63o85pXwzu8kvQP4e05CJ8zqHObe10B91ADYa5W3MdQjTK3ahz3NBZhO6g/yEy4k2E33tQ57o2OgfMvA/4pK6DC6HBb6CWO2s6XUF/I/AQsmupiBYbuAe1ak1T6Qj6y1BzerubfWAhfCCHukn3k2YetNlB7wH+GbimmQcVwmeeAV4JLDfrgM28GRcD/hIJuRDXoLLQtEvXZgb9QwRwCR4hGuQumrhwRbO67q8H/qEZBxIiYH4J+EajD9KMoI8CP0DWXdfCdV3K5TKO42BZ1o6/SyaTmKZJPB7HMLSO54iyWeDlwHQjD9LooMeAvwfubORBhGJZFpubm9UPy7IolUqUSqVq4LerBDyRSJBIJEgmk7S1tVU/ksmkpu8kcr4J/DLq8VtDNDroHwE+2MgDRJnjOGxsbJDL5VhbW2NjY6MaagDTNDEMo9paG4ZR/bvtn7uui+u6OI5T/btEIkEqlaKjo4Pu7m46Ony5nkKYfBS1uWNDNDLorwK+i+YxvmG0sbFBNpslm81SKBRwHAfTNKvB9kIl+I7jEIvFSKVSdHV10dvbSyqV8uQYYgcX+DfAPzXixRsV9BTwfeCGRrx4VK2vr3P58mWWlpawbZtYLLajxW6U3aHv6+tjeHhYAu+9J4BXABtev3Cjgv4p4Ncb8cJRZFkWU1NTLC4u4jiO1ptnlWt90zQZHBxkdHSURCKhpZaQ+nPUPBBPNSLod6BuLggPZLNZMpkMxWLRV3fHXdelVCrR1tbGyZMn6e3t1V1SmNwJPOzlC3od9Bbgh0iX3RMzMzNkMhni8TimqXtG8d5s28ZxHE6ePMmJEyd0lxMWTwC3AkWvXtDrs+f3kZB74oUXXiCTyZBIJHwbcoBYLEY8HieTyTA93dBHwVFyAypLnvGyRX8ZamCMPHw9ptnZ2WpL7peu+mEqXfmJiQmGhoZ0lxMGFmogjSez3LxqKgzUpnMS8mNaW1vj0qVL1TvqQWEYRrVlX19f111OGCRRmfLkJPAq6O8AbvPotSLLdV0uXbqE67q+7q7vxzTNHd+DOLbbgHd68UJenE1p4MMevE7krayssLKyQjwe3J2h4/E4Kysr5PN53aWExYfwYH14L4L+X4FxD14n8paWlnSX4AnXdVlebtqaCmE3jsrYsRw36CeBDxy3CAHlcpnV1VViseAvoxeLxcjn89h2w+ZoRM0HUFk7suMG/ffx6e6RQbO+vo5lWYG8Nt/NNE0KhQJra77cQTiIOjjm47bjnFW3APcf5+DiRaurq9XZY2HgOI7cfffW/ajMHclxgv7fjvG1Ype1tbVQtOYVhmGwurqqu4ywOXLmjnpm3QK8+agHFTuVSiU2NzdDFXTTNNnc3JTrdG+9mSO26kc9s/47svmCZwqFAuVyOVADZA5jmmb1DUx4JobKXt2OEvSbgXuPcjCxt7C2fLZtUygUdJcRNveiMliXowT9g0hr7qkwt3ph/t40iXGE5dnqDfqNyLW55wqFQqi67RWGYUjQG+PNwE31fEG9Qf/PR/gacYDKrK8wBt00TSzLknHv3jOB/1TvF9TqFPD2el5cHM627erSTGFULpdDef/BB94OnK71H9dzdr0bDwbXi50sy7pivfWwMAyDcrl8xcYRwhNp4F21/uNag55CRsE1hG3boe/ahv370+h+VDYPVWvQ7+KYg+rF3izLwnGcUF6jG4aBbdvSojfOSWrcuLTWoL/36LWIg4Qx4LuFaQy/D9WUzVqCfj1w7ni1iP1EoVsbhTczjc6hMnqgWoL+TmQtuIaRkWPimJLUsNzUYUFvAe7zpByxpyi06FH4HjW7D5XVfR0W9NtQz89Fg0QhBFH4HjU7xSGLsx4W9Jqf04mjCfJCkLUK62Agnzkwqwf9BnqA13lbi9itpeXAHpcQtXodKrN7Oijo54Bhz8sRO0i3VnhkmAOejh0U9Ld4X4vYze97qx1HZSOKZFIe2jTJvpnd7wzrRW1/LBoskUhgGEZoW3bTNEOxhHVA3IHK7hX2C/orkW57UySTSRKJRCiD7rouiURC7kM0zzDwqr3+Yr+gv75xtYjtYrEYyWQytEFPJpOhvTTxqX+31x/u9RtIALc3tBRRlcvlQrfUc4VpmqytrbGysqK7lCi5HZXhHfY6u66lhrGzwhuLi4vYth3K8eCV+ehh2VMuIK5HZXiHvYJ+O3u8I4jGCGvIKwzDoFQq6S4jSvbske8V9Nc2vBQhRCNdkeHdQW/jGPs7ifpF4dGTPEdvultQWa7aHfSXIHudN1UqlQrlHfftUqmaVjsS3hlHZblqd9BfvcefiQbq6OgI/TV6W1vb4f9QeMlEZXnHH2wnK8k0WXt7Oy0tLaFcbslxHFpbW+no6NBdShTtyPL2oMeAs82tRcRiMfr7+ymXy6EKu+M4lMtlent7QzlGIADOsm3rtO2/gdPARNPLEQwNDdHe3k5ra2souvGGYdDa2ko6nWZoaEh3OVE1wbYNHravenA90N70cgSJRIIbbrgBx3G4cOEClmUFthV0HIdkMsn111+PYRiB/T5CoB2V6Z/BzhZduu0axWIxEokEra2tge7CO45DW1sbsVhMQq5fNdPbfxPy/NwHOjo6Av24zXVd0mnZucsnqpk2t/1XWnQfCPrjNtM05S67f5xlK+OVoA8CY9rKEVWVx21BbNUr1+cyQMY3xlDZrgZ9jAMWlhPNE4/HSaVSgdxq2HEcOjo6IjGsNyB62GrAtwdd7pz4RHd3dyBbdNd16erq0l2GeJHJrqDXvKG6aLx0Oh245aUqy0ZJ0H3nNEjQfamtrY329vZAPWazbZt0Oi0z1fxnR9BHNBYi9tDd3R2ooLuuS3d3t+4yxJVGQILuW729vYHpvlcWgZSg+1I16KPssxa00CeZTNLV1RWIu+/lcpnu7m7ptvtTLzBqAikO2XJV6NHf36+7hJqYphmYWiOoBWgzUatR9GkuRuyhs7OT9vZ2X7fqtm2TSqXo7OzUXYrYWx9wygRcILhjLkPMNE0GBwd9HXTHcRgelk19fMwAXBO1K4uMWfSp3t5e2trafHkH3rZt2tvb6euTDqGPpYDXV27GxQ/5x0KTeDzO0NAQ5XJZdylXcByHkZGRQE/CiYA4cMIE/HcGiR0GBwfp6OjwVRfetm06OjqkNQ8G2wTu1V2FOFgsFuPEiRO+CrrjOIyOjkprHgz3moDcLg2Avr4+ent7fdGFryz62NMjEx4DolNmrAXIyZMntY+Wq0xeGR+XfT6CRIIeIG1tbfT19Wlt1W3bZmRkhJYWGWMVJBL0gPHDNXEiIZvtBo0EPWD8MMnFDzWI+kjQhYgACboQESBBFyICJOhCRIAEXYgIkKAHjB8er/mhBlEfCXrAlMtl7UErlUpajy/qZwJ53UWI2szMzLC0tKR1J5RYLMbU1BRzc3PaahB1y5vAl3VXIQ73/PPPk8lkMAxDa4teOX6lHhEIX44ji074XiaTYXZ21jerrBqGQTweZ2ZmBkAmuPhfzASmkcUnfMtvIa8wDINkMsns7CxTU1O6yxH7KwMzJvANYENzMWIXx3GYnJxkdnbW15NIEokEly5d4rnnnpMx8P60AXwjztYqkZqLEdsUi0WeffZZVlZWfNeS7yWZTDI3N0ehUODMmTOBqDlCXMAwgQywpLkYsSWXy/Hkk0+Sz+cDFZhkMsnKygoXLlwgn5cHOT6yBDxvopr2ouZiIs91Xaampnj66aexLMvX3fX9JBIJLMvi4sWLTE9P6y5HKEVgM466GZfVXEykra6ukslkWFtbIx6Pax8QcxyxWAzXdbl06RIrKyuMj4/T3t6uu6woywLTlUdrszoriSrbtpmZmWFubg7HcQLZiu/FMAwSiQSrq6tcuHCBkZERTpw4gWnKQEwNZuHFZ+gS9CbLZrNMTU2xsbFBPB4nHg/fcIZ4PF69JMlms4yOjso68M23I+jPaSwkUlZWVpieniafz2OaZmha8f1UWvdCocAzzzzDwsICo6OjpNNp3aVFxXMgQW+a1dVV5ubmWF5eri6ZHCWxWIxYLMbKygr5fJ6enh6Gh4cl8I23I+hTgIPMZvOU67rkcjnm5uZYW1vDcRxisVigb7YdV6U7n81myeVypNNphoaG6O7ujvTPpUEcVLYxtkYzDQM/RfZJ94RlWWSzWRYWFtjYUIMOw3gN7oXKGvXt7e309/fT19cXud5OAy0BLwXmKkE3gceAG3VWFXQrKyssLS2Ry+WwLAvTNLVOKQ0S27ZxHIeWlhZ6enro6+uTbv3x/Ri4BXAqzYwDXESCXrdCocDy8jLZbJb19XVc1yUWi0mrVKfKNXy5XGZubo6FhQVSqRR9fX309PTIzjBHcxGV7R1TVB8D7tNSTsDYtk0ul2NpaYnV1VVKpZK03h4xTbP6vH19fZ3V1VWmp6fp6uqit7eX7u5ueR5fu8cqn2wP+kUNhQTK2toa2WyW5eVlCoUCgLTeDVRp5V3XZWlpiaWlJVpbW6tdexlxd6hqpo1tUwuvBn4EyE9vG8dxqjfWVldXq3fOpVXRw3EcbNsmHo/T0dFBf38/vb298vu40jpwE/Az2Bn0GPA48HN66vKXUqnE/Pw8S0tLbGxsSNfcZ1zXxXEcHMchlUrR39/PwMCA9K5e9K/AzYANO7vuNqqpj3TQbdtmbm6O+fl5isWidM19yjCMate+WCySyWS4fPkyAwMDjIyMyJuyyrJd+Z/dD3fPA29tajk+sri4yPT0NJubmxLwADFNk2QySblcZmpqiqWlJcbGxqI+rv789v8xdi3/cwvwAyI2Qq7SImSzWbn+DoHKM/ne3l5OnToVqAU8POIAL2fbXffdQW8DngBON7cufXK5HJOTk4Fd7EHsr1Qq0dLSwpkzZ+js7NRdTjM9B9wAbFb+YHfTtcm2d4GwW1hY4KmnnqJcLkvIQyiRSFAqlbh48SILCwu6y2mmx9gWcti7i/5Ic2rRa2FhgcnJyeoNHRFOlUlEk5OTUQr7FRneK+iPAqHeXGt5ebkacpkxFX6V0XaTk5OsrKzoLqfRSqgM77BX0J8GLjS6Gl1KpZIvtjYSzWWaJoZhkMlksG378C8IrguoDO+wV9D3fEcIi8uXL1cfn4loicVirK+vMzsb6pXTHmWPHvl+z5H+X0NL0aQy2k3mhkdXPB5nfn4+zFs/75nd/YL+T0Do9sW9fPlydZ64iCbTNLEsi/n5ed2lNMIcKrtX2O+MzwIPN6wcDWzbZnFxUbrsglgsxtLSEo7j6C7Faw+zzx4NBzVtX2xMLXosLy9TLBalNReYpsnGxkYY78Dvm9mDzvrzhKj7ns3KZjTiRYZhsLi4qLsML82xa3z7dgcFfRn4luflaFAsFlldXZVuu6iKxWLk83ksy9Jdile+hcrsng7rx37W21r0yOfzlEoleW4uqgzDoFQqhan7fmBWDwv6t4HnPStFk+XlZQm5uIJhGGHZ4vl5VFb3dVjQi8AXvKpGB8uyWF9fl267uIJpmtXFPQPuCxyy9Xktt6D/EgjshUyxWKRYLEqLLq5gGAbFYjHo1+kWKqMHqiXoFzjgbp7fdXR0MDg4GPRfpmiAUqnE0NAQqVRKdynHcZ4a5qbU+lD508erRR/DMBgfHyedTle3/xGiVCrR2dnJyZMng97bqymbtQb9q8ALR69Fr1gsxtVXX008Hg/jaChRJ9u2SSaTnDlzJugDqF5AZfNQtX6XG8ADRy7HB1pbWzlz5gyO47Br+SwRIZU3+quvvprW1lbN1RzbA6hsHqqet7O/AFaPUo1fdHd3Mz4+Ll34CLNtm1OnToVhDblV6hjnUk/Qnwc+X281fjM8PMzIyIjcnIugYrHI2NgYg4ODukvxwudRi0DWpN4LlP/F1u6MQTY+Ps7Q0FAYnp+KGpVKJYaHhxkbG9Ndihcc4H/X8wX1Bv3HwIN1fo0vTUxM0NPTIy17BFiWRX9/PxMTE7pL8cqDqH0Sa7Z7Xfda3Iza5CHwQ81s2+app54in8/Lcs8hVSqV6Orq4tprrw3L6EgbtTnD4/V80VGeLTwOfPkIX+c7sViM6667jq6uLunGh1AIQw4qe3WFHI7WooPauun7hKBVB9WyP/300+RyuShu3xNKlmXR3d0dtpDbwCs4wiYrRx0t8BghuVYH1bJfe+21DAwMSMseApZlMTQ0xHXXXRemkIPK3JF2Ujpqiw6qVf/hUb/YryYnJ7l8+TKJRCLoQyMjx3Xd6t3106dDuX3grRwx6McZ//cYAR8tt5eJiQmuuuoqyuWyDJcNEMdxKJVKnDp1Kqwhf4Bj7It4nBYdYBz4KdBxnBfxo8uXL5PJZADC1v0LncrOKxMTE/T392uupiHWgJcCmaO+wHFH9GeAjx/zNXxpaGiIs2fPEo/H5brdx0qlEolEgrNnz4Y15KAyduSQw/FbdIA08K+o1j10isUik5OT5HI5uW73kcr1eE9PDxMTE2F+WpIBfo5jzjPxIugA7yQkC0nuxXVdpqammJmZwTAM6cprVumqj4yMMDY2FvY333fjQba8CrqB2tztNi9ezK+y2SyZTIZisSgj6TQplUq0tLRw+vRpuru7dZfTaN8GbgeOHVKvgg7wMtTQ2ND2oUA9o81kMiwtLRGLxYK+cEFgOI6DbdsMDAxw1VVXhbmrXmGhhrr+xIsX8/Is/QkhvTG3XTKZ5JprruHMmTPVG3WykEXjVK7F4/F49ecegZCDypInIQdvW3SAFtQgmhu8fFG/siyLS5cuVbf2ke2YvVVZIGRgYICxsbGoBBzgCdTgmAOXcK6H10EHuAP4ptcv6me5XI7p6enqtk/SnT8ex3Eol8t0dnZy1VVXhWE1mHrdice7GTci6ACfAn69ES/sV67rMj8/z8zMDIVCgXg8LoGvUyXgbW1tjIyMMDg4GPY76nv5c+B9Xr9oo4KeQs1ui0QXfjvLspifn2dhYUECX6NKwFtaWhgcHGR4eDiql0HPoOaQrHn9wo0KOsCrgO+iHr1FTiXw8/PzFItFCfwedgd8cHAwStfhu7nAvwW+14gXb2TQAT4CfLCRB/C7SuAXFxcpFAqYphn5ATe2beM4DqlUit7e3qgHvOKjwO816sUbHfQY8PeomwuRZts2i4uLLC4usra2huu6kbpxV3kObhgG6XSagYEBent7I/+mt+WbwC+jFpZoiEYHHWAUNZBmpNEHCorV1VUWFxdZXl7GsqzqsNqw3XhyXRfbtnFdl5aWFrq7u+nv7yedTusuzU9mUQNjpht5kGYEHeD1wD8040BBYlkW+Xye5eVlVldXq6E3TTOwLb3jONXdcJLJJOl0mp6eHrq6umTY8N5+CfhGow/SrKCDXK8fqFgsks/nyeVyrK+vUywWcV23Gnq/tvau61bDbRgGLS0ttLe3093dTWdnJy0tLbpL9LOGXpdv18ygx1ArWN7VrAMGVblcZn19vRr6zc1NyuUyrutWW3zDMJoeftd1q8Gu1BKPx2lrayOdTtPZ2Ul7e3tUH43V66vAvTTwuny7ZgYdoAf4Z+CaZh406IrFIoVCgbW1NdbX1ykUCliWVW1JgWrwd78B1PpmsP08qAS68lF5nXg8TjKZrLbaHR0dtLa2Sqtdv2eAVwLLzTpgs4MOapbbeSD0cwwbxXEcLMvCsqzqm0CxWKRUKmHbNqVSqdrqVu50H6TyBKDSW0gkEsRiMRKJBC0tLbS2ttLa2koymSSRSAT2/oFP5IBzeDhhpRY6gg7wRuAhQrIuvJ9UZntVWvtSqVRT0JPJ5I6g+/WeQMDZwD3A15p9YF1BBzWe95O6Di6EBr+BmgfSdDr7YJ8CPqbx+EI008fQFHLQ26KDGgf/aeA9OosQosE+A7wXD5aEOirdQa94CLhbdxFCNMBXUNflWvnl9uk7UHfihQiT86hzWzu/BD0PvAm1kqwQYfAo6pzOa64D8E/QQS1QfzfSsovgO486l4+16YKX/BR0UD+YNyFhF8F1HnUO+ybk4L+gg/oB3YWEXQTPedS566uQgz+DDmrNrLuQa3YRHI+izlnP13vzgl+DDuoHdjfwJd2FCHGIL6HOVV+GHPwddFBdoLegBhwI4UefQZ2jvuuub+f3oFf8GvBh3UUIscuHUeem7/llZFyt3g/8KSArGwidSsAHgE/oLqRWQQs6qBsefwVEbp8e4Qt54G2oFWICI4hBB7gJ+GvgrO5CRKRcBH4V+JHuQuoVlGv03X4EvAZ4UHchIjIeRJ1zgQs5BDfoAEvAf0CtLitEI30Eda4t6S7kqILadd/tDah57bJJhPDSLGoe+dd1F3JcQW7Rt/s6alPHpq/FJULra6hzKvAhh/AEHeAF1OikPwTKmmsRwVVGnUN3o86pUAhL132316Cecd6ouxARKD9GjdX4ju5CvBamFn2776DCLqvMilp9EnXOhC7kEN4WfbvXAn8C3Kq7EOFLPwR+G3hEdyGNFNYWfbtHgF8A/ggoaK5F+EcBdU78AiEPOUSjRd/uZuCPgTt0FyK0ehj4HeBx3YU0SxRa9O0eB+4E3g5kNNcimi+D+t3fSYRCDtFr0bfrBX4T+C1kgkzY5VGzHv8MyGquRYsoB73iDPC7qN1iotbDCTsHtTDEx4BnNdeilQT9RS9HzTF+K7LLa9DZwN8CHwd+oLkWX5CgX6kS+F9BWvigcYC/QQJ+BQn6/l6Oun6/Dwm83znAF1DX4RLwPUjQD/fzwLtQd2u7NdcidsoBnwc+C/yL5lp8TYJeu1OoDfPuB07rLSXyngMeAD4HPK+3lGCQoNevEzX//V3A64CE3nIiowR8C9V6fx2fbF4YFBL043kpaqHAtwDXaK4lrJ4BvohaEPSnmmsJLAm6N9qA21Ch/0VgVG85gTcN/CMq3N8GNvWWE3wSdO/1o0J/Dyr0Y3rLCYwpVLgfQoV7UW854SJBb6w+1ESaN6Gmy74E2XyiogxcQG1O+HeoseeBXXzR7yTozWMANwDntj5uInrX9c+glks+v/XxBCAnYBNI0PVJoTageDUq+GdRj+06dBbloTXUY7CLqFB/b+vzDZ1FRZUE3T9MYALV6l8H3ILq6o8AAxrrqsUCamnkJ4HHgKdQrfUkatSa0EyC7m8GKujDwPjWx5mtPxtEvQHEUVNuk0Ar3t0DKKNWYbFQUzvLqEDPo0L9LGp+dwaY2/ozOZl8SoIebKNAy9Z/U6gbfie2/u4e6p9nn0fd9QaYQS2xtIF63FXc+q8IoP8PrYdvv7dhtrUAAAAASUVORK5CYII="; + $mime = "image/jpg"; + + $prof = $this->db->fetchRow("SELECT Mime,Image FROM app_operator_profile WHERE UserID=? AND Image IS NOT NULL", [$this->app->user()->id()]); + if ($prof) { + $gambar = base64_encode($prof['Image']); + $mime = $prof['Mime']; + } + $this->app->json([ 'src' => 'data:'.$mime.';base64,'.$gambar ]); + } + + public function index() { + $auser = $this->db->fetchRow("SELECT * FROM app_operator WHERE UserID=?", [$this->app->user()->id()]); + $form = new Form($this->app); + $tnama = $form->textbox("_", "Nama", $auser['Nama'], true, false, "text", "nama pengguna"); + $tposisi = $form->textbox("_", "Posisi", $auser['Posisi'], true, false, "text", "posisi pengguna"); + $temail = $form->textbox("_", "Email", $auser['Email'], true, false, "text", "email pengguna"); + $thp = $form->textbox("_", "HP", $auser['HP'], true, false, "text", "hp pengguna"); + + $ajson['html'] = ' +
+
+ +
Ukuran file max 20MB ( png / jpg / gif ) +
+
+
+ '.$tnama.' +
+
+ '.$tposisi.' +
+
+ '.$temail.' +
+
+ '.$thp.' +
+
+
'; + $this->app->json($ajson); + } +} diff --git a/app/Controller/System/SuperController.php b/app/Controller/System/SuperController.php new file mode 100644 index 0000000..9d659df --- /dev/null +++ b/app/Controller/System/SuperController.php @@ -0,0 +1,61 @@ +app = $app; + $this->db = $db; + } + + public function approve() { + $this->db->runQuery('UPDATE app_auth SET Auth=1,SuperID=? WHERE AuthID=?', [$this->app->user()->id(), Param::Get("AuthID",0)]); + } + + public function table_detail() { + $obj = new Table($this->app); + $obj->set_table('(SELECT AuthID,UserID,Kode,DATE_FORMAT(Tanggal,"%d-%m-%Y %H:%i:%s") Tanggal,REQ,Catatan FROM app_auth WHERE Auth=0) A LEFT JOIN app_operator O ON (A.UserID=O.UserID) LEFT JOIN app_menu M ON (A.Kode=M.Kode)', 'A.*,O.Nama Nama_User,M.Judul'); + $obj->add_field("AuthID", "ID", "hid"); + $obj->add_field("Nama_User", "User ID", "l"); + $obj->add_field("Tanggal", "Tanggal", "c"); + $obj->add_field("Judul", "Menu Aplikasi", "l"); + $obj->add_field("Catatan", "Informasi Transaksi", "awr"); + $obj->add_field("REQ", "Kode Request", "l"); + $obj->add_row_btn("unlock2", "Proses", "SuperJS.detail_select"); + $ajson[] = $obj->json_table("divSuper"); + $this->app->json($ajson); + } + + public function index() { + $this->app->json([ + 'html' => ' +
+
Supervisi Hak Akses
 
+
' + ]); + } +} diff --git a/app/Controller/Table/Gel/GajiController.php b/app/Controller/Table/Gel/GajiController.php new file mode 100644 index 0000000..a6691b5 --- /dev/null +++ b/app/Controller/Table/Gel/GajiController.php @@ -0,0 +1,83 @@ +app = $app; + $this->db = $db; + $this->mode_detail = Param::Get("mode_detail", ""); + $this->id_reg = Param::Int("REG_ID", $session->get('WEB_APP')['REG_ID']); + } + + public function form_gaji() { + if ( $this->mode_detail == "save" ) { + $sql = new SQL($this->app); + $sql->set_table("gel_config"); + $sql->add_param("LEMBUR"); + $sql->add_param("BONUS1"); + $sql->add_param("BONUS2"); + $sql->add_where("REG_ID"); + $sql->UpdateDB(); + $this->mode_detail = "view"; + } + + $atabel = [ 'REG_ID'=>0, 'LEMBUR'=>0, 'BONUS1'=>0, 'BONUS2'=>0 ]; + if ($this->id_reg > 0) { + $atabel = $this->db->fetchRow("SELECT * FROM gel_config WHERE REG_ID=?", [$this->id_reg]); + } + + $benable = ($this->mode_detail === "update") ? true : false; + $form = new Form($this->app); + $tlembur = $form->textbox("_", "LEMBUR", $atabel['LEMBUR'], $benable, false, "double", "nilai lembur harian"); + $tbonus1 = $form->textbox("_", "BONUS1", $atabel['BONUS1'], $benable, false, "double", "nilai bonus mingguan"); + $tbonus2 = $form->textbox("_", "BONUS2", $atabel['BONUS2'], $benable, false, "double", "nilai bonus bulanan"); + $ajson['html'] = ' +
+ +
'.$tlembur.'
+
+
+ +
'.$tbonus1.'
+
+
+ +
'.$tbonus2.'
+
+ + '; + $this->app->json($ajson); + } + + public function index() { + $this->app->json(['html' => '
 
' ]); + } +} diff --git a/app/Controller/Table/Gel/GrupController.php b/app/Controller/Table/Gel/GrupController.php new file mode 100644 index 0000000..80c2c32 --- /dev/null +++ b/app/Controller/Table/Gel/GrupController.php @@ -0,0 +1,105 @@ +app = $app; + $this->db = $db; + $this->mode_detail = Param::Get("mode_detail", ""); + $this->id_grup = Param::Int("Grup_RekID", 0); + } + + public function table_detail() { + if (in_array($this->mode_detail, ["insert","update","delete"])) { + $sql = new SQL($this->app); + $sql->set_table("gel_acc_grup"); + $sql->add_param("Nama_Grup"); + $sql->add_param("Aktif"); + $sql->add_param_userid(); + $sql->add_where("Grup_RekID"); + + if ($this->mode_detail === "insert") { + $sql->InsertDB(); + } else if ($this->mode_detail === "update") { + $sql->UpdateDB(); + } else if ($this->mode_detail === "delete") { + $sql->DeleteDB(); + } + } + + $tcari = Param::Get("Cari_Rek"); + $tsql = ''; $asql = []; + if (!empty($tcari)) { + $tsql = 'Nama_Grup LIKE ?'; + $asql[] = '%'. $tcari .'%'; + } + + $obj = new Table($this->app); + $obj->set_table("gel_acc_grup", "*", $tsql, $asql); + $obj->add_field("Grup_RekID", "ID", "hid"); + $obj->add_field("Nama_Grup", "Nama Grup Rekening", "awr"); + $obj->add_field("Aktif", "Aktif", "c", "checkbox"); + $obj->set_field_order("Nama_Grup", "A"); + $obj->add_row_btn("clipboard", "Ubah", "RekGrupJS.detail_ubah"); + $obj->add_row_btn("trash", "Hapus", "RekGrupJS.detail_hapus"); + $obj->set_func_btn("RekGrupJS.detail_tambah", "+ Grup Rekening"); + $this->app->json([ $obj->json_table("divDetail") ]); + } + + public function form_grup() { + $atabel = [ 'Grup_RekID'=>0, 'Nama_Grup'=>"", 'Aktif'=>1 ]; + if ($this->id_grup > 0) { + $atabel = $this->db->fetchRow("SELECT * FROM gel_acc_Grup WHERE Grup_RekID=?", [$this->id_grup]); + } + + $form = new Form($this->app); + $tnama = $form->textbox("_", "Nama_Grup", $atabel['Nama_Grup'], true, true, "text", "nama grup rekening"); + $taktif = $form->radio("_", "Aktif", $atabel['Aktif'], true, false, [1=>"Aktif",0=>"Tidak"]); + $ajson['html'] = ' +
+ +
'.$tnama.'
+
+
+ +
'.$taktif.'
+
+ + '; + $this->app->json($ajson); + } + + public function index() { + $this->app->json(['html' => ' +
Daftar Grup Rekening
 
' + ]); + } +} diff --git a/app/Controller/Table/Gel/KaryawanController.php b/app/Controller/Table/Gel/KaryawanController.php new file mode 100644 index 0000000..2b9ea0c --- /dev/null +++ b/app/Controller/Table/Gel/KaryawanController.php @@ -0,0 +1,126 @@ +app = $app; + $this->db = $db; + $this->mode_detail = Param::Get("mode_detail", ""); + $this->id_karya = Param::Int("KaryaID", 0); + } + + public function table_detail() { + if (in_array($this->mode_detail, ["insert","update","delete"])) { + $sql = new SQL($this->app); + $sql->set_table("para_karyawan"); + $sql->add_param("Nama_Karya"); + $sql->add_param("Gaji_Harian"); + $sql->add_param_date("Tgl_Masuk"); + $sql->add_param_date("Tgl_Keluar"); + $sql->add_param("Aktif"); + $sql->add_param_userid(); + $sql->add_where("KaryaID"); + + if ($this->mode_detail === "insert") { + $sql->InsertDB(); + } else if ($this->mode_detail === "update") { + $sql->UpdateDB(); + } else if ($this->mode_detail === "delete") { + $sql->DeleteDB(); + } + } + + $tcari = Param::Get("Cari_Karya"); + $tsql = ''; $asql = []; + if (!empty($tcari)) { + $tsql = 'Nama_Karya LIKE ?'; + $asql[] = '%'. $tcari .'%'; + } + + $obj = new Table($this->app); + $obj->set_table("para_karyawan", "*", $tsql, $asql); + $obj->add_field("KaryaID", "ID", "hid"); + $obj->add_field("Nama_Karya", "Nama Karyawan", "awr"); + $obj->add_field("Gaji_Harian", "Gaji Harian", "r", "rupiah"); + $obj->add_field("Tgl_Masuk", "Tgl. Masuk", "c", "sqltgl"); + $obj->add_field("Tgl_Keluar", "Tgl. Keluar", "c", "sqltgl"); + $obj->add_field("Aktif", "Aktif", "c", "checkbox"); + $obj->set_field_order("Nama_Karya", "A"); + $obj->add_row_btn("clipboard", "Ubah", "KaryawanJS.detail_ubah"); + $obj->add_row_btn("trash", "Hapus", "KaryawanJS.detail_hapus"); + $obj->set_func_btn("KaryawanJS.detail_tambah", "+ Karyawan"); + $this->app->json([ $obj->json_table("divDetail") ]); + } + + public function form_karya() { + $atabel = [ 'KaryaID'=>0, 'Nama_Karya'=>"", 'Gaji_Harian'=>0, 'Tgl_Masuk'=>tgl_ymd(), 'Tgl_Keluar'=>'0000-00-00', 'Aktif'=>1 ]; + if ($this->id_karya > 0) { + $atabel = $this->db->fetchRow("SELECT * FROM para_karyawan WHERE KaryaID=?", [$this->id_karya]); + } + + $form = new Form($this->app); + $tnama = $form->textbox("_", "Nama_Karya", $atabel['Nama_Karya'], true, true, "text", "nama karyawan"); + $tgaji = $form->textbox("_", "Gaji_Harian", $atabel['Gaji_Harian'], true, true, "double", "gaji harian"); + $tmasuk = $form->datebox("_", "Tgl_Masuk", $atabel['Tgl_Masuk'], true, false); + $tkeluar = $form->datebox("_", "Tgl_Keluar", $atabel['Tgl_Keluar'], true, false); + $taktif = $form->radio("_", "Aktif", $atabel['Aktif'], true, true, ['1'=>"Aktif",'0'=>"Tidak"]); + $ajson['html'] = ' +
+ +
'.$tnama.'
+
+
+ +
'.$tgaji.'
+
+
+ +
'.$tmasuk.'
+
+
+ +
'.$tkeluar.'
+
+
+ +
'.$taktif.'
+
+ + '; + $this->app->json($ajson); + } + + public function index() { + $this->app->json(['html' => ' +
Daftar Karyawan
 
' + ]); + } +} diff --git a/app/Controller/Table/Gel/RekController.php b/app/Controller/Table/Gel/RekController.php new file mode 100644 index 0000000..ab3d659 --- /dev/null +++ b/app/Controller/Table/Gel/RekController.php @@ -0,0 +1,210 @@ +app = $app; + $this->db = $db; + $this->reg_name = (string) $session->get('WEB_APP')['REG_NAME']; + $this->max_level = (int) $session->get('APP_GEL')['MAX_LEVEL'] ?? 5; + $this->mode_detail = Param::Get("mode_detail", ""); + $this->kode_rek = Param::Get("Kode_Rek", ""); + } + + public function table_detail() { + if (in_array($this->mode_detail, ["insert","update","delete"])) { + $sql = new SQL($this->app); + $sql->set_table("gel_acc"); + $sql->add_param("Kode_Induk"); + $sql->add_param("Nama_Rek"); + $sql->add_param("Grup_RekID"); + $sql->add_param("Level"); + $sql->add_param("Mode"); + $sql->add_param("Kas_Rek"); + $sql->add_param("Aktif"); + $sql->add_param_userid(); + $sql->add_where("Kode_Rek"); + + if ($this->mode_detail === "insert") { + $sql->add_param("Kode_Rek"); + $sql->InsertDB(); + } else if ($this->mode_detail === "update") { + $sql->UpdateDB(); + } else if ($this->mode_detail === "delete") { + $sql->DeleteDB(); + } + } + + $tcari = Param::Get("Cari_Rek"); + $tsql = ''; $asql = []; + if (!empty($tcari)) { + $tsql = 'CONCAT(A.Kode_Rek,A.Nama_Rek) LIKE ?'; + $asql[] = '%'. $tcari .'%'; + } + + $obj = new Table($this->app); + $obj->set_table("gel_acc A LEFT JOIN gel_acc_grup G ON (A.Grup_RekID=G.Grup_RekID)", "A.*,G.Nama_Grup", $tsql, $asql); + $obj->add_field("Kode_Rek", "Kode", "c"); + $obj->add_field("Nama_Rek", "Nama Rekening", "awr"); + $obj->add_field("Nama_Grup", "Grup", "l"); + $obj->add_field("Level", "Level", "c"); + $obj->add_field("Mode", "Mode", "c"); + $obj->add_field("Aktif", "Aktif", "c", "checkbox"); + $obj->set_row_color("Mode", "G", "rblue"); + $obj->set_field_order("Kode_Rek", "A"); + $obj->add_row_btn("clipboard", "Ubah", "RekJS.detail_ubah"); + $obj->add_row_btn("trash", "Hapus", "RekJS.detail_hapus"); + $obj->set_func_btn("RekJS.detail_tambah", "+ Rekening"); + $this->app->json([ $obj->json_table("divDetail") ]); + } + + public function form_rek() { + $atabel = [ 'Kode_Rek'=>0, 'Nama_Rek'=>"", 'Kode_Induk'=>0, 'Grup_RekID'=>0, 'Level'=>1, 'Mode'=>"D", 'Kas_Rek'=>0, 'Aktif'=>1 ]; + if (!empty($this->kode_rek)) { + $atabel = $this->db->fetchRow("SELECT * FROM gel_acc WHERE Kode_Rek=?", [$this->kode_rek]); + } + + $form = new Form($this->app); + $tgrup = $form->option_db("_", "Grup_RekID", $atabel['Grup_RekID'], true, false, "gel_acc_grup", ["Grup_RekID","Nama_Grup"], "Aktif=1 ORDER BY Grup_RekID"); + $tinduk = $form->option_db("_", "Kode_Induk", $atabel['Kode_Induk'], true, false, "gel_acc", ["Kode_Rek","Nama_Rek"], "Mode='G' AND Aktif=1 ORDER BY Kode_Rek", [0,"TOP LEVEL"]); + $tkode = $form->textbox("_", "Kode_Rek", $atabel['Kode_Rek'], true, false, "text", "kode rekening"); + $tnama = $form->textbox("_", "Nama_Rek", $atabel['Nama_Rek'], true, true, "text", "nama rekening"); + $tlevel = $form->option("_", "Level", $atabel['Level'], true, false, $this->Level_Array()); + $tmode = $form->radio("_", "Mode", $atabel['Mode'], true, true, ['G'=>"Grup",'D'=>"Detail"]); + $tkas_rek = $form->radio("_", "Kas_Rek", $atabel['Kas_Rek'], true, true, ['1'=>"Ya",'0'=>"Tidak"]); + $taktif = $form->radio("_", "Aktif", $atabel['Aktif'], true, true, ['1'=>"Aktif",'0'=>"Tidak"]); + $ajson['html'] = ' +
+ +
'.$tgrup.'
+ +
'.$taktif.'
+
+
+ +
'.$tkode.'
+ +
'.$tkas_rek.Invesa::Form_Info("Rekening untuk Transaksi Penerimaan / Pembayaran.").'
+
+
+ +
'.$tinduk.'
+
+
+ +
'.$tnama.'
+
+
+ +
'.$tlevel.'
+ +
'.$tmode.'
+
+ '; + $this->app->json($ajson); + } + + public function detail_print() { + $form = new Form($this->app); + $tgrup = $form->option_db("_", "Grup_RekID", 0, true, false, "gel_acc_grup", ["Grup_RekID","Nama_Grup"], "Aktif=1 ORDER BY Grup_RekID", [0, "SEMUA GRUP"]); + $tlevel = $form->option("_", "Level", $this->max_level, true, false, $this->Level_Array()); + $ttgl = $form->datebox("_", "Tgl_Cetak", tgl_ymd(), true, false); + $ajson['html'] = ' +
+ +
'.$tgrup.'
+
+
+ +
'.$tlevel.'
+
+
+ +
'.$ttgl.'
+
'; + $this->app->json($ajson); + } + + public function print_rek() { + $id_grup = Param::Get("Grup_RekID", 0); + $level = Param::Get("Level", 0); + $nama_grup = ""; + if ($id_grup > 0) $nama_grup = $this->db->fetchField("SELECT Nama_Grup FROM gel_acc_grup WHERE Grup_RekID=?", [$id_grup]); + + // generate report header + $tglheader = "Tanggal Cetak : ".Param::Get("Tgl_Cetak"); + $tsql = ''; $asql = []; + if ($id_grup > 0) { $tsql .= " AND Grup_RekID=?"; $asql[] = $id_grup; } + if ($level > 0) { $tsql .= " AND Level<=?"; $asql[] = $level; } + $tsql = (strlen($tsql) > 0) ? ' WHERE '.substr($tsql, 4) : ''; + + // query data laporan + $stat = $this->db->runQuery("SELECT A.*,G.Nama_Grup FROM (SELECT * FROM gel_acc".$tsql.") A LEFT JOIN gel_acc_grup G ON (A.Grup_RekID=G.Grup_RekID) ORDER BY A.Kode_Rek ASC", $asql); + + $pre = new PrintHTML($this->app); + $pre->add_title([strtoupper($this->reg_name), "Laporan Daftar Rekening", $tglheader]); + + $pre->add_field("No",10,"C"); + $pre->add_field("Kode",20, "C"); + $pre->add_field("Nama Rekening",80, "L"); + $pre->add_field("Grup",50, "L"); + $pre->add_field("Level",20, "C"); + $pre->add_field("Mode",20, "C"); + + if ($id_grup > 0) $pre->add_sub_title("Grup Rekening : ".$nama_grup); + + $pre->show_titles(); + $pre->show_headers(); + + $nomor = 1; $strpad = "   "; + while ($row = $stat->fetch(SimplePdo::FETCH_ASSOC)) { + $pre->add_row([ $nomor++, $row['Kode_Rek'], str_repeat($strpad, (int) $row['Level']-1).$row['Nama_Rek'], $row['Nama_Grup'], $row['Level'], $row['Mode'] ]); + } + $pre->add_stamp(0, true); + $pre->show(); + } + + private function Level_Array($item = -1) { + $_alevel = []; for ($i=1; $i<=$this->max_level; $i++) $_alevel[$i] = "Level ".$i; + return ($item == -1) ? $_alevel : $_alevel[$item]; + } + + public function index() { + $this->app->json(['html' => ' +
Daftar Rekening
 
' + ]); + } +} diff --git a/app/Controller/Table/Member/MemberController.php b/app/Controller/Table/Member/MemberController.php new file mode 100644 index 0000000..94b643a --- /dev/null +++ b/app/Controller/Table/Member/MemberController.php @@ -0,0 +1,215 @@ +app = $app; + $this->db = $db; + $this->reg_name = (string) $session->get('WEB_APP')['REG_NAME']; + $this->mode_detail = Param::Get("mode_detail", ""); + $this->id_member = (int) Param::Get("MemberID", 0); + } + + public function table_detail() { + if (in_array($this->mode_detail, ["insert","update","delete"])) { + $sql = new SQL($this->app); + $sql->set_table("para_member"); + $sql->add_param("Grup_MemberID"); + $sql->add_param("Kode_Member"); + $sql->add_param("Nama_Member"); + $sql->add_param("Alamat_Member"); + $sql->add_param("Kota_Member"); + $sql->add_param("Telp_Member"); + $sql->add_param("KTP_Member"); + $sql->add_param_date("Tgl_Lahir"); + $sql->add_param_date("Tgl_Daftar"); + $sql->add_param("IM"); + $sql->add_param("Aktif"); + $sql->add_param_userid(); + $sql->add_where("MemberID"); + + if ($this->mode_detail === "insert") { + $sql->InsertDB(); + } else if ($this->mode_detail === "update") { + $sql->UpdateDB(); + } else if ($this->mode_detail === "delete") { + $sql->DeleteDB(); + } + } + + $tcari = Param::Get("Cari_Member"); + $tsql = ''; $asql = []; + if (!empty($tcari)) { + $tsql = 'CONCAT(Kode_Member,Nama_Member,Telp_Member) LIKE ?'; + $asql[] = '%'. $tcari .'%'; + } + + $obj = new Table($this->app); + $obj->set_table("para_member", "*", $tsql, $asql); + $obj->add_field("MemberID", "ID", "hid"); + $obj->add_field("Kode_Member", "Kode / ID", "c"); + $obj->add_field("Nama_Member", "Nama Member", "awr"); + $obj->add_field("Alamat_Member", "Alamat", "awr"); + $obj->add_field("Telp_Member", "No. Telp", "l"); + $obj->add_field("IM", "Member", "c", "checkbox"); + $obj->add_field("Aktif", "Aktif", "c", "checkbox"); + $obj->set_field_order("Kode_Member", "A"); + $obj->add_row_btn("clipboard", "Ubah", "MemberJS.detail_ubah"); + $obj->add_row_btn("trash", "Hapus", "MemberJS.detail_hapus"); + $obj->set_func_btn("MemberJS.detail_tambah", "+ Member"); + $this->app->json([ $obj->db_table("divDetail") ]); + } + + public function form_member() { + $atabel = Invesa::A_Member_Member(); + if ($this->id_member > 0) { + $atabel = $this->db->fetchRow("SELECT * FROM para_member WHERE MemberID=?", [$this->id_member]); + } + + $form = new Form($this->app); + $tgrup = $form->option_db("_", "Grup_MemberID", $atabel['Grup_MemberID'], true, false, "para_member_grup", ["Grup_MemberID","Nama_Grup"], "Aktif=1 ORDER BY Nama_Grup"); + $tkode = $form->textbox("_", "Kode_Member", $atabel['Kode_Member'], true, false, "text", "kode member"); + $tnama = $form->textbox("_", "Nama_Member", $atabel['Nama_Member'], true, true, "text", "nama member"); + $talamat = $form->textarea("_", "Alamat_Member", $atabel['Alamat_Member'], true, true, 2); + $tkota = $form->textbox("_", "Kota_Member", $atabel['Kota_Member'], true, true, "text", "kota member"); + $ttelp = $form->textbox("_", "Telp_Member", $atabel['Telp_Member'], true, true, "text", "telp member"); + $tktp = $form->textbox("_", "KTP_Member", $atabel['KTP_Member'], true, true, "text", "ktp member"); + $tlahir = $form->datebox("_", "Tgl_Lahir", $atabel['Tgl_Lahir'], true, true); + $tdaftar = $form->datebox("_", "Tgl_Daftar", $atabel['Tgl_Daftar'], true, true); + $tim = $form->checkbox("_", "IM", $atabel['IM'], true, true, [1,0]); + $taktif = $form->radio("_", "Aktif", $atabel['Aktif'], true, true, [1=>"Ya",0=>"Tidak"]); + $ajson['html'] = ' +
+ +
'.$tgrup.'
+ +
'.$taktif.'
Member ?
'.$tim.'
+
+
+ +
'.$tkode.Invesa::Form_Info("Kode / ID Barcode Member (Scan dari Kartu Member). Contoh : 17000017.").'
+ +
'.$tdaftar.'
+
+
+ +
'.$tktp.'
+ +
'.$tlahir.'
+
+
+ +
'.$tnama.'
+
+
+ +
'.$talamat.'
+
+
+ +
'.$tkota.'
+ +
'.$ttelp.'
+
+ + '; + $this->app->json($ajson); + } + + public function detail_print() { + $form = new Form($this->app); + $tgrup = $form->option_db("_", "Grup_MemberID", 0, true, false, "para_member_grup", ["Grup_MemberID","Nama_Grup"], "Aktif=1 ORDER BY Nama_Grup", [0,"SEMUA GRUP MEMBER"]); + $taktif = $form->radio("_", "Aktif", 9, true, true, [9=>"Semua",'1'=>"Ya",'0'=>"Tidak"]); + $ttgl = $form->datebox("_", "Tgl_Cetak", tgl_ymd(), true, false); + $ajson['html'] = ' +
+ +
'.$tgrup.'
+
+
+ +
'.$taktif.'
+
+
+ +
'.$ttgl.'
+
'; + $this->app->json($ajson); + } + + public function print_member() { + $id_grup = Param::Get("Grup_MemberID", 0); + $aktif = Param::Get("Aktif", 9); + $nama_grup = ""; $nama_aktif = ($aktif==0) ? "Tidak Aktif" : "Aktif"; + if ($id_grup > 0) $nama_grup = $this->db->fetchField("SELECT Nama_Grup FROM para_member_grup WHERE Grup_MemberID=?", [$id_grup]); + + // generate report header + $tglheader = "Tanggal Cetak : ".Param::Get("Tgl_Cetak"); + $tsql = ''; $asql = []; + if ($id_grup > 0) { $tsql .= " AND Grup_MemberID=?"; $asql[] = $id_grup; } + if ($aktif < 9) { $tsql .= " AND Aktif=?"; $asql[] = $aktif; } + $tsql = (strlen($tsql) > 0) ? ' WHERE '.substr($tsql, 4) : ''; + + // query data laporan + $stat = $this->db->runQuery("SELECT * FROM para_member".$tsql." ORDER BY Nama_Member", $asql); + + $pre = new PrintHTML($this->app); + $pre->add_title([strtoupper($this->reg_name), "Laporan Daftar Member", $tglheader]); + + $pre->add_field("No",10,"C"); + $pre->add_field("Nama Member",80, "L"); + $pre->add_field("Alamat",12, "L"); + $pre->add_field("Kota",12, "L"); + + if ($id_grup > 0) $pre->add_sub_title("Grup Member : ".$nama_grup); + if ($aktif < 9) $pre->add_sub_title("Status Aktif : ".$nama_aktif); + + $pre->show_titles(); + $pre->show_headers(); + + $nomor = 1; + while ($row = $stat->fetch(SimplePdo::FETCH_ASSOC)) { + $pre->add_row([ $nomor++, $row['Nama_Member'], $row['Alamat_Member'], $row['Kota_Member'] ]); + } + $pre->add_stamp(0, true); + $pre->show(); + } + + public function index() { + $this->app->json(['html' => ' +
Daftar Member
 
' + ]); + } +} diff --git a/app/Controller/Table/Member/MembergrupController.php b/app/Controller/Table/Member/MembergrupController.php new file mode 100644 index 0000000..127a87f --- /dev/null +++ b/app/Controller/Table/Member/MembergrupController.php @@ -0,0 +1,115 @@ +app = $app; + $this->db = $db; + $this->mode_detail = Param::Get("mode_detail", ""); + $this->id_grup = (int) Param::Get("Grup_MemberID", 0); + } + + public function table_detail() { + if (in_array($this->mode_detail, ["insert","update","delete"])) { + $sql = new SQL($this->app); + $sql->set_table("para_member_grup"); + $sql->add_param("Kode_Grup"); + $sql->add_param("Nama_Grup"); + $sql->add_param("Aktif"); + $sql->add_param_userid(); + $sql->add_where("Grup_MemberID"); + + if ($this->mode_detail === "insert") { + $sql->InsertDB(); + } else if ($this->mode_detail === "update") { + $sql->UpdateDB(); + } else if ($this->mode_detail === "delete") { + $sql->DeleteDB(); + } + } + + $tcari = Param::Get("Cari_Member"); + $tsql = ''; $asql = []; + if (!empty($tcari)) { + $tsql = 'CONCAT(Kode_Grup,Nama_Grup) LIKE ?'; + $asql[] = '%'. $tcari .'%'; + } + + $obj = new Table($this->app); + $obj->set_table("para_member_grup", "*", $tsql, $asql); + $obj->add_field("Grup_MemberID", "ID", "hid"); + $obj->add_field("Kode_Grup", "Kode"); + $obj->add_field("Nama_Grup", "Nama Grup Member", "awr"); + $obj->add_field("Aktif", "Aktif", "c", "checkbox"); + $obj->set_field_order("Kode_Grup", "A"); + $obj->add_row_btn("clipboard", "Ubah", "MemberGrupJS.detail_ubah"); + $obj->add_row_btn("trash", "Hapus", "MemberGrupJS.detail_hapus"); + $obj->set_func_btn("MemberGrupJS.detail_tambah", "+ Grup Member"); + $this->app->json([ $obj->json_table("divDetail") ]); + } + + public function form_grup() { + $atabel = Invesa::A_Member_Grup(); + if ($this->id_grup > 0) { + $atabel = $this->db->fetchRow("SELECT * FROM para_member_grup WHERE Grup_MemberID=?", [$this->id_grup]); + } + + $form = new Form($this->app); + $tkode = $form->textbox("_", "Kode_Grup", $atabel['Kode_Grup'], true, true, "text", "kode grup member"); + $tnama = $form->textbox("_", "Nama_Grup", $atabel['Nama_Grup'], true, true, "text", "nama grup member"); + $taktif = $form->radio("_", "Aktif", $atabel['Aktif'], true, true, ['1'=>"Aktif",'0'=>"Tidak"]); + $ajson['html'] = ' +
+ +
'.$tkode.'
+
+
+ +
'.$tnama.'
+
+
+ +
'.$taktif.'
+
+ + '; + $this->app->json($ajson); + } + + public function index() { + $this->app->json(['html' => ' +
+
Daftar Grup Member
 
+
' + ]); + } +} diff --git a/app/Controller/Table/Member/PointbarangController.php b/app/Controller/Table/Member/PointbarangController.php new file mode 100644 index 0000000..1811ecc --- /dev/null +++ b/app/Controller/Table/Member/PointbarangController.php @@ -0,0 +1,135 @@ +app = $app; + $this->db = $db; + $this->mode_detail = Param::Get("mode_detail", ""); + $this->id_point = (int) Param::Get("InvPID", 0); + } + + public function table_detail() { + if (in_array($this->mode_detail, ["insert","update","delete"])) { + $sql = new SQL($this->app); + $sql->set_table("inv_point_barang"); + $sql->add_param("Point_TipeID"); + $sql->add_param("Nama_Barang"); + $sql->add_param("SatuanID"); + $sql->add_param("Nilai_Barang"); + $sql->add_param("Nilai_Point"); + $sql->add_param("Aktif"); + $sql->add_param_userid(); + $sql->add_where("InvPID"); + + if ($this->mode_detail === "insert") { + $sql->InsertDB(); + } else if ($this->mode_detail === "update") { + $sql->UpdateDB(); + } else if ($this->mode_detail === "delete") { + $sql->DeleteDB(); + } + } + + $tcari = Param::Get("Cari_Barang"); + $tsql = ''; $asql = []; + if (!empty($tcari)) { + $tsql = 'Nama_Barang LIKE ?'; + $asql[] = '%'. $tcari .'%'; + } + + $obj = new Table($this->app); + $obj->set_table("inv_point_barang B LEFT JOIN inv_point_tipe T ON (B.Point_TipeID=T.Point_TipeID)", "B.*,T.Nama_Tipe", $tsql, $asql); + $obj->add_field("InvPID", "ID", "hid"); + $obj->add_field("Nama_Tipe", "Tipe Point", "awr"); + $obj->add_field("Nama_Barang", "Nama Barang", "awr"); + $obj->add_field("Nilai_Barang", "Nilai Barang", "r", "rupiah"); + $obj->add_field("Nilai_Point", "Nilai Point", "r", "rupiah"); + $obj->add_field("Aktif", "Aktif", "c", "checkbox"); + $obj->set_field_order("Nama_Barang", "A"); + $obj->add_row_btn("clipboard", "Ubah", "PointBarangJS.detail_ubah"); + $obj->add_row_btn("trash", "Hapus", "PointBarangJS.detail_hapus"); + $obj->set_func_btn("PointBarangJS.detail_tambah", "+ Barang"); + $this->app->json([ $obj->json_table("divDetail") ]); + } + + public function form_barang() { + $atabel = [ 'InvPID'=>0, 'Point_TipeID'=>0, 'Nama_Barang'=>"", 'SatuanID'=>0, 'Nilai_Barang'=>0, 'Nilai_Point'=>0, 'Aktif'=>1]; + if ($this->id_point > 0) { + $atabel = $this->db->fetchRow("SELECT * FROM inv_point_barang WHERE InvPID=?", [$this->id_point]); + } + + $form = new Form($this->app); + $ttipe = $form->option_db("_", "Point_TipeID", $atabel['Point_TipeID'], true, false, "inv_point_tipe", ["Point_TipeID","Nama_Tipe"], "Aktif=1 ORDER BY Point_TipeID", [0," "]); + $tnama = $form->textbox("_", "Nama_Barang", $atabel['Nama_Barang'], true, true, "text"); + $tsatuan = $form->option_db("_", "SatuanID", $atabel['SatuanID'], true, false, "para_satuan", ["SatuanID","Nama_Satuan"], "Aktif=1 ORDER BY Nama_Satuan", [0," "]); + $tnilai = $form->textbox("_", "Nilai_Barang", $atabel['Nilai_Barang'], true, false, "double"); + $tpoint = $form->textbox("_", "Nilai_Point", $atabel['Nilai_Point'], true, false, "number"); + $taktif = $form->radio("_", "Aktif", $atabel['Aktif'], true, false, [1=>"Aktif",0=>"Tidak"]); + $ajson['html'] = ' +
+ +
'.$ttipe.'
+
+
+ +
'.$tnama.'
+
+
+ +
'.$tsatuan.'
+
+
+ +
'.$tnilai.'
+
+
+ +
'.$tpoint.'
+
+
+ +
'.$taktif.'
+
+ + '; + $this->app->json($ajson); + } + + public function index() { + $this->app->json(['html' => ' +
+
Daftar Point Penukarang Barang
 
+
' + ]); + } +} diff --git a/app/Controller/Table/Member/PointskemaController.php b/app/Controller/Table/Member/PointskemaController.php new file mode 100644 index 0000000..9c39cf5 --- /dev/null +++ b/app/Controller/Table/Member/PointskemaController.php @@ -0,0 +1,223 @@ +app = $app; + $this->db = $db; + $this->mode_detail = Param::Get("mode_detail", ""); + $this->id_point = (int) Param::Get("PointID", 0); + $this->kode_barang = (string) Param::Get("Kode_Barang", ""); + } + + public function table_detail() { + if (in_array($this->mode_detail, ["insert","update","delete"])) { + $sql = new SQL($this->app); + $sql->set_table("inv_point"); + $sql->add_param("Point_TipeID"); + $sql->add_param("KartuID"); + $sql->add_param("CabID"); + $sql->add_param("Grup_MemberID"); + $sql->add_param("Nilai_Jual"); + $sql->add_param("Grup_Barang"); + $sql->add_param("Kode_Barang"); + $sql->add_param_date("Tgl_Mulai"); + $sql->add_param("Aktif"); + $sql->add_param_userid(); + $sql->add_where("PointID"); + + if ($this->mode_detail === "insert") { + $sql->InsertDB(); + } else if ($this->mode_detail === "update") { + $sql->UpdateDB(); + } else if ($this->mode_detail === "delete") { + $sql->DeleteDB(); + } + } + + $tcari = Param::Get("Cari_Skema"); + $tsql = ''; $asql = []; + if (!empty($tcari)) { + $tsql = 'CONCAT_WS(G.Nama_Grup,T.Nama_Tipe) LIKE ?'; + $asql[] = '%'. $tcari .'%'; + } + + $obj = new Table($this->app); + $obj->set_table("inv_point P LEFT JOIN para_member_grup G ON (G.Grup_MemberID=P.Grup_MemberID) LEFT JOIN para_cabang C ON (P.CabID=C.CabID) LEFT JOIN para_rek_pos K ON (P.KartuID=K.KartuID) LEFT JOIN inv_point_tipe T ON (P.Point_TipeID=T.Point_TipeID)", "P.*,IF(P.KartuID=0,'SEMUA JENIS',K.Nama_Kartu) Nama_Kartu,IF(P.Grup_MemberID=0,'SEMUA GRUP',G.Nama_Grup) Nama_Grup,IF(P.CabID=0,'SEMUA CABANG',C.Nama_Cab) Nama_Cab,T.Nama_Tipe", $tsql, $asql); + $obj->add_field("PointID", "ID", "hid"); + $obj->add_field("Nama_Tipe", "Tipe", "l"); + $obj->add_field("Nama_Cab", "Cabang", "l"); + $obj->add_field("Nama_Kartu", "Pembayaran", "l"); + $obj->add_field("Nama_Grup", "Grup Member", "l"); + $obj->add_field("Grup_Barang", "Grup Barang", "awr"); + $obj->add_field("Nilai_Jual", "Nominal (Rp.)", "r", "rupiah"); + $obj->add_field("Tgl_Mulai", "Tgl. Mulai", "c", "sqltgl", "", "val-tgl"); + $obj->add_field("Aktif", "Aktif", "c", "checkbox"); + $obj->set_field_order("Nama_Tipe", "A"); + $obj->add_row_btn("clipboard", "Ubah", "PointSkemaJS.detail_ubah"); + $obj->add_row_btn("trash", "Hapus", "PointSkemaJS.detail_hapus"); + $obj->set_func_btn("PointSkemaJS.detail_tambah", "+ Skema Point"); + $this->app->json([ $obj->json_table("divDetail") ]); + } + + public function table_barang() { + $ainv = (empty($this->kode_barang)) ? [] : explode(",", $this->kode_barang); + if (in_array($this->mode_detail, ["insert","delete"])) { + $id_inv = Param::Get("InvID", 0); + if ($this->mode_detail === "insert") { + if (!in_array($id_inv, $ainv)) $ainv[] = $id_inv; + } else if ($this->mode_detail === "delete") { + if (($key = array_search($id_inv, $ainv)) !== false) unset($ainv[$key]); + } + } + + $tsql = 'FALSE'; $asql = []; + if (count($ainv) > 0) { + $tsql = 'InvID IN (?)'; + $asql[] = $ainv; + } + + $obj = new Table($this->app); + $obj->set_table("inv_produk", "*,1 Hapus", $tsql, $asql); + $obj->add_field("InvID", "ID", "hid"); + $obj->add_field("Nama_Produk", "Nama Barang", "awr"); + $obj->add_row_btn("trash", "Hapus", "PointSkemaJS.barang_hapus"); + $this->app->json([ $obj->json_table("divBarang"), ['type'=>"form", 'id'=>"Kode_Barang", 'value'=>implode(',', $ainv)] ]); + } + + public function auto_produk() { + $tcari = Param::Get("Auto_Query"); + $ajson['autodata'] = []; + $bcode = 0; $arec = []; + // Cari by SKU & Barcode + $arec = $this->db->fetchRow("SELECT V.InvID,P.Nama_Produk FROM (SELECT * FROM inv_produk_varian WHERE Kode_SKU=? OR Kode_Barcode=? LIMIT 1) V LEFT JOIN inv_produk P ON (P.InvID=V.InvID) WHERE P.Aktif=1", [$tcari, $tcari]); + if (is_array($arec) && count($arec) > 0) $bcode = 1; + if ($bcode === 1) { + $ajson['autodata'][] = ['value'=>$arec['InvID'], 'text'=>$arec['Nama_Produk'], 'data'=>0, 'bc'=>1]; + } else { + // Cari by Nama + $stat = $this->db->runQuery("SELECT InvID,Nama_Produk FROM inv_produk WHERE Aktif=1 AND Nama_Produk LIKE ? ORDER BY Nama_Produk LIMIT 50", ['%'.$tcari.'%']); + while ($row = $stat->fetch(SimplePdo::FETCH_ASSOC)) { + $ajson['autodata'][] = ['value'=>$row['InvID'], 'text'=>$row['Nama_Produk'], 'html'=>$row['Nama_Produk'], 'data'=>0, 'bc'=>0]; + } + } + $this->app->json($ajson); + } + + public function form_skema() { + $atabel = [ 'PointID'=>0,'CabID'=>0,'Grup_MemberID'=>0,'Point_TipeID'=>0,'KartuID'=>0,'Grup_Barang'=>"",'Kode_Barang'=>"",'Nilai_Jual'=>0,'Tgl_Mulai'=>tgl_ymd(),'Aktif'=>1 ]; + if ($this->id_point > 0) { + $atabel = $this->db->fetchRow("SELECT * FROM inv_point WHERE PointID=?", [$this->id_point]); + } + + $form = new Form($this->app); + $tcab = $form->option_db("_", "CabID", $atabel['CabID'], true, false, "para_cabang", ["CabID","Nama_Cab"], "Aktif=1 ORDER BY Nama_Cab", [0,"SEMUA CABANG"]); + $tgrup = $form->option_db("_", "Grup_MemberID", $atabel['Grup_MemberID'], true, false, "para_member_grup", ["Grup_MemberID","Nama_Grup"], "Aktif=1 ORDER BY Nama_Grup", [0,"SEMUA GRUP"]); + $ttipe = $form->option_db("_", "Point_TipeID", $atabel['Point_TipeID'], true, false, "inv_point_tipe", ["Point_TipeID","Nama_Tipe"], "Aktif=1 ORDER BY Point_TipeID", [0," "]); + $tkartu = $form->option_db("_", "KartuID", $atabel['KartuID'], true, false, "para_rek_pos", ["KartuID","Nama_Kartu"], "Aktif=1", [0,"SEMUA JENIS PEMBAYARAN"]); + $t_grup = $form->textbox("_", "Grup_Barang", $atabel['Grup_Barang'], false, false, "text"); + $t_brg = $form->textbox("_", "Kode_Barang", $atabel['Kode_Barang'], false, false, "text"); + $t_nilai = $form->textbox("_", "Nilai_Jual", $atabel['Nilai_Jual'], true, false, "double"); + $ttglmulai = $form->datebox("_", "Tgl_Mulai", $atabel['Tgl_Mulai'], true, false); + $taktif = $form->radio("_", "Aktif", $atabel['Aktif'], true, false, ['1'=>"Ya",'0'=>"Tidak"]); + $ajson['html'] = ' +
+ +
'.$ttipe.'
+
+
+ +
'.$tcab.'
+ +
'.$tgrup.'
+
+

+
+ +
'.$t_grup.'
+
+
+ +
'.$t_brg.'
+
+
+ +
'.$t_nilai.Invesa::Form_Info("Jumlah Nominal Penjualan untuk Memperoleh Point (berlaku kelipatan). Contoh : Rp 100.000").'
+ +
'.$ttglmulai.'
+
+
+ +
'.$tkartu.'
+ +
'.$taktif.'
+
+ + '; + $this->app->json($ajson); + } + + public function form_grup() { + $agrup = explode(",", Param::Get("Grup_Barang","0")); + $ajson['html'] = ''; + + $stat = $this->db->runQuery("SELECT * FROM inv_produk_grup ORDER BY Nama_Grup"); + while ($row = $stat->fetch(SimplePdo::FETCH_ASSOC)) { + $checked = (in_array($row['Grup_InvID'], $agrup)) ? "checked" : ""; + $ajson['html'] .= sprintf('', $row['Nama_Grup'], $row['Grup_InvID'], $checked); + } + $ajson['html'] .= '
Nama Grup BarangAksi
%s
'; + $this->app->json($ajson); + } + + public function form_barang() { + $form = new Form($this->app); + $tnama = $form->textauto("_", "Nama_Produk", [], true, true, "ketik nama produk"); + $ajson['html'] = ' +
+ +
'.$tnama.'
+
+
 
+ '; + $this->app->json($ajson); + } + + public function index() { + $this->app->json(['html' => ' +
+
Daftar Skema Point Member
 
+
' + ]); + } +} diff --git a/app/Controller/Table/Member/PointtipeController.php b/app/Controller/Table/Member/PointtipeController.php new file mode 100644 index 0000000..2a1cccb --- /dev/null +++ b/app/Controller/Table/Member/PointtipeController.php @@ -0,0 +1,120 @@ +app = $app; + $this->db = $db; + $this->mode_detail = Param::Get("mode_detail", ""); + $this->id_tipe = (int) Param::Get("Point_TipeID", 0); + } + + public function table_detail() { + if (in_array($this->mode_detail, ["insert","update","delete"])) { + $sql = new SQL($this->app); + $sql->set_table("inv_point_tipe"); + $sql->add_param("Nama_Tipe"); + $sql->add_param("Txt_Struk1"); + $sql->add_param("Txt_Struk2"); + $sql->add_param("Aktif"); + $sql->add_param_userid(); + $sql->add_where("Point_TipeID"); + + if ($this->mode_detail === "insert") { + $sql->InsertDB(); + } else if ($this->mode_detail === "update") { + $sql->UpdateDB(); + } else if ($this->mode_detail === "delete") { + $sql->DeleteDB(); + } + } + + $tcari = Param::Get("Cari_Tipe"); + $tsql = ''; $asql = []; + if (!empty($tcari)) { + $tsql = 'Nama_Tipe LIKE ?'; + $asql[] = '%'. $tcari .'%'; + } + + $obj = new Table($this->app); + $obj->set_table("inv_point_tipe", "*", $tsql, $asql); + $obj->add_field("Point_TipeID", "ID", "hid"); + $obj->add_field("Nama_Tipe", "Tipe Point", "awr"); + $obj->add_field("Aktif", "Aktif", "c", "checkbox"); + $obj->set_field_order("Nama_Tipe", "A"); + $obj->add_row_btn("clipboard", "Ubah", "PointTipeJS.detail_ubah"); + $obj->add_row_btn("trash", "Hapus", "PointTipeJS.detail_hapus"); + $obj->set_func_btn("PointTipeJS.detail_tambah", "+ Tipe Point"); + $this->app->json([ $obj->json_table("divDetail") ]); + } + + public function form_tipe() { + $atabel = [ 'Point_TipeID'=>0, 'Nama_Tipe'=>"", 'Txt_Struk1'=>"", 'Txt_Struk2'=>"", 'Aktif'=>1 ]; + if ($this->id_tipe > 0) { + $atabel = $this->db->fetchRow("SELECT * FROM inv_point_tipe WHERE Point_TipeID=?", [$this->id_tipe]); + } + + $form = new Form($this->app); + $tnama = $form->textbox("_", "Nama_Tipe", $atabel['Nama_Tipe'], true, true, "text", "nama tipe point"); + $tstruk1 = $form->textbox("_", "Txt_Struk1", $atabel['Txt_Struk1'], true, true, "text", "text struk utk dapat point baru"); + $tstruk2 = $form->textbox("_", "Txt_Struk2", $atabel['Txt_Struk2'], true, true, "text", "text struk utk tampilan total point"); + $taktif = $form->radio("_", "Aktif", $atabel['Aktif'], true, false, [1=>"Aktif",0=>"Tidak"]); + $ajson['html'] = ' +
+ +
'.$tnama.'
+
+
+ +
'.$tstruk2.Invesa::Form_Info("Gunakan [TOT_POINT] untuk tampilan nilai.").'
+
+
+ +
'.$tstruk1.Invesa::Form_Info("Gunakan [POINT] untuk tampilan nilai.").'
+
+
+ +
'.$taktif.'
+
+ + '; + $this->app->json($ajson); + } + + public function index() { + $this->app->json(['html' => ' +
+
Daftar Tipe Point Member
 
+
' + ]); + } +} diff --git a/app/Controller/Table/Ppob/KategoriController.php b/app/Controller/Table/Ppob/KategoriController.php new file mode 100644 index 0000000..7a66364 --- /dev/null +++ b/app/Controller/Table/Ppob/KategoriController.php @@ -0,0 +1,93 @@ +app = $app; + $this->db = $db; + $this->mode_detail = Param::Get("mode_detail", ""); + $this->id_kate = (int) Param::Get("KateID", 0); + } + + public function table_detail() { + $tcari = Param::Get("Cari_Kate"); + $tsql = ''; $asql = []; + if (!empty($tcari)) { + $tsql = 'N_Kate LIKE ?'; + $asql[] = '%'. $tcari .'%'; + } + + $obj = new Table($this->app); + $obj->set_table("ppob_kategori", "*", $tsql, $asql); + $obj->add_field("KateID", "ID", "hid"); + $obj->add_field("K_Kate", "Kode", "l"); + $obj->add_field("N_Kate", "Nama Kategori", "awr"); + $obj->add_field("Status", "Status", "c", "checkbox"); + $obj->set_field_order("K_Kate", "A"); + $obj->add_row_btn("clipboard", "Detail", "PPOBKateJS.detail_ubah"); + $this->app->json([ $obj->json_table("divDetail") ]); + } + + public function form_kategori() { + $atabel = ['KateID'=>0, 'K_Kate'=>"", 'N_Kate'=>"", 'Status'=>1]; + if ($this->id_kate > 0) { + $atabel = $this->db->fetchRow("SELECT * FROM ppob_kategori WHERE KateID=?", [$this->id_kate]); + } + + $form = new Form($this->app); + $tkode = $form->textbox("_", "K_Kate", $atabel['K_Kate'], false, false, "text"); + $tnama = $form->textbox("_", "N_Kate", $atabel['N_Kate'], false, false, "text"); + $tstatus = $form->radio("_", "Status", $atabel['Status'], true, true, ['1'=>"Aktif",'0'=>"Tidak"]); + $ajson['html'] = ' +
+ +
'.$tkode.'
+
+
+ +
'.$tnama.'
+
+
+ +
'.$tstatus.'
+
+ + '; + $this->app->json($ajson); + } + + public function index() { + $this->app->json(['html' => ' +
+
Daftar Kategori PPOB
 
+
' + ]); + } +} diff --git a/app/Controller/Table/Ppob/OperatorController.php b/app/Controller/Table/Ppob/OperatorController.php new file mode 100644 index 0000000..fa8eef3 --- /dev/null +++ b/app/Controller/Table/Ppob/OperatorController.php @@ -0,0 +1,98 @@ +app = $app; + $this->db = $db; + $this->mode_detail = Param::Get("mode_detail", ""); + $this->id_ope = (int) Param::Get("OpeID", 0); + } + + public function table_detail() { + $tcari = Param::Get("Cari_Ope"); + $tsql = ''; $asql = []; + if (!empty($tcari)) { + $tsql = 'CONCAT(N_Ope,Prefix_Ope) LIKE ?'; + $asql[] = '%'. $tcari .'%'; + } + + $obj = new Table($this->app); + $obj->set_table("ppob_operator", "*", $tsql, $asql); + $obj->add_field("OpeID", "ID", "hid"); + $obj->add_field("K_Ope", "Kode", "l"); + $obj->add_field("N_Ope", "Nama Operator", "awr"); + $obj->add_field("Status", "Status", "c", "checkbox"); + $obj->set_field_order("K_Ope", "A"); + $obj->add_row_btn("clipboard", "Detail", "PPOBOpeJS.detail_ubah"); + $this->app->json([ $obj->json_table("divDetail") ]); + } + + public function form_operator() { + $atabel = ['OpeID'=>0, 'K_Ope'=>"", 'N_Ope'=>"", 'Prefix_Ope'=>"", 'Status'=>1]; + if ($this->id_ope > 0) { + $atabel = $this->db->fetchRow("SELECT * FROM ppob_operator WHERE OpeID=?", [$this->id_ope]); + } + + $form = new Form($this->app); + $tkode = $form->textbox("_", "K_Ope", $atabel['K_Ope'], false, false, "text"); + $tnama = $form->textbox("_", "N_Ope", $atabel['N_Ope'], false, false, "text"); + $tpref = $form->textbox("_", "Prefix_Ope", $atabel['Prefix_Ope'], false, false, "text"); + $tstatus = $form->radio("_", "Status", $atabel['Status'], true, true, ['1'=>"Aktif",'0'=>"Tidak"]); + $ajson['html'] = ' +
+ +
'.$tkode.'
+
+
+ +
'.$tnama.'
+
+
+ +
'.$tpref.'
+
+
+ +
'.$tstatus.'
+
+ + '; + $this->app->json($ajson); + } + + public function index() { + $this->app->json(['html' => ' +
+
Daftar Operator PPOB
 
+
' + ]); + } +} diff --git a/app/Controller/Table/Ppob/ProdukController.php b/app/Controller/Table/Ppob/ProdukController.php new file mode 100644 index 0000000..6fcf905 --- /dev/null +++ b/app/Controller/Table/Ppob/ProdukController.php @@ -0,0 +1,221 @@ +app = $app; + $this->db = $db; + $this->reg_name = (string) $session->get('WEB_APP')['REG_NAME']; + $this->mode_detail = Param::Get("mode_detail", ""); + $this->id_kate = (int) Param::Get("KateID", 0); + $this->id_ope = (int) Param::Get("OpeID", 0); + $this->id_produk = (int) Param::Get("ProdukID", 0); + } + + public function table_produk() { + if ($this->mode_detail === "update") { + $sql = new SQL($this->app); + $sql->set_table("ppob_produk"); + $sql->add_param("OpeID"); + $sql->add_param("KateID"); + $sql->add_param("Nama_Produk"); + $sql->add_param("Harga_Pokok"); + $sql->add_param("Harga_Jual"); + $sql->add_param("Status"); + $sql->add_param_userid(); + $sql->add_where("ProdukID"); + $sql->UpdateDB(); + } + + $tcari = Param::Get("Cari_Produk"); + $tsql = ''; $asql = []; + if (!empty($tcari)) { + $tsql = 'Nama_Produk LIKE ?'; + $asql[] = '%'. $tcari .'%'; + } + + $obj = new Table($this->app); + $obj->set_table("ppob_produk", "*,((Harga_Jual-Harga_Pokok)/Harga_Pokok)*100 Margin", $tsql, $asql); + $obj->add_field("ProdukID", "ID", "hid"); + $obj->add_field("Nama_Produk", "Nama Produk", "awr"); + $obj->add_field("Harga_Pokok", "Harga Modal", "r", "rupiah"); + $obj->add_field("Harga_Jual", "Harga Jual", "r", "rupiah"); + $obj->add_field("Margin", "%", "r", "rupiah2"); + $obj->add_field("Status", "Status", "c", "checkbox"); + $obj->set_field_order("Nama_Produk", "A"); + $obj->set_row_color("Harga_Jual", "0", "rdanger"); + $obj->add_row_btn("clipboard", "Ubah", "PPOBProdukJS.produk_ubah"); + $this->app->json([ $obj->json_table("divDetail") ]); + } + + public function form_produk() { + $atabel = ['ProdukID'=>0, 'Kode'=>"", 'Nama_Produk'=>"", 'OpeID'=>0, 'Harga_Pokok'=>0, 'Harga_Jual'=>0, 'Status'=>1]; + if ($this->id_produk > 0) { + $atabel = $this->db->fetchRow("SELECT * FROM ppob_produk WHERE ProdukID=?", [$this->id_produk]); + } + + $form = new Form($this->app); + $tkode = $form->textbox("_", "Kode", $atabel['Kode'], false, false, "text"); + $tnama = $form->textbox("_", "Nama_Produk", $atabel['Nama_Produk'], true, true, "text", "nama produk"); + $tkate = $form->option_db("_", "KateID", $atabel['KateID'], true, false, "ppob_kategori", ["KateID","N_Kate"], "Status=1 ORDER BY N_Kate"); + $tope = $form->option_db("_", "OpeID", $atabel['OpeID'], true, false, "ppob_operator", ["OpeID","N_Ope"], "Status=1 ORDER BY N_Ope"); + $thpp = $form->textbox("_", "Harga_Pokok", $atabel['Harga_Pokok'], true, true, "double", "harga pokok"); + $tjual = $form->textbox("_", "Harga_Jual", $atabel['Harga_Jual'], true, true, "double", "harga jual"); + $tstatus = $form->radio("_", "Status", $atabel['Status'], true, true, ['1'=>"Aktif",'0'=>"Tidak"]); + $ajson['html'] = ' +
+ +
'.$tkate.'
+
'.$tstatus.'
+
+
+ +
'.$tope.'
+
Kode Produk'.$tkode.'
+
+
+ +
'.$tnama.'
+
+
+ +
'.$thpp.'
+
+
+ +
'.$tjual.'
+
+ + '; + $this->app->json($ajson); + } + + public function detail_print() { + $form = new Form($this->app); + $tkate = $form->option_db("_", "KateID", 0, true, false, "ppob_kategori", ["KateID","N_Kate"], "Status=1 ORDER BY N_Kate", [0,"SEMUA KATEGORI"]); + $tope = $form->option_db("_", "OpeID", 0, true, false, "ppob_operator", ["OpeID","N_Ope"], "Status=1 ORDER BY N_Ope", [0,"SEMUA OPERATOR"]); + $ttgl = $form->datebox("_", "Tgl_Cetak", tgl_ymd(), true, false); + $ajson['html'] = ' +
+ +
'.$tkate.'
+
+
+ +
'.$tope.'
+
+
+ +
'.$ttgl.'
+
'; + $this->app->json($ajson); + } + + public function detail_update() { + $form = new Form($this->app); + $tkate = $form->option_db("_", "K_Kate", "", true, false, "ppob_kategori", ["K_Kate","N_Kate"], "Status=1 ORDER BY N_Kate", ["","SEMUA KATEGORI"]); + $tope = $form->option_db("_", "K_Ope", "", true, false, "ppob_operator", ["K_Ope","N_Ope"], "Status=1 ORDER BY N_Ope", ["","SEMUA OPERATOR"]); + $ajson['html'] = ' +
+ +
'.$tkate.'
+
+
+ +
'.$tope.'
+
'; + $this->app->json($ajson); + } + + public function proses_update() { + // PROSES API TRIFONIA PULSA + $cppob = new PPOBClient($this->app); + $appob = $cppob->Produk(Param::Get("K_Kate"), Param::Get("K_Ope")); + if (count($appob) > 0 && (int) $appob['Status'] === 4) { + $ajson[] = ['type'=>"msg", 'mode'=>"info", 'wait'=>2000, 'value'=>$appob['Message']]; + } else { + $ajson[] = ['type'=>"msg", 'mode'=>"error", 'wait'=>2000, 'value'=>$appob['Message']]; + } + $this->app->json($ajson); + } + + public function print_produk() { + $nama_kate = ""; $nama_ope = ""; + if ($this->id_kate > 0) $nama_kate = $this->db->fetchField("SELECT N_Kate FROM ppob_kategori WHERE KateID=?", [$this->id_kate]); + if ($this->id_ope > 0) $nama_ope = $this->db->fetchField("SELECT N_Ope FROM ppob_operator WHERE OpeID=?", [$this->id_ope]); + + // generate report header + $tglheader = "Tanggal Cetak : ".Param::Get("Tgl_Cetak"); + $tsql = ''; $asql = []; + if ($this->id_kate > 0) { $tsql .= " AND KateID=?"; $asql[] = $this->id_kate; } + if ($this->id_ope > 0) { $tsql .= " AND OpeID=?"; $asql[] = $this->id_ope; } + $tsql = (strlen($tsql) > 0) ? ' WHERE '.substr($tsql, 4) : ''; + + // query data laporan + $stat = $this->db->runQuery("SELECT * FROM ppob_produk".$tsql." ORDER BY KateID,OpeID,ProdukID", $asql); + + $pre = new PrintHTML($this->app); + $pre->add_title([strtoupper($this->reg_name), "Laporan Daftar Produk PPOB", $tglheader]); + + $pre->add_field("No",10,"C"); + $pre->add_field("Nama Produk",80); + $pre->add_field("Harga Modal",12, "R", "rupiah"); + $pre->add_field("Harga Jual",12, "R", "rupiah"); + $pre->add_field("Margin",12, "R", "rupiah"); + $pre->add_field("%",5, "R", "rupiah2"); + + if ($this->id_kate > 0) $pre->add_sub_title("Nama Kategori : ".$nama_kate); + if ($this->id_ope > 0) $pre->add_sub_title("Nama Operator : ".$nama_ope); + + $pre->show_titles(); + $pre->show_headers(); + + $nomor = 0; + while ($row = $stat->fetch(SimplePdo::FETCH_ASSOC)) { + $pre->add_row([ ++$nomor, $row['Nama_Produk'], $row['Harga_Pokok'], $row['Harga_Jual'], ((float) $row['Harga_Jual']-(float) $row['Harga_Pokok']), ((((float) $row['Harga_Jual']-(float) $row['Harga_Pokok'])*100)/(float) $row['Harga_Pokok']) ]); + } + $pre->add_stamp(0, true); + $pre->show(); + } + + public function index() { + $this->app->json(['html' => ' +
Daftar Produk PPOB
 
' + ]); + } +} diff --git a/app/Controller/Table/ProdukController.php b/app/Controller/Table/ProdukController.php new file mode 100644 index 0000000..5c2d9ca --- /dev/null +++ b/app/Controller/Table/ProdukController.php @@ -0,0 +1,835 @@ +app = $app; + $this->db = $db; + $this->reg_name = (string) $session->get('WEB_APP')['REG_NAME']; + $this->mode = Param::Get("mode", ""); + $this->mode_detail = Param::Get("mode_detail", ""); + $this->id_inv = Param::Int("InvID", 0); + $this->id_kemasan = Param::Int("InvKemasanID", 0); + $this->id_varian = Param::Int("InvVarianID", 0); + $this->id_harga = Param::Int("InvHargaID", 0); + $this->md5_key = Param::Get("MD5Key", ""); + $this->i_filter = Param::Int("Filter_Produk", 0); + $this->id_eceran = (int) $session->get('APP_INV')['ECERANID'] ?? 5; + $this->def_satuan = (int) $session->get('APP_INV')['DEF_SATUANID'] ?? 0; + $this->inv = new Inv($app); + } + + public function brow_produk() { + $tcari = Param::Get("Cari_Produk2", ""); + $tsql = ''; $asql = []; + if (!empty($tcari)) { + $tsql = " AND Barcode_Nama LIKE ?"; + $asql[] = '%'. $tcari . '%'; + } + + $obj = new Table($this->app); + $obj->set_table("vi_inv_produk", "*", "Aktif=1".$tsql, $asql); + $obj->add_field("InvID", "ID", "hid"); + $obj->add_field("Kode_SKU", "SKU", "c"); + $obj->add_field("Nama_Lengkap", "Nama Barang", "awr"); + $obj->add_field("Nama_Satuan", "Satuan", "l"); + $obj->set_field_order("Kode_SKU", "A"); + $obj->add_row_btn("save", "Pilih", "ProdukJS.produk_select"); + $this->app->json([ $obj->db_table("divBrowProduk") ]); + } + + public function tabel_produk() { + $tcari = Param::Get("Cari_Produk", ""); + $awhere = []; + if (empty($tcari)) { + if ($this->i_filter > 0) $awhere[] = "Grup_InvID='".(string)$this->i_filter."'"; + } else { + $tsql = "Nama_Produk LIKE '%".$tcari."%'"; + if (is_numeric($tcari)) { + $tsql .= " OR InvID IN (SELECT InvID FROM inv_produk_varian WHERE Kode_SKU LIKE '%".$tcari."%' OR Kode_Barcode LIKE '%".$tcari."%')"; + } + $awhere[] = $tsql; + } + $tsql = (count($awhere) > 0) ? " WHERE ".implode(' AND ', $awhere) : ''; + + $obj = new Table($this->app); + $obj->set_table("(SELECT * FROM inv_produk".$tsql.") P LEFT JOIN inv_produk_kemasan K ON (K.InvID=P.InvID) LEFT JOIN inv_produk_harga H ON (K.InvID=H.InvID AND K.SatuanID=H.SatuanID AND H.Grup_MemberID='".(string)$this->id_eceran."') LEFT JOIN para_satuan S ON (S.SatuanID=K.SatuanID) LEFT JOIN (SELECT InvID,SUM(Stok) Stok FROM inv_stok GROUP BY InvID) T ON (T.InvID=P.InvID)", "P.InvID,P.Aktif,P.Nama_Produk,'' Nama_Grup,IFNULL(S.Nama_Satuan,'') Nama_Kemasan,Round(P.Harga_Pokok*IFNULL(K.Qty,1),2) Harga_Pokok,IF(IFNULL(H.Harga_Jual,0)=0,0,(((H.Harga_Jual-(P.Harga_Pokok*IFNULL(K.Qty,1)))*100)/H.Harga_Jual)) Margin,IFNULL(H.Harga_Jual,0) Harga_Jual,IF(IFNULL(T.Stok,0)=0,0,T.Stok/IFNULL(K.Qty,1)) Stok,IF((ISNULL(H.Harga_Jual) OR H.Harga_Jual<(P.Harga_Pokok*IFNULL(K.Qty,1))) AND P.Aktif=1,1,0) Rugi", ""); + if ($this->app->user()->is_level(2)) $obj->set_table("(SELECT * FROM inv_produk".$tsql.") P LEFT JOIN inv_produk_kemasan K ON (K.InvID=P.InvID) LEFT JOIN inv_produk_harga H ON (K.InvID=H.InvID AND K.SatuanID=H.SatuanID) LEFT JOIN para_member_grup MG ON (H.Grup_MemberID=MG.Grup_MemberID) LEFT JOIN para_satuan S ON (S.SatuanID=K.SatuanID) LEFT JOIN (SELECT InvID,SUM(Stok) Stok FROM inv_stok GROUP BY InvID) T ON (T.InvID=P.InvID)", "P.InvID,P.Aktif,P.Nama_Produk,IFNULL(MG.Kode_Grup,'') Nama_Grup,IFNULL(S.Nama_Satuan,'') Nama_Kemasan,Round(P.Harga_Pokok*IFNULL(K.Qty,1),2) Harga_Pokok,IF(IFNULL(H.Harga_Jual,0)=0,0,(((H.Harga_Jual-(P.Harga_Pokok*IFNULL(K.Qty,1)))*100)/H.Harga_Jual)) Margin,IFNULL(H.Harga_Jual,0) Harga_Jual,IF(IFNULL(T.Stok,0)=0,0,T.Stok/IFNULL(K.Qty,1)) Stok,IF((ISNULL(H.Harga_Jual) OR H.Harga_Jual<(P.Harga_Pokok*IFNULL(K.Qty,1))) AND P.Aktif=1,1,0) Rugi", ""); + $obj->add_field("InvID", "No.", "c"); + $obj->add_field("Nama_Produk", "Nama Barang", "awr"); + if ($this->app->user()->is_level(2)) $obj->add_field("Nama_Grup", "Grup Member", "l"); + $obj->add_field("Nama_Kemasan", "Kemasan", "l"); + if ($this->app->user()->is_level(2)) { + $obj->add_field("Harga_Pokok", "Harga Pokok", "r", "rupiah"); + $obj->add_field("Harga_Jual", "Harga Jual", "r", "rupiah"); + $obj->add_field("Margin", "%", "r", "rupiah2"); + } else { + $obj->add_field("Harga_Jual", "Harga Jual", "r", "rupiah"); + } + $obj->add_field("Stok", "Stok", "r", "rupiah2"); + $obj->add_field("Aktif", "Aktif", "c", "checkbox"); + $obj->set_field_order("InvID", "D"); + $obj->set_row_color("Rugi", "1", "rdanger"); + $obj->add_row_btn("clipboard", "Ubah", "ProdukJS.produk_ubah"); + if ($this->app->user()->is_level(2)) $obj->add_row_btn("arrow-counterclockwise", "Restore", "ProdukJS.produk_restore"); + $obj->add_row_btn("trash", "Hapus", "ProdukJS.produk_hapus"); + $obj->set_func_btn("ProdukJS.produk_tambah", "+ Produk"); + $this->app->json([ $obj->db_table("divDetail") ]); + } + + public function tabel_kemasan() { + if (in_array($this->mode_detail, ["update","delete"])) { + $sql = new SQL($this->app); + $sql->set_table("inv_produk_kemasan"); + $sql->add_param("SatuanID"); + $sql->add_param("Qty"); + $sql->add_param_userid(); + $sql->add_where("InvKemasanID", $this->id_kemasan); + + $sat_baru = (int) Param::Get("SatuanID", 0); + $sat_lama = (int) Param::Get("SatuanLamaID", 0); + if ($this->mode_detail === "update") { + if ($this->id_kemasan === 0) { + $sql->add_param("InvID"); + $sql->InsertDB(); + $this->db->runQuery("INSERT INTO inv_produk_varian (InvID,SatuanID,Kode_SKU,UserID) SELECT InvID,SatuanID,'SKU_BARU',UserID FROM inv_produk_kemasan WHERE InvID=?", [$this->id_inv]); + } else { + $sql->UpdateDB(); + if ($sat_baru !== $sat_lama) { + $this->db->update('inv_produk_varian', ['SatuanID'=>$sat_baru], 'InvID=? AND SatuanID=?', [$this->id_inv,$sat_lama]); + $this->db->update('inv_produk_harga', ['SatuanID'=>$sat_baru], 'InvID=? AND SatuanID=?', [$this->id_inv,$sat_lama]); + } + } + } else if ($this->mode_detail === "delete") { + $sql->DeleteDB(); + $this->db->delete('inv_produk_varian', 'InvID=? AND SatuanID=?', [$this->id_inv, $sat_lama]); + $this->db->delete('inv_produk_harga', 'InvID=? AND SatuanID=?', [$this->id_inv, $sat_lama]); + } + } + + $obj = new Table($this->app); + $obj->set_table("(SELECT * FROM inv_produk_kemasan WHERE InvID='".$this->id_inv."') K LEFT JOIN para_satuan S ON (K.SatuanID=S.SatuanID)", "K.*,S.Nama_Satuan,CONCAT(ROUND(K.Qty),' ','".Param::Get("Satuan_Stok","")."') Qty_Satuan", ""); + $obj->add_field("InvKemasanID", "ID", "hid"); + $obj->add_field("SatuanID", "ID2", "hid"); + $obj->add_field("Nama_Satuan", "Kemasan", "l"); + $obj->add_field("Qty_Satuan", "Qty", "r"); + $obj->set_field_order("Qty", "D"); + $obj->add_row_form("pencil-square", "Detail", "ProdukJS.kemasan_form"); + $obj->add_row_btn("trash", "Hapus", "ProdukJS.kemasan_del"); + $obj->set_func_btn("ProdukJS.kemasan_add", 'Kemasan'); + $obj->set_func_btn("ProdukJS.kemasan_copy", 'Salin Kemasan'); + $this->app->json([ $obj->json_table("divKemasan") ]); + } + + public function tabel_varian() { + if (in_array($this->mode_detail, ["update","delete"])) { + $sql = new SQL($this->app); + $sql->set_table("inv_produk_varian"); + $sql->add_param("SatuanID"); + $sql->add_param("VarianID"); + $sql->add_param("Kode_Barcode"); + $sql->add_param_userid(); + $sql->add_where("InvVarianID", $this->id_varian); + + if ($this->mode_detail === "update") { + if ($this->id_varian === 0) { + $sql->add_param("InvID"); + $sql->add_param("Kode_SKU", "SKU_BARU"); + $sql->InsertDB(); + } else { + $sql->UpdateDB(); + } + } else if ($this->mode_detail === "delete") { + $sql->DeleteDB(); + } + } + + $obj = new Table($this->app); + $obj->set_table("(SELECT * FROM inv_produk_varian WHERE InvID='".$this->id_inv."') V LEFT JOIN (SELECT SatuanID,MIN(VarianID) VarianID FROM inv_produk_varian WHERE invid='".$this->id_inv."' GROUP BY SatuanID) X ON (V.SatuanID=X.SatuanID AND V.VarianID=X.VarianID) LEFT JOIN para_varian N ON (V.VarianID=N.VarianID) LEFT JOIN para_satuan S ON (V.SatuanID=S.SatuanID)", "V.*,S.Nama_Satuan,IFNULL(N.Nama_Varian,'Tanpa Varian') Nama_Varian,IFNULL(X.SatuanID,0) Bisa_Del"); + $obj->add_field("InvVarianID", "ID", "hid"); + $obj->add_field("Kode_SKU", "SKU", "c"); + $obj->add_field("Kode_Barcode", "Barcode", "l"); + $obj->add_field("Nama_Satuan", "Kemasan", "l"); + $obj->add_field("Nama_Varian", "Varian", "l"); + $obj->set_field_order("Nama_Satuan", "A"); + $obj->add_row_form("pencil-square", "Detail", "ProdukJS.varian_form"); + $obj->add_row_btn("trash", "Hapus", "ProdukJS.varian_del", "Bisa_Del", "0"); + $obj->set_func_btn("ProdukJS.varian_add", "+ Varian"); + $this->app->json([ $obj->json_table("divVarian") ]); + } + + public function tabel_harga() { + if (in_array($this->mode_detail, ["update","delete"])) { + $sql = new SQL($this->app); + $sql->set_table("inv_produk_harga"); + $sql->add_param("SatuanID"); + $sql->add_param("Grup_MemberID"); + $sql->add_param("Harga_Jual"); + $sql->add_param_userid(); + $sql->add_where("InvHargaID", $this->id_harga); + + if ($this->mode_detail === "update") { + if ($this->id_harga === 0) { + $sql->add_param("InvID"); + $sql->InsertDB(); + } else { + $sql->UpdateDB(); + } + } else if ($this->mode_detail === "delete") { + $sql->DeleteDB(); + } + } + + $obj = new Table($this->app); + $obj->set_table("(SELECT * FROM inv_produk_harga WHERE InvID='".$this->id_inv."'".($this->app->user()->is_level(2)?"":" AND Grup_MemberID='".(string)$this->id_eceran."'").") H LEFT JOIN (SELECT * FROM inv_produk_kemasan WHERE InvID='".$this->id_inv."') K ON (H.InvID=K.InvID AND H.SatuanID=K.SatuanID) LEFT JOIN (SELECT * FROM inv_produk WHERE InvID='".$this->id_inv."') P ON (H.InvID=P.InvID) LEFT JOIN para_satuan S ON (H.SatuanID=S.SatuanID) LEFT JOIN para_member_grup G ON (H.Grup_MemberID=G.Grup_MemberID)", "H.*,S.Nama_Satuan,G.Nama_Grup,(K.Qty*P.Harga_Pokok) Harga_Modal,IF(H.Harga_Jual=0,0,H.Harga_Jual-(K.Qty*P.Harga_Pokok)) Margin_Rup, IF(H.Harga_Jual=0,0,((H.Harga_Jual-(K.Qty*P.Harga_Pokok))*100)/H.Harga_Jual) Margin_Per"); + $obj->add_field("InvHargaID", "ID", "hid"); + $obj->add_field("Nama_Satuan", "Kemasan", "l"); + $obj->add_field("Nama_Grup", "Grup Member", "l"); + $obj->add_field("Harga_Jual", "Harga Jual", "r", "rupiah"); + if ($this->app->user()->is_level(2)) { + $obj->add_field("Harga_Modal", "Harga Modal", "r", "rupiah"); + $obj->add_field("Margin_Rup", "Margin (Rp.)", "r", "rupiah"); + $obj->add_field("Margin_Per", "Margin (%)", "r", "rupiah2"); + } + $obj->set_row_color("Harga_Jual", "0", "rwarning"); + $obj->set_field_order("Nama_Satuan", "A"); + $obj->add_row_form("pencil-square", "Detail", "ProdukJS.harga_form"); + $obj->add_row_btn("trash", "Hapus", "ProdukJS.harga_del"); + $obj->set_func_btn("ProdukJS.harga_add", "+ Harga"); + $this->app->json([ $obj->json_table("divHarga") ]); + } + + public function tabel_restore() { + $obj = new Table($this->app); + $obj->set_table("inv_produk_backup", "Tanggal,MD5Key,UserID", "InvID='".$this->id_inv."'"); + $obj->add_field("Tanggal", "Waktu Backup", "c nwr", "sqljam", "", "val-tgljam"); + $obj->add_field("MD5Key", "Kode Backup", "l"); + $obj->set_field_order("Tanggal", "A"); + $obj->add_row_form("list", "Detail", "ProdukJS.produk_restore_form"); + $obj->add_row_btn("arrow-counterclockwise", "Restore", "ProdukJS.produk_restore_select"); + $this->app->json([ $obj->db_table("divBrowBackup") ]); + } + + public function detail_produk() { + $atabel = ['InvID'=>0,'Nama_Produk'=>"",'Grup_InvID'=>0,'StokID'=>$this->def_satuan,'NormalID'=>$this->def_satuan,'Harga_Beli'=>0,'Harga_Tambah'=>0,'Harga_Pokok'=>0,'Stok_Min'=>0,'Stok_Max'=>0,'Aktif'=>1,'PPN'=>0]; + if ($this->id_inv > 0) { + $atabel = $this->db->fetchRow("SELECT * FROM inv_produk WHERE InvID=?", [$this->id_inv]); + $this->Produk_Backup(); + } else { + $atabel['InvID'] = $this->Produk_Baru(true); + } + + $form = new Form($this->app); + $tnama = $form->textbox("_", "Nama_Produk", $atabel['Nama_Produk'], true, true, "text", "nama barang"); + $tgrup = $form->option_db("_", "Grup_InvID", $atabel['Grup_InvID'], true, false, "inv_produk_grup", ["Grup_InvID","Nama_Grup"], "Aktif=1 ORDER BY Nama_Grup", [0," "]); + $tstok = $form->option_db("_", "StokID", $atabel['StokID'], true, false, "para_satuan", ["SatuanID","Nama_Satuan"], "Aktif=1 ORDER BY Nama_Satuan", [0," "]); + $tnormal = $form->option_db("_", "NormalID", $atabel['NormalID'], true, false, "para_satuan", ["SatuanID","Nama_Satuan"], "Aktif=1 ORDER BY Nama_Satuan", [0," "]); + $tbeli = $form->textbox("_", "Harga_Beli", $atabel['Harga_Beli'], true, true, "double", "harga beli", null, null, "ProdukJS.hitung_HPP"); + $ttambah = $form->textbox("_", "Harga_Tambah", $atabel['Harga_Tambah'], true, true, "double", "tambahan biaya", null, null, "ProdukJS.hitung_HPP"); + $thpp = $form->textbox("_", "Harga_Pokok", $atabel['Harga_Pokok'], true, true, "double", "harga pokok"); + $tsmin = $form->textbox("_", "Stok_Min", $atabel['Stok_Min'], true, true, "double", "stok minimal"); + $tsmax = $form->textbox("_", "Stok_Max", $atabel['Stok_Max'], true, true, "double", "stok maximal"); + $tppn = $form->option("_", "PPN", $atabel['PPN'], true, true, Invesa::PPN_Array()); + $taktif = $form->radio("_", "Aktif", $atabel['Aktif'], true, true, ['1'=>"Ya",'0'=>"Tidak"]); + + $ajson['html'] = ' + +
+
+
+ +
'.$tgrup.'
+
'.$taktif.'
+
+
+ +
'.$tnama.'
+
+
+ +
'.$tstok.Invesa::Form_Info("Ukuran satuan terkecil produk.").'
+
'.$tnormal.Invesa::Form_Info("Ukuran satuan yang dipergunakan dalam transaksi normal dan laporan.").'
+
+

+
+ +
'.$tbeli.'
+
Status PPN  *'.$tppn.'
+
+
+ +
'.$ttambah.'
+
Stok Minimum'.$tsmin.'
+
+
+ +
'.$thpp.'
+
Stok Maximum'.$tsmax.'
+
+
+
+
+
+
+
+
+
+
+
+
+ + '; + $this->app->json($ajson); + } + + public function detail_print() { + $form = new Form($this->app); + $tginv = $form->option_db("_", "Grup_InvID", 0, true, false, "inv_produk_grup", ["Grup_InvID","Nama_Grup"], "Aktif=1 ORDER BY Nama_Grup", [0,"SEMUA GRUP"]); + $tsup = $form->option_db("_", "SupID", 0, true, false, "para_supplier", ["SupID","Nama_Sup"], "Aktif=1 ORDER BY Nama_Sup", [0,"SEMUA SUPPLIER"]); + $tmem = $form->option_db("_", "Grup_MemberID", $this->id_eceran, $this->app->user()->is_level(2), false, "para_member_grup", ["Grup_MemberID","Nama_Grup"], "Aktif=1 ORDER BY Nama_Grup"); + $ttgl = $form->datebox("_", "Tgl_Cetak", tgl_ymd(), true, false); + $ajson['html'] = ' +
+ +
'.$tsup.'
+
+
+ +
'.$tginv.'
+
+
+ +
'.$tmem.'
+
+
+ +
'.$ttgl.'
+
'; + $this->app->json($ajson); + } + + public function detail_filter() { + $form = new Form($this->app); + $tfilter = $form->option_db("_", "Fi_Produk", Param::Get("Filter_Produk",0), true, true, "inv_produk_grup", ["Grup_InvID","Nama_Grup"], "Aktif=1 ORDER BY Nama_Grup", [0,"SEMUA GRUP BARANG"]); + $ajson['html'] = ' +
Tampilan Berdasarkan :
+
'.$tfilter.'
'; + $this->app->json($ajson); + } + + public function detail_restore() { + $atabel = ['InvID'=>$this->id_inv, 'Nama_Produk'=>""]; + if ($this->id_inv > 0) { + $atabel = $this->db->fetchRow("SELECT * FROM inv_produk WHERE InvID=?", [$this->id_inv]); + } + + $form = new Form($this->app); + $tnama = $form->textbox("_", "Nama_Produk", $atabel['Nama_Produk'], false, false, "text"); + $ajson['html'] = ' +
'.$tnama.'
+
 
+ +
'; + $this->app->json($ajson); + } + + public function form_kemasan() { + $arec = ['InvKemasanID'=>0,'SatuanID'=>0,'Qty'=>0]; + if ($this->id_kemasan > 0) { + $arec = $this->db->fetchRow("SELECT * FROM inv_produk_kemasan WHERE InvKemasanID=?", [$this->id_kemasan]); + } + + $form = new Form($this->app); + $tsatuan = $form->option_db("_", "SatuanID", $arec['SatuanID'], true, false, "para_satuan", ["SatuanID","Nama_Satuan"], "Aktif=1 ORDER BY Nama_Satuan"); + $tqty = $form->textbox("_", "Qty", $arec['Qty'], true, true, "number", "qty"); + $ajson['html'] = ' +
+
+ +
'.$tsatuan.'
+
+
+ +
'.$tqty.''.Param::Get("Satuan_Stok","?").'
+
+ +
+
+ + +
'; + $this->app->json($ajson); + } + + public function form_varian() { + $arec = ['InvVarianID'=>0,'SatuanID'=>0,'VarianID'=>0,'Kode_SKU'=>"SKU_BARU",'Kode_Barcode'=>""]; + if ($this->id_varian > 0) { + $arec = $this->db->fetchRow("SELECT * FROM inv_produk_varian WHERE InvVarianID=?", [$this->id_varian]); + } + + $form = new Form($this->app); + $tsatuan = $form->option_que("_", "SatuanID", $arec['SatuanID'], true, false, "SELECT SatuanID,Nama_Satuan FROM para_satuan WHERE Aktif=1 AND SatuanID IN (SELECT SatuanID FROM inv_produk_kemasan WHERE InvID='".$this->id_inv."') ORDER BY Nama_Satuan", ["SatuanID","Nama_Satuan"]); + $tvarian = $form->option_db("_", "VarianID", $arec['VarianID'], true, false, "para_varian", ["VarianID","Nama_Varian"], "Aktif=1 ORDER BY Nama_Varian", [0,"-- TANPA VARIAN --"]); + $tsku = $form->textbox("_", "Kode_SKU", $arec['Kode_SKU'], false, false, "text"); + $tbcode = $form->textbox("_", "Kode_Barcode", $arec['Kode_Barcode'], true, true, "text"); + $ajson['html'] = ' +
+
+ +
'.$tsatuan.'
+
Kode SKU'.$tsku.'
+
+
+ +
'.$tvarian.'
+
Kode Barcode'.$tbcode.'
+
+
+
+ +
+
+ + + + +
'; + $this->app->json($ajson); + } + + public function form_harga() { + $arec = ['InvHargaID'=>0,'SatuanID'=>0,'Grup_MemberID'=>$this->id_eceran,'Harga_Modal'=>0,'Harga_Jual'=>0,'Persen_Jual'=>0]; + if ($this->id_harga > 0) { + $arec = $this->db->fetchRow("SELECT * FROM inv_produk_harga WHERE InvHargaID=?", [$this->id_harga]); + } + + $form = new Form($this->app); + $tsatuan = $form->option_que("_", "SatuanID", $arec['SatuanID'], true, false, "SELECT SatuanID,Nama_Satuan FROM para_satuan WHERE Aktif=1 AND SatuanID IN (SELECT SatuanID FROM inv_produk_kemasan WHERE InvID='".$this->id_inv."') ORDER BY Nama_Satuan", ["SatuanID","Nama_Satuan"], null, null, "ProdukJS.calc_Modal"); + $tgrup = $form->option_db("_", "Grup_MemberID", $arec['Grup_MemberID'], $this->app->user()->is_level(2), false, "para_member_grup", ["Grup_MemberID","Nama_Grup"], "Aktif=1 ORDER BY Nama_Grup"); + $tmodal = $form->textbox("_", "Harga_Modal", $arec['Harga_Modal'], false, false, "double"); + $tharga = $form->textbox("_", "Harga_Jual", $arec['Harga_Jual'], true, false, "double", "harga jual", null, null, "ProdukJS.calc_Harga1"); + $tpersen = $form->textbox("_", "Persen_Jual", $arec['Persen_Jual'], true, false, "double", "persen jual", null, null, "ProdukJS.calc_Harga2"); + $ajson['html'] = ' +
+
+ +
'.$tsatuan.'
+
+
+ +
'.$tgrup.'
+
Harga Modal'.$tmodal.'
+
+
+ +
'.$tharga.'
+
≈
'.$tpersen.'
%
+
+ +
+
+ + + +
'; + $this->app->json($ajson); + } + + public function form_restore() { + $atabel = ['InvID'=>$this->id_inv, 'Nama_Grup'=>"", 'Nama_Stok'=>"", 'Nama_Normal'=>""]; + $akemasan = []; $avarian = []; $aharga = []; + if (!empty($this->md5_key)) { + $arow = $this->db->fetchRow("SELECT * FROM inv_produk_backup WHERE MD5Key=?", [$this->md5_key]); + $atabel = array_merge($atabel, json_decode($arow['Produk'] ?? '[]', true)[0]); + $akemasan = json_decode($arow['Kemasan'] ?? '[]', true); + $avarian = json_decode($arow['Varian'] ?? '[]', true); + $aharga = json_decode($arow['Harga'] ?? '[]', true); + $atabel['Nama_Grup'] = (empty($atabel['Grup_InvID'])) ? '' : $this->db->fetchField("SELECT Nama_Grup FROM inv_produk_grup WHERE Grup_InvID=?", [$atabel['Grup_InvID']]); + $atabel['Nama_Stok'] = (empty($atabel['StokID'])) ? '' : $this->db->fetchField("SELECT Nama_Satuan FROM para_satuan WHERE SatuanID=?", [$atabel['StokID']]); + $atabel['Nama_Normal'] = (empty($atabel['NormalID'])) ? '' : $this->db->fetchField("SELECT Nama_Satuan FROM para_satuan WHERE SatuanID=?", [$atabel['NormalID']]); + $atabel['PPN'] = Invesa::PPN_Array()[$atabel['PPN']]; + $atabel['Status_Aktif'] = ($atabel['Aktif']==1) ? "Aktif" : "Tidak"; + } + + $tnama = ''; + $tgrup = ''; + $tstok = ''; + $tnormal = ''; + $tbeli = ''; + $ttambah = ''; + $thpp = ''; + $tsmin = ''; + $tsmax = ''; + $tppn = ''; + $taktif = ''; + + $ajson['html'] = ' +
+
+ +
+

+
+
+
+
Nama Barang'.$tnama.'
+
+
+
Grup Barang'.$tgrup.'
+
Status Barang'.$taktif.'
+
+
+
Satuan Stok'.$tstok.'
+
Satuan Normal'.$tnormal.'
+
+
+
Harga Beli'.$tbeli.'
+
Status PPN *'.$tppn.'
+
+
+
+ Biaya'.$ttambah.'
+
Stok Minimum'.$tsmin.'
+
+
+
Harga Pokok'.$thpp.'
+
Stok Maximum'.$tsmax.'
+
+
+ + +
+

+
+
+
+
+ + + '; + + if (count($akemasan) == 0) { + $ajson['html'] .= ''; + } + foreach($akemasan as $val) { + $val['Nama_Satuan'] = (empty($val['SatuanID'])) ? '' : $this->db->fetchField("SELECT Nama_Satuan FROM para_satuan WHERE SatuanID=?", [$val['SatuanID']]); + $ajson['html'] .= sprintf('', $val['Nama_Satuan'], rupiah((float)$val['Qty'])." ".$atabel['Nama_Stok']); + } + + $ajson['html'] .= ' + + +
+
+
+ + +
+

+
+
+
+
+ + + '; + + if (count($avarian) == 0) { + $ajson['html'] .= ''; + } + foreach($avarian as $val) { + $val['Nama_Satuan'] = (empty($val['SatuanID'])) ? '' : $this->db->fetchField("SELECT Nama_Satuan FROM para_satuan WHERE SatuanID=?", [$val['SatuanID']]); + $val['Nama_Varian'] = (empty($val['VarianID'])) ? '' : $this->db->fetchField("SELECT Nama_Varian FROM para_varian WHERE VarianID=?", [$val['VarianID']]); + $ajson['html'] .= sprintf('', $val['Kode_SKU'], $val['Kode_Barcode'], $val['Nama_Satuan'], $val['Nama_Varian']); + } + + $ajson['html'] .= ' + + +
+
+
+ + +
+

+
+
+
+
+ + + '; + + if (count($aharga) == 0) { + $ajson['html'] .= ''; + } + foreach($aharga as $val) { + $val['Nama_Satuan'] = (empty($val['SatuanID'])) ? '' : $this->db->fetchField("SELECT Nama_Satuan FROM para_satuan WHERE SatuanID=?", [$val['SatuanID']]); + $val['Nama_Grup'] = (empty($val['Grup_MemberID'])) ? '' : $this->db->fetchField("SELECT Nama_Grup FROM para_member_grup WHERE Grup_MemberID=?", [$val['Grup_MemberID']]); + $ajson['html'] .= sprintf('', $val['Nama_Satuan'], $val['Nama_Grup'], rupiah((float)$val['Harga_Jual'])); + } + + $ajson['html'] .= ' + + +
+
+
+ +
+
'; + $this->app->json($ajson); + } + + public function proses_simpan() { + if ($this->mode === "cancel") { + if (Param::Get("mode_before", "") === "add") { + $this->db->delete("inv_produk_kemasan", "InvID=?", [$this->id_inv]); + $this->db->delete("inv_produk_varian", "InvID=?", [$this->id_inv]); + $this->db->delete("inv_produk_harga", "InvID=?", [$this->id_inv]); + $this->db->delete("inv_produk", "InvID=?", [$this->id_inv]); + } else { + $this->Produk_Restore(); + } + } else { + $sql = new SQL($this->app); + $sql->set_table("inv_produk"); + $sql->add_param("Grup_InvID"); + $sql->add_param("Nama_Produk"); + $sql->add_param("StokID"); + $sql->add_param("NormalID"); + $sql->add_param("PPN"); + $sql->add_param("Harga_Beli"); + $sql->add_param("Harga_Tambah"); + $sql->add_param("Harga_Pokok", "Harga_Beli+Harga_Tambah", true); + $sql->add_param("Stok_Min"); + $sql->add_param("Stok_Max"); + $sql->add_param("Aktif"); + $sql->add_param_userid(); + $sql->add_where("InvID"); + + if (in_array($this->mode, ["add","edit"])) { + $sql->UpdateDB(); + } else if ($this->mode === "del") { + $sql->DeleteDB(); + $this->db->delete("inv_produk_kemasan", "InvID=?", [$this->id_inv]); + $this->db->delete("inv_produk_varian", "InvID=?", [$this->id_inv]); + $this->db->delete("inv_produk_harga", "InvID=?", [$this->id_inv]); + } + if ($this->mode !== "del") { + $this->Produk_Save(); + $this->Produk_Backup(); + } + $this->inv->Produk_Join($this->id_inv); + } + $this->app->json([ 'status' => true ]); + } + + public function proses_restore() { + $this->Produk_Restore(); + $this->app->json([ 'status' => true ]); + } + + public function proses_copy() { + $invBaru = Param::Get("InvBaruID", 0); + // Hapus kemasan dan harga sekarang + $this->db->runQuery("DELETE FROM inv_produk_kemasan WHERE InvID=?", [$this->id_inv]); + $this->db->runQuery("DELETE FROM inv_produk_varian WHERE InvID=?", [$this->id_inv]); + $this->db->runQuery("DELETE FROM inv_produk_harga WHERE InvID=?", [$this->id_inv]); + // Salin data baru kemasan dan harga + $this->db->runQuery("INSERT INTO inv_produk_kemasan (InvID,SatuanID,Qty,UserID) SELECT ?,SatuanID,Qty,UserID FROM inv_produk_kemasan WHERE InvID=?", [$this->id_inv, $invBaru]); + $this->db->runQuery("INSERT INTO inv_produk_varian (InvID,SatuanID,Kode_SKU,UserID) SELECT ?,SatuanID,'SKU_BARU',UserID FROM inv_produk_kemasan WHERE InvID=?", [$this->id_inv, $invBaru]); + $this->db->runQuery("INSERT INTO inv_produk_harga (InvID,SatuanID,Grup_MemberID,Harga_Jual,UserID) SELECT ?,SatuanID,Grup_MemberID,Harga_Jual,UserID FROM inv_produk_harga WHERE InvID=?", [$this->id_inv, $invBaru]); + $this->app->json([ 'status' => true ]); + } + + public function check_kemasan() { + $ada = (int) $this->db->fetchField("SELECT COUNT(*) FROM inv_produk_kemasan WHERE InvID=? AND SatuanID=?", [$this->id_inv, Param::Get("SatuanID",0)]) > 0; + $this->app->json([ 'ada' => $ada ]); + } + + public function check_varian() { + $ada = (int) $this->db->fetchField("SELECT COUNT(*) FROM inv_produk_varian WHERE (InvID=? AND SatuanID=? AND VarianID=?) OR Kode_Barcode=?", [$this->id_inv, Param::Get("SatuanID",0), Param::Get("VarianID",0), Param::Get("Kode_Barcode","")]) > 0; + $this->app->json([ 'ada' => $ada ]); + } + + public function check_harga() { + $ada = (int) $this->db->fetchField("SELECT COUNT(*) FROM inv_produk_harga WHERE InvID=? AND SatuanID=? AND Grup_MemberID=?", [$this->id_inv, Param::Get("SatuanID",0), Param::Get("Grup_MemberID",0)]) > 0; + $this->app->json([ 'ada' => $ada ]); + } + + public function check_modal() { + $qty = (int) $this->db->fetchField("SELECT Qty FROM inv_produk_kemasan WHERE InvID=? AND SatuanID=?", [$this->id_inv, Param::Get("SatuanID",0)]) ?? 0; + $this->app->json([ 'Qty' => $qty ]); + } + + public function print_barang() { + $id_sup = Param::Get("SupID", 0); + $id_grup = Param::Get("Grup_InvID", 0); + $id_member = Param::Get("Grup_MemberID", 0); + $nama_sup = ""; $nama_grup = ""; $nama_member = ""; + if ($id_sup > 0) $nama_sup = $this->db->fetchField("SELECT CONCAT(Nama_Sup,' (',Kode_Sup,')') FROM para_supplier WHERE SupID=?", [$id_sup]); + if ($id_grup > 0) $nama_grup = $this->db->fetchField("SELECT Nama_Grup FROM inv_produk_grup WHERE Grup_InvID=?", [$id_grup]); + if ($id_member > 0) $nama_member = $this->db->fetchField("SELECT Nama_Grup FROM para_member_grup WHERE Grup_MemberID=?", [$id_member]); + + // generate report header + $tglheader = "Tanggal Cetak : ".Param::Get("Tgl_Cetak"); + $tsql = ''; $asql = [$id_member]; + if ($id_sup > 0) { $tsql .= " AND S.SupID=?"; $asql[] = $id_sup; } + if ($id_grup > 0) { $tsql .= " AND P.Grup_InvID=?"; $asql[] = $id_grup; } + $tsql = (strlen($tsql) > 0) ? substr($tsql, 4) : 'TRUE'; + + // query data laporan + $stat = $this->db->runQuery("SELECT P.*,H.Harga_Jual FROM (SELECT * FROM inv_produk_harga WHERE Grup_MemberID=?) H LEFT JOIN vi_inv_produk P ON (H.InvID=P.InvID AND H.SatuanID=P.SatuanID) LEFT JOIN inv_produk_sup S ON (P.InvID=S.InvID) WHERE ".$tsql." GROUP BY P.InvID,P.SatuanID ORDER BY P.Nama_Produk, P.Qty DESC", $asql); + + $pre = new PrintHTML($this->app); + $pre->add_title([strtoupper($this->reg_name), "Laporan Daftar Barang", $tglheader]); + + $pre->add_field("No",10,"C"); + $pre->add_field("Nama Barang",80); + $pre->add_field("Kemasan",10); + if ($this->app->user()->is_level(2)) $pre->add_field("Modal",12, "R", "rupiah"); + $pre->add_field("Harga ".ucfirst(strtolower($nama_member)),12, "R", "rupiah"); + if ($this->app->user()->is_level(2)) { + $pre->add_field("Margin",12, "R", "rupiah"); + $pre->add_field("%",5, "R", "rupiah2"); + } + + if ($id_sup > 0) $pre->add_sub_title("Nama Supplier : ".$nama_sup); + if ($id_grup > 0) $pre->add_sub_title("Grup Barang : ".$nama_grup); + + $pre->show_titles(); + $pre->show_headers(); + + $nomor = 0; + while ($row = $stat->fetch(SimplePdo::FETCH_ASSOC)) { + if ($this->app->user()->is_level(2)) { + $pre->add_row([ ++$nomor, $row['Nama_Produk'], $row['Nama_Satuan'], $row['Harga_Pokok'], $row['Harga_Jual'], ((float) $row['Harga_Jual']-(float) $row['Harga_Pokok']), ((((float) $row['Harga_Jual']-(float) $row['Harga_Pokok'])*100)/(float) $row['Harga_Jual']) ]); + } else $pre->add_row([ ++$nomor, $row['Nama_Produk'], $row['Nama_Satuan'], $row['Harga_Jual'] ]); + } + $pre->add_stamp(0, true); + $pre->show(); + } + + private function Produk_Baru(bool $autosave = false): int { + $ino = $this->db->fetchField("SELECT MAX(InvID)+1 FROM inv_produk") ?? 1; + if ($autosave) $this->db->insert('inv_produk', ['InvID' => $ino]); + return $ino; + } + + private function Produk_Save(): void { + if ($this->id_inv === 0) return; + $sku_last = $this->db->fetchField("SELECT MAX(MID(Kode_SKU,6,2)) FROM inv_produk_varian WHERE Kode_SKU LIKE ?", ['%'.(string) $this->id_inv.'%']) ?? 1; + $avarian = $this->db->fetchColumn("SELECT InvVarianID FROM inv_produk_varian WHERE InvID=? AND (Kode_SKU='' OR Kode_SKU LIKE '%BARU%')", [$this->id_inv]); + if (count($avarian) > 0) { + foreach ($avarian as $val) { + $this->db->runQuery("UPDATE inv_produk_varian SET Kode_SKU=? WHERE InvVarianID=?", [Invesa::genEAN8((string) $this->id_inv, $sku_last), $val]); + } + } + } + + private function Produk_Backup(): void { + if ($this->id_inv === 0) return; + $this->db->runQuery("INSERT IGNORE INTO inv_produk_backup (InvID,UserID,Produk,Kemasan,Varian,Harga,MD5Key) SELECT A.InvID,A.UserID,A.Produk,IFNULL(B.Kemasan,'[]'),IFNULL(C.Varian,'[]'),IFNULL(D.Harga,'[]'),UPPER(MD5(CONCAT(A.Produk,IFNULL(B.Kemasan,'[]'),IFNULL(C.Varian,'[]'),IFNULL(D.Harga,'[]')))) FROM (SELECT InvID,UserID,JSON_ARRAYAGG(JSON_OBJECT('InvID',InvID,'Grup_InvID',Grup_InvID,'Nama_Produk',Nama_Produk,'StokID',StokID,'NormalID',NormalID,'PPN',PPN,'Harga_Beli',Harga_Beli,'Harga_Tambah',Harga_Tambah,'Harga_Pokok',Harga_Pokok,'Stok_Min',Stok_Min,'Stok_Max',Stok_Max,'Aktif',Aktif,'UserID',UserID)) Produk FROM inv_produk WHERE InvID='".$this->id_inv."') A LEFT JOIN (SELECT InvID,JSON_ARRAYAGG(JSON_OBJECT('InvKemasanID',InvKemasanID,'InvID',InvID,'SatuanID',SatuanID,'Qty',Qty)) Kemasan FROM inv_produk_kemasan WHERE InvID='".$this->id_inv."') B ON (A.InvID=B.InvID) LEFT JOIN (SELECT InvID,JSON_ARRAYAGG(JSON_OBJECT('InvVarianID',InvVarianID,'InvID',InvID,'SatuanID',SatuanID,'VarianID',VarianID,'Kode_SKU',Kode_SKU,'Kode_Barcode',Kode_Barcode)) Varian FROM inv_produk_varian WHERE InvID='".$this->id_inv."') C ON (A.InvID=C.InvID) LEFT JOIN (SELECT InvID,JSON_ARRAYAGG(JSON_OBJECT('InvHargaID',InvHargaID,'InvID',InvID,'SatuanID',SatuanID,'Grup_MemberID',Grup_MemberID,'Harga_Jual',Harga_Jual)) Harga FROM inv_produk_harga WHERE InvID='".$this->id_inv."') D ON (A.InvID=D.InvID)"); + } + + private function Produk_Restore(): void { + if ($this->id_inv === 0) return; + $_json_produk = []; $_json_kemasan = []; $_json_varian = []; $_json_harga = []; $_userid = 0; + $asql = [$this->id_inv]; $tsql = ''; + if (empty($this->md5_key)) { + $tsql = 'ORDER BY Tanggal DESC'; + } else { + $tsql = 'AND MD5Key=?'; + $asql[] = $this->md5_key; + } + $arow = $this->db->fetchRow("SELECT * FROM inv_produk_backup WHERE InvID=? ".$tsql, $asql); + $_json_produk = json_decode($arow['Produk'] ?? '[]', true); + $_json_kemasan = json_decode($arow['Kemasan'] ?? '[]', true); + $_json_varian = json_decode($arow['Varian'] ?? '[]', true); + $_json_harga = json_decode($arow['Harga'] ?? '[]', true); + $_userid = $arow['UserID'] ?? 0; + if (isset($_json_produk[0]['InvID'])) { + $this->db->runQuery("DELETE FROM inv_produk_kemasan WHERE InvID=?", [$this->id_inv]); + $this->db->runQuery("DELETE FROM inv_produk_varian WHERE InvID=?", [$this->id_inv]); + $this->db->runQuery("DELETE FROM inv_produk_harga WHERE InvID=?", [$this->id_inv]); + foreach($_json_produk as $_key => $val) { + $this->db->runQuery("REPLACE INTO inv_produk (InvID,Grup_InvID,Nama_Produk,StokID,NormalID,PPN,Harga_Beli,Harga_Tambah,Harga_Pokok,Stok_Min,Stok_Max,Aktif,UserID) VALUES ('".$val['InvID']."','".$val['Grup_InvID']."','".$val['Nama_Produk']."','".$val['StokID']."','".$val['NormalID']."','".$val['PPN']."','".$val['Harga_Beli']."','".$val['Harga_Tambah']."','".$val['Harga_Pokok']."','".$val['Stok_Min']."','".$val['Stok_Max']."','".$val['Aktif']."','".$_userid."') LIMIT 1"); + } + foreach($_json_kemasan as $_key => $val) { + $this->db->runQuery("INSERT INTO inv_produk_kemasan (InvKemasanID,InvID,SatuanID,Qty,UserID) VALUES ('".$val['InvKemasanID']."','".$val['InvID']."','".$val['SatuanID']."','".$val['Qty']."','".$_userid."') LIMIT 1"); + } + foreach($_json_varian as $_key => $val) { + $this->db->runQuery("INSERT INTO inv_produk_varian (InvVarianID,InvID,SatuanID,VarianID,Kode_SKU,Kode_Barcode,UserID) VALUES ('".$val['InvVarianID']."','".$val['InvID']."','".$val['SatuanID']."','".$val['VarianID']."','".$val['Kode_SKU']."','".$val['Kode_Barcode']."','".$_userid."') LIMIT 1"); + } + foreach($_json_harga as $_key => $val) { + $this->db->runQuery("INSERT INTO inv_produk_harga (InvHargaID,InvID,SatuanID,Grup_MemberID,Harga_Jual,UserID) VALUES ('".$val['InvHargaID']."','".$val['InvID']."','".$val['SatuanID']."','".$val['Grup_MemberID']."','".$val['Harga_Jual']."','".$_userid."') LIMIT 1"); + } + } + } + + public function index() { + $this->app->json(['html' => ' +
+
Daftar Barang
 
' + ]); + } +} diff --git a/app/Controller/Table/ProdukgrupController.php b/app/Controller/Table/ProdukgrupController.php new file mode 100644 index 0000000..3dfe3c8 --- /dev/null +++ b/app/Controller/Table/ProdukgrupController.php @@ -0,0 +1,121 @@ +app = $app; + $this->db = $db; + $this->mode_detail = Param::Get("mode_detail", ""); + $this->id_grup = (int) Param::Get("Grup_InvID", 0); + } + + public function table_detail() { + if (in_array($this->mode_detail, ["insert","update","delete"])) { + $sql = new SQL($this->app); + $sql->set_table("inv_produk_grup"); + $sql->add_param("Kode_Grup"); + $sql->add_param("Nama_Grup"); + $sql->add_param("Margin"); + $sql->add_param("Aktif"); + $sql->add_param_userid(); + $sql->add_where("Grup_InvID"); + + if ($this->mode_detail === "insert") { + $sql->InsertDB(); + } else if ($this->mode_detail === "update") { + $sql->UpdateDB(); + } else if ($this->mode_detail === "delete") { + $sql->DeleteDB(); + } + } + + $tcari = Param::Get("Cari_Grup"); + $tsql = ''; $asql = []; + if (!empty($tcari)) { + $tsql = 'CONCAT(Kode_Grup,Nama_Grup) LIKE ?'; + $asql[] = '%'. $tcari .'%'; + } + + $obj = new Table($this->app); + $obj->set_table("inv_produk_grup", "*", $tsql, $asql); + $obj->add_field("Grup_InvID", "ID", "hid"); + $obj->add_field("Kode_Grup", "Kode Grup", "l"); + $obj->add_field("Nama_Grup", "Nama Grup Barang", "awr"); + $obj->add_field("Margin", "Margin (%)", "r"); + $obj->add_field("Aktif", "Aktif", "c", "checkbox"); + $obj->set_field_order("Kode_Grup", "A"); + $obj->add_row_btn("clipboard", "Ubah", "ProdukGrupJS.detail_ubah"); + $obj->add_row_btn("trash", "Hapus", "ProdukGrupJS.detail_hapus"); + $obj->set_func_btn("ProdukGrupJS.detail_tambah", "+ Grup Produk"); + $this->app->json([ $obj->json_table("divDetail") ]); + } + + public function form_grup() { + $atabel = ['Grup_InvID'=>0, 'Kode_Grup'=>"", 'Nama_Grup'=>"", 'Margin'=>0, 'Aktif'=>1]; + if ($this->id_grup > 0) { + $atabel = $this->db->fetchRow("SELECT * FROM inv_produk_grup WHERE Grup_InvID=?", [$this->id_grup]); + } + + $form = new Form($this->app); + $tkode = $form->textbox("_", "Kode_Grup", $atabel['Kode_Grup'], true, true, "text", "kode grup produk"); + $tnama = $form->textbox("_", "Nama_Grup", $atabel['Nama_Grup'], true, true, "text", "nama grup produk"); + $tmargin = $form->textbox("_", "Margin", $atabel['Margin'], true, true, "double", "margin minimum"); + $taktif = $form->radio("_", "Aktif", $atabel['Aktif'], true, true, ['1'=>"Aktif",'0'=>"Tidak"]); + $ajson['html'] = ' +
+ +
'.$tkode.'
+
+
+ +
'.$tnama.'
+
+
+ +
'.$tmargin.'
+
+
+ +
'.$taktif.'
+
+ + '; + $this->app->json($ajson); + } + + public function index() { + $this->app->json(['html' => ' +
+
Daftar Grup Barang
 
+
' + ]); + } +} diff --git a/app/Controller/Table/RekposController.php b/app/Controller/Table/RekposController.php new file mode 100644 index 0000000..9c2d4f4 --- /dev/null +++ b/app/Controller/Table/RekposController.php @@ -0,0 +1,121 @@ +app = $app; + $this->db = $db; + $this->mode_detail = Param::Get("mode_detail", ""); + $this->id_kartu = (int) Param::Get("KartuID", 0); + } + + public function table_detail() { + if (in_array($this->mode_detail, ["insert","update","delete"])) { + $sql = new SQL($this->app); + $sql->set_table("para_rek_pos"); + $sql->add_param("Kode_Kartu"); + $sql->add_param("Nama_Kartu"); + $sql->add_param("Kode_Rek"); + $sql->add_param("Aktif"); + $sql->add_param_userid(); + $sql->add_where("KartuID"); + + if ($this->mode_detail === "insert") { + $sql->InsertDB(); + } else if ($this->mode_detail === "update") { + $sql->UpdateDB(); + } else if ($this->mode_detail === "delete") { + $sql->DeleteDB(); + } + } + + $tcari = Param::Get("Cari_Rekpos"); + $tsql = ''; $asql = []; + if (!empty($tcari)) { + $tsql = 'CONCAT(Kode_Kartu,Nama_Kartu) LIKE ?'; + $asql[] = '%'. $tcari .'%'; + } + + $obj = new Table($this->app); + $obj->set_table("para_rek_pos", "*", $tsql, $asql); + $obj->add_field("KartuID", "ID", "hid"); + $obj->add_field("Kode_Kartu", "Kode"); + $obj->add_field("Nama_Kartu", "Nama Jenis Pembayaran", "awr"); + $obj->add_field("Kode_Rek", "Rekening", "c"); + $obj->add_field("Aktif", "Aktif", "c", "checkbox"); + $obj->set_field_order("Kode_Kartu", "A"); + $obj->add_row_btn("clipboard", "Ubah", "RekPOSJS.detail_ubah"); + $obj->add_row_btn("trash", "Hapus", "RekPOSJS.detail_hapus"); + $obj->set_func_btn("RekPOSJS.detail_tambah", "+ Jenis Pembayaran"); + $this->app->json([ $obj->json_table("divDetail") ]); + } + + public function form_rekpos() { + $atabel = ['KartuID'=>0, 'Kode_Kartu'=>"", 'Nama_Kartu'=>"", 'Kode_Rek'=>"", 'Aktif'=>1]; + if ($this->id_kartu > 0) { + $atabel = $this->db->fetchRow("SELECT * FROM para_rek_pos WHERE KartuID=?", [$this->id_kartu]); + } + + $form = new Form($this->app); + $tkode = $form->textbox("_", "Kode_Kartu", $atabel['Kode_Kartu'], true, true, "text", "kode jenis pembayaran"); + $tnama = $form->textbox("_", "Nama_Kartu", $atabel['Nama_Kartu'], true, true, "text", "nama jenis pembayaran"); + $trek = $form->option_db("_", "Kode_Rek", $atabel['Kode_Rek'], true, false, "vi_gel_acc", ["Kode_Rek","Nama_Lengkap"], "Kode_Induk='1100' AND Mode='D' AND Aktif=1 ORDER BY Nama_Lengkap", [0," "]); + $taktif = $form->radio("_", "Aktif", $atabel['Aktif'], true, true, ['1'=>"Aktif",'0'=>"Tidak"]); + $ajson['html'] = ' +
+ +
'.$tkode.'
+
+
+ +
'.$tnama.'
+
+
+ +
'.$trek.'
+
+
+ +
'.$taktif.'
+
+ + '; + $this->app->json($ajson); + } + + public function index() { + $this->app->json(['html' => ' +
+
Daftar Jenis Pembayaran POS
 
+
' + ]); + } +} diff --git a/app/Controller/Table/SatuanController.php b/app/Controller/Table/SatuanController.php new file mode 100644 index 0000000..a1727a9 --- /dev/null +++ b/app/Controller/Table/SatuanController.php @@ -0,0 +1,114 @@ +app = $app; + $this->db = $db; + $this->mode_detail = Param::Get("mode_detail", ""); + $this->id_satuan = (int) Param::Get("SatuanID", 0); + } + + public function table_detail() { + if (in_array($this->mode_detail, ["insert","update","delete"])) { + $sql = new SQL($this->app); + $sql->set_table("para_satuan"); + $sql->add_param("Kode_Satuan"); + $sql->add_param("Nama_Satuan"); + $sql->add_param("Aktif"); + $sql->add_param_userid(); + $sql->add_where("SatuanID"); + + if ($this->mode_detail === "insert") { + $sql->InsertDB(); + } else if ($this->mode_detail === "update") { + $sql->UpdateDB(); + } else if ($this->mode_detail === "delete") { + $sql->DeleteDB(); + } + } + + $tcari = Param::Get("Cari_Satuan"); + $tsql = ''; $asql = []; + if (!empty($tcari)) { + $tsql = 'CONCAT(Kode_Satuan,Nama_Satuan) LIKE ?'; + $asql[] = '%'. $tcari .'%'; + } + + $obj = new Table($this->app); + $obj->set_table("para_satuan", "*", $tsql, $asql); + $obj->add_field("SatuanID", "ID", "hid"); + $obj->add_field("Kode_Satuan", "Kode"); + $obj->add_field("Nama_Satuan", "Nama Satuan", "awr"); + $obj->add_field("Aktif", "Aktif", "c", "checkbox"); + $obj->set_field_order("Kode_Satuan", "A"); + $obj->add_row_btn("clipboard", "Ubah", "SatuanJS.detail_ubah"); + $obj->add_row_btn("trash", "Hapus", "SatuanJS.detail_hapus"); + $obj->set_func_btn("SatuanJS.detail_tambah", "+ Satuan"); + $this->app->json([ $obj->json_table("divDetail") ]); + } + + public function form_satuan() { + $atabel = ['SatuanID'=>0, 'Kode_Satuan'=>"", 'Nama_Satuan'=>"", 'Aktif'=>1]; + if ($this->id_satuan > 0) { + $atabel = $this->db->fetchRow("SELECT * FROM para_satuan WHERE SatuanID=?", [$this->id_satuan]); + } + + $form = new Form($this->app); + $tkode = $form->textbox("_", "Kode_Satuan", $atabel['Kode_Satuan'], true, true, "text", "kode satuan barang"); + $tnama = $form->textbox("_", "Nama_Satuan", $atabel['Nama_Satuan'], true, true, "text", "nama satuan barang"); + $taktif = $form->radio("_", "Aktif", $atabel['Aktif'], true, true, ['1'=>"Aktif",'0'=>"Tidak"]); + $ajson['html'] = ' +
+ +
'.$tkode.'
+
+
+ +
'.$tnama.'
+
+
+ +
'.$taktif.'
+
+ + '; + $this->app->json($ajson); + } + + public function index() { + $this->app->json(['html' => ' +
+
Daftar Satuan Barang
 
+
' + ]); + } +} diff --git a/app/Controller/Table/SupplierController.php b/app/Controller/Table/SupplierController.php new file mode 100644 index 0000000..6c9a96b --- /dev/null +++ b/app/Controller/Table/SupplierController.php @@ -0,0 +1,135 @@ +app = $app; + $this->db = $db; + $this->mode_detail = Param::Get("mode_detail", ""); + $this->id_sup = (int) Param::Get("SupID", 0); + } + + public function table_detail() { + if (in_array($this->mode_detail, ["insert","update","delete"])) { + $sql = new SQL($this->app); + $sql->set_table("para_supplier"); + $sql->add_param("Kode_Sup"); + $sql->add_param("Nama_Sup"); + $sql->add_param("Alamat_Sup"); + $sql->add_param("Telp_Sup"); + $sql->add_param("No_NPWP"); + $sql->add_param("No_NITKU"); + $sql->add_param("Aktif"); + $sql->add_param_userid(); + $sql->add_where("SupID"); + + if ($this->mode_detail === "insert") { + $sql->InsertDB(); + } else if ($this->mode_detail === "update") { + $sql->UpdateDB(); + } else if ($this->mode_detail === "delete") { + $sql->DeleteDB(); + } + } + + $tcari = Param::Get("Cari_Sup"); + $tsql = ''; $asql = []; + if (!empty($tcari)) { + $tsql = 'CONCAT(Kode_Sup,Nama_Sup,Telp_Sup) LIKE ?'; + $asql[] = '%'. $tcari .'%'; + } + + $obj = new Table($this->app); + $obj->set_table("para_supplier", "*", $tsql, $asql); + $obj->add_field("SupID", "ID", "hid"); + $obj->add_field("Kode_Sup", "Kode Supplier"); + $obj->add_field("Nama_Sup", "Nama Supplier", "awr"); + $obj->add_field("Telp_Sup", "No. Telp", "l"); + $obj->add_field("Aktif", "Aktif", "c", "checkbox"); + $obj->set_field_order("Kode_Sup", "A"); + $obj->add_row_btn("clipboard", "Ubah", "SupplierJS.detail_ubah"); + $obj->add_row_btn("trash", "Hapus", "SupplierJS.detail_hapus"); + $obj->set_func_btn("SupplierJS.detail_tambah", "+ Supplier"); + $this->app->json([ $obj->json_table("divDetail") ]); + } + + public function form_supplier() { + $atabel = ['SupID'=>0, 'Kode_Sup'=>"", 'Nama_Sup'=>"", 'Alamat_Sup', 'Telp_Sup'=>"", 'No_NPWP'=>"", 'No_NITKU'=>"", 'Aktif'=>1]; + if ($this->id_sup > 0) { + $atabel = $this->db->fetchRow("SELECT * FROM para_supplier WHERE SupID=?", [$this->id_sup]); + } + + $form = new Form($this->app); + $tkode = $form->textbox("_", "Kode_Sup", $atabel['Kode_Sup'], true, true, "text", "kode supplier"); + $tnama = $form->textbox("_", "Nama_Sup", $atabel['Nama_Sup'], true, true, "text", "nama supplier"); + $talamat = $form->textarea("_", "Alamat_Sup", $atabel['Alamat_Sup'], true, true, 3, "alamat supplier"); + $ttelp = $form->textbox("_", "Telp_Sup", $atabel['Telp_Sup'], true, true, "text", "telp supplier"); + $tnpwp = $form->textbox("NPWP Supplier", "No_NPWP", $atabel['No_NPWP'], true, true, "text", "0000000000000000", 16); + $tnitku = $form->textbox("NITKU Supplier", "No_NITKU", $atabel['No_NITKU'], true, true, "text", "000000", 6); + $taktif = $form->radio("_", "Aktif", $atabel['Aktif'], true, true, ['1'=>"Aktif",'0'=>"Tidak"]); + $ajson['html'] = ' +
+ +
'.$tkode.'
+ +
'.$taktif.'
+
+
+ +
'.$tnama.'
+
+
+ +
'.$talamat.'
+
+
+ +
'.$ttelp.'
+
+
+ +
'.$tnpwp.'
+ +
'.$tnitku.'
+
+ + '; + $this->app->json($ajson); + } + + public function index() { + $this->app->json(['html' => ' +
+
Daftar Supplier
 
+
' + ]); + } +} diff --git a/app/Controller/Table/VarianController.php b/app/Controller/Table/VarianController.php new file mode 100644 index 0000000..af3fe1e --- /dev/null +++ b/app/Controller/Table/VarianController.php @@ -0,0 +1,107 @@ +app = $app; + $this->db = $db; + $this->mode_detail = Param::Get("mode_detail", ""); + $this->id_varian = (int) Param::Get("VarianID", 0); + } + + public function table_detail() { + if (in_array($this->mode_detail, ["insert","update","delete"])) { + $sql = new SQL($this->app); + $sql->set_table("para_varian"); + $sql->add_param("Nama_Varian"); + $sql->add_param("Aktif"); + $sql->add_param_userid(); + $sql->add_where("VarianID"); + + if ($this->mode_detail === "insert") { + $sql->InsertDB(); + } else if ($this->mode_detail === "update") { + $sql->UpdateDB(); + } else if ($this->mode_detail === "delete") { + $sql->DeleteDB(); + } + } + + $tcari = Param::Get("Cari_Varian"); + $tsql = ''; $asql = []; + if (!empty($tcari)) { + $tsql = 'Nama_Varian LIKE ?'; + $asql[] = '%'. $tcari .'%'; + } + + $obj = new Table($this->app); + $obj->set_table("para_varian", "*", $tsql, $asql); + $obj->add_field("VarianID", "ID", "hid"); + $obj->add_field("Nama_Varian", "Nama Varian", "awr"); + $obj->add_field("Aktif", "Aktif", "c", "checkbox"); + $obj->set_field_order("Nama_Varian", "A"); + $obj->add_row_btn("clipboard", "Ubah", "VarianJS.detail_ubah"); + $obj->add_row_btn("trash", "Hapus", "VarianJS.detail_hapus"); + $obj->set_func_btn("VarianJS.detail_tambah", "+ Varian"); + $this->app->json([ $obj->json_table("divDetail") ]); + } + + public function form_varian() { + $atabel = ['VarianID'=>0, 'Nama_Varian'=>"", 'Aktif'=>1]; + if ($this->id_varian > 0) { + $atabel = $this->db->fetchRow("SELECT * FROM para_varian WHERE VarianID=?", [$this->id_varian]); + } + + $form = new Form($this->app); + $tnama = $form->textbox("_", "Nama_Varian", $atabel['Nama_Varian'], true, true, "text", "nama varian barang"); + $taktif = $form->radio("_", "Aktif", $atabel['Aktif'], true, true, ['1'=>"Aktif",'0'=>"Tidak"]); + $ajson['html'] = ' +
+ +
'.$tnama.'
+
+
+ +
'.$taktif.'
+
+ + '; + $this->app->json($ajson); + } + + public function index() { + $this->app->json(['html' => ' +
+
Daftar Varian Barang
 
+
' + ]); + } +} diff --git a/app/Middleware/SecurityHeaders.php b/app/Middleware/SecurityHeaders.php new file mode 100644 index 0000000..3997d7a --- /dev/null +++ b/app/Middleware/SecurityHeaders.php @@ -0,0 +1,69 @@ +app = $app; + $this->session = $session; + } + + public function before(): void { + $url = $this->app->request()->url; + + // check if slash on end url + if ($url !== '/' && substr($url, -1) === '/') { + $clean_url = rtrim($url, '/'); + $this->app->redirect($clean_url, 301); + } + + // check register + if (Register::reg_check($this->session)) { + if (!$this->app->user()->logged() && !str_ends_with($url, '/login') && !str_contains($url, 'monitor') && !str_contains($url, '/cache')) { + $this->app->redirect('login', 307); + $this->app->stop(); + } + } else { + if (!str_ends_with($url, '/401')) { + $this->session->delete('WEB_APP'); + $this->app->redirect('401', 308); + $this->app->stop(); + } + } + + // security + $nonce = $this->app->get('csp_nonce'); + $tracyCssBypass = (Debugger::$showBar === true) ? '\'unsafe-inline\'' : "'nonce-{$nonce}'"; + + $this->app->response()->header('X-Frame-Options', 'SAMEORIGIN'); + $this->app->response()->header("Content-Security-Policy", "default-src 'self'; script-src 'self' 'nonce-{$nonce}'; style-src 'self' {$tracyCssBypass}; img-src 'self' data:; connect-src 'self' ws://localhost:* wss://localhost:*"); + $this->app->response()->header('X-XSS-Protection', '1; mode=block'); + $this->app->response()->header('X-Content-Type-Options', 'nosniff'); + $this->app->response()->header('Referrer-Policy', 'no-referrer-when-downgrade'); + $this->app->response()->header('Strict-Transport-Security', 'max-age=31536000; includeSubDomains; preload'); + $this->app->response()->header('Permissions-Policy', 'geolocation=()'); + } +} diff --git a/app/Scripts/display/config.js b/app/Scripts/display/config.js new file mode 100644 index 0000000..ddd83be --- /dev/null +++ b/app/Scripts/display/config.js @@ -0,0 +1,87 @@ +/******************************************************************* + + PHP Class : /Controller/Display/ConfigController + Description : Konfigurasi Display POS + Created By : Siau Pheng (siaupheng@3fonia.com). + Created Date : August 4th, 2013. + Last Modified : August 31st, 2026. + + (c) 3FONIA Software; WWW.3FONIA.COM. + +*******************************************************************/ + +var DISPConfigJS = { + PHP: '', + KODE: '', + + index: function(){ + $('#butBrow').click(() => this.cab_brow()); + $('#butUbah').click(() => this.proses_edit()); + $('#butSimpan').click(() => this.proses_save()); + this.data_query('form-display'); + }, + + cab_brow: function(){ + var _isi = new String('
 
'); + this.winBCab = FoniaJS.showWindow('BCab', 'Daftar Cabang', _isi, 'lg', '', () => this.data_query('brow-cabang')); + }, + + cab_select: function(acell){ + FoniaJS.closeWindow(this.winBCab); + $('#REG_ID').val(acell[0]); + this.data_query('form-display', 'view'); + }, + + proses_edit: function(){ + this.data_query('form-display', 'edit'); + this.load_port(); + }, + + proses_save: function(){ + this.data_query('form-display', 'save'); + }, + + data_query: function(tipe, mode){ + if (tipe=='form-display'){ + new Request({ + url: this.PHP + '/form_display', + sendParam: ['mode='+mode,'REG_ID','MON_ENABLE','Text_Run','Warna','Font','Promo_Idle','Promo_Durasi','POLE_ENABLE','POLE_PORT','POLE_START1','POLE_START2','POLE_END1','POLE_END2'], + onSuccess: (ajson) => { + $('#divDisplay').html(ajson.html); + $('#Nama_Cabang').val(ajson.Nama_Cab); + this.update_event(); + if (ajson.sukses) FoniaJS.showInfo('Konfigurasi display POS sukses disimpan!'); + } + }).send(); + } else if (tipe=='brow-cabang'){ + new Request.JSONF({ + url: this.PHP + '/brow_cabang', + }).send(); + } + }, + + update_event: function(){ + if ($.inArray($('#mode').val(), ['edit']) >= 0) { + $('#butBrow').prop('disabled', true); + $('#butUbah').prop('disabled', true); + $('#butSimpan').prop('disabled', false); + } else { + $('#butBrow').prop('disabled', false); + $('#butUbah').prop('disabled', false); + $('#butSimpan').prop('disabled', true); + } + }, + + load_port: function(){ + var parent = this; + qz.serial.findPorts().then(function(data){ + var _selport = $('#POLE_PORT').val(); + $('#POLE_PORT').empty(); + for (var i = 0; i < data.length; i++){ + $('