From 0459ce7dc52b306e1e6de5d3e98a95cf79a53696 Mon Sep 17 00:00:00 2001 From: rahman Date: Thu, 12 Jan 2023 16:02:21 +0700 Subject: [PATCH 01/14] fix: datetime in transaction history mobile device --- src/pages/Membership/DetailUser.js | 6 ++---- src/pages/Profile/Profile.js | 5 +---- 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/src/pages/Membership/DetailUser.js b/src/pages/Membership/DetailUser.js index aa8468a..deb1092 100644 --- a/src/pages/Membership/DetailUser.js +++ b/src/pages/Membership/DetailUser.js @@ -1065,10 +1065,8 @@ export const DetailUser = observer(() => {
Transaction Date :{" "} - {format( - parseISO(item.created_at), - "dd-MM-yyyy hh:mm:ss" - )} + { + moment(new Date (item.created_at).toISOString().replace('Z', ' ').replace('T', ' ')).format("MM-DD-YYYY HH:mm:ss") } {" "}

diff --git a/src/pages/Profile/Profile.js b/src/pages/Profile/Profile.js index 62b46e8..57175b2 100644 --- a/src/pages/Profile/Profile.js +++ b/src/pages/Profile/Profile.js @@ -817,10 +817,7 @@ export const Profile = observer(() => {
Transaction Date :{" "} - {format( - parseISO(item.created_at), - "dd-MM-yyyy" - )} + {moment(new Date (item.created_at).toISOString().replace('Z', ' ').replace('T', ' ')).format("MM-DD-YYYY HH:mm:ss")} {" "}

-- 2.45.2 From c16156da50a46b3d26f920b4a9f791bfe31e5211 Mon Sep 17 00:00:00 2001 From: Fadli Date: Mon, 16 Jan 2023 11:42:27 +0700 Subject: [PATCH 02/14] - fix datetime in transaction history --- src/pages/Membership/DetailUser.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/Membership/DetailUser.js b/src/pages/Membership/DetailUser.js index deb1092..abe33e1 100644 --- a/src/pages/Membership/DetailUser.js +++ b/src/pages/Membership/DetailUser.js @@ -1066,7 +1066,7 @@ export const DetailUser = observer(() => { Transaction Date :{" "} { - moment(new Date (item.created_at).toISOString().replace('Z', ' ').replace('T', ' ')).format("MM-DD-YYYY HH:mm:ss") } + moment(new Date (item.created_at).toISOString().slice(0, -1)).format("MM-DD-YYYY HH:mm:ss") } {" "}

-- 2.45.2 From 4ccab348a52709e1c461cfd5b43fb4c3ff072b0a Mon Sep 17 00:00:00 2001 From: Fadli Date: Mon, 16 Jan 2023 11:48:38 +0700 Subject: [PATCH 03/14] - fix datetime in transaction history --- src/pages/Profile/Profile.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/Profile/Profile.js b/src/pages/Profile/Profile.js index 57175b2..768df79 100644 --- a/src/pages/Profile/Profile.js +++ b/src/pages/Profile/Profile.js @@ -817,7 +817,7 @@ export const Profile = observer(() => {
Transaction Date :{" "} - {moment(new Date (item.created_at).toISOString().replace('Z', ' ').replace('T', ' ')).format("MM-DD-YYYY HH:mm:ss")} + {moment(new Date (item.created_at).toISOString().slice(0, -1)).format("MM-DD-YYYY HH:mm:ss")} {" "}

-- 2.45.2 From 770e52a47607fd63c0e631297153b2121eb046ef Mon Sep 17 00:00:00 2001 From: Fadli Date: Tue, 17 Jan 2023 13:22:29 +0700 Subject: [PATCH 04/14] - fix datetime in transaction history in macos --- src/pages/Membership/DetailUser.js | 2 +- src/pages/Profile/Profile.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/pages/Membership/DetailUser.js b/src/pages/Membership/DetailUser.js index abe33e1..c51034f 100644 --- a/src/pages/Membership/DetailUser.js +++ b/src/pages/Membership/DetailUser.js @@ -308,7 +308,7 @@ export const DetailUser = observer(() => { return ( { - moment(new Date (record.created_at).toISOString().replace('Z', ' ').replace('T', ' ')).format("MM-DD-YYYY HH:mm:ss") + moment(new Date (record.created_at).toISOString().slice(0, -1)).format("MM-DD-YYYY HH:mm:ss") } ); diff --git a/src/pages/Profile/Profile.js b/src/pages/Profile/Profile.js index 768df79..ce2da7c 100644 --- a/src/pages/Profile/Profile.js +++ b/src/pages/Profile/Profile.js @@ -238,7 +238,7 @@ export const Profile = observer(() => { render: (text, record) => { return ( - {moment(new Date (record.created_at).toISOString().replace('Z', ' ').replace('T', ' ')).format("MM-DD-YYYY HH:mm:ss")} + {moment(new Date (record.created_at).toISOString().slice(0, -1)).format("MM-DD-YYYY HH:mm:ss")} ); }, -- 2.45.2 From f3eefae54e94243b26308ae7ab0fc500dfe1993b Mon Sep 17 00:00:00 2001 From: Fadli Date: Wed, 22 Feb 2023 06:44:45 +0700 Subject: [PATCH 05/14] - added required field form for adding supplier --- src/component/SupplierComponent.js | 48 ++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/src/component/SupplierComponent.js b/src/component/SupplierComponent.js index e22715a..43b43a6 100644 --- a/src/component/SupplierComponent.js +++ b/src/component/SupplierComponent.js @@ -395,6 +395,54 @@ export const SupplierComponent = observer((props) => { > + + + + + + + + + + + + + + + + + + + + + + + + Date: Thu, 4 May 2023 00:58:10 +0700 Subject: [PATCH 06/14] - added form for between dates transaction history excel export --- src/pages/Membership/DetailUser.js | 14 +++++++++++--- src/pages/Profile/Profile.js | 17 +++++++++++++---- src/store/transaction.js | 2 +- 3 files changed, 25 insertions(+), 8 deletions(-) diff --git a/src/pages/Membership/DetailUser.js b/src/pages/Membership/DetailUser.js index c51034f..0390da1 100644 --- a/src/pages/Membership/DetailUser.js +++ b/src/pages/Membership/DetailUser.js @@ -167,7 +167,8 @@ export const DetailUser = observer(() => { const handleSubmitExport = async () => { const date = formExport.getFieldsValue(); const dataDate ={ - dateStart: moment(date.tanggal_export).format("YYYY-MM-DD") + dateStart: moment(date.start_date).format("YYYY-MM-DD"), + dateEnd: moment(date.end_date).format("YYYY-MM-DD") } modalLoader.setLoading(true); try { @@ -1149,8 +1150,15 @@ export const DetailUser = observer(() => {
+ + + diff --git a/src/pages/Profile/Profile.js b/src/pages/Profile/Profile.js index ce2da7c..855e265 100644 --- a/src/pages/Profile/Profile.js +++ b/src/pages/Profile/Profile.js @@ -389,7 +389,8 @@ export const Profile = observer(() => { const handleSubmitExport = async () => { const date = formExport.getFieldsValue(); const dataDate ={ - dateStart: moment(date.tanggal_export).format("YYYY-MM-DD") + dateStart: moment(date.start_date).format("YYYY-MM-DD"), + dateEnd: moment(date.end_date).format("YYYY-MM-DD") } modalLoader.setLoading(true); try { @@ -1038,9 +1039,17 @@ export const Profile = observer(() => { + + + + diff --git a/src/store/transaction.js b/src/store/transaction.js index 1ac8c0a..ea758df 100644 --- a/src/store/transaction.js +++ b/src/store/transaction.js @@ -285,7 +285,7 @@ export class Transaction { }).then((response) => { var fileDownload = require('react-file-download'); message.success("Success export"); - fileDownload(response.data, `Mutasi Transaki ${data.userDetail.name} ${date.dateStart}.xlsx`); + fileDownload(response.data, `Mutasi Transaki ${data.userDetail.name} ${date.dateStart} - ${date.dateEnd}.xlsx`); return fileDownload; }).catch(function (error) { message.error("No data to export"); -- 2.45.2 From 566a8d089c42a9cdb6f116fbf6ad9dfc27e1cd2f Mon Sep 17 00:00:00 2001 From: Muhammad Fadli Date: Thu, 4 May 2023 02:11:20 +0700 Subject: [PATCH 07/14] - fix pagination between history transaction, etc --- src/pages/Membership/DetailUser.js | 4 ++-- src/pages/Profile/Profile.js | 16 ++++++++-------- src/store/transaction.js | 16 ++++++++++------ 3 files changed, 20 insertions(+), 16 deletions(-) diff --git a/src/pages/Membership/DetailUser.js b/src/pages/Membership/DetailUser.js index 0390da1..dbbdc46 100644 --- a/src/pages/Membership/DetailUser.js +++ b/src/pages/Membership/DetailUser.js @@ -829,8 +829,8 @@ export const DetailUser = observer(() => { }} onChange={async (page) => { let pageNumber = page.current; - store.transaction.pageSize = page.pageSize; - store.transaction.page = pageNumber - 1; + store.transaction.pageSizeHistoryTopUp = page.pageSize; + store.transaction.pageHistoryTopUp = pageNumber - 1; modalLoader.setLoading(true); await getData(); modalLoader.setLoading(false); diff --git a/src/pages/Profile/Profile.js b/src/pages/Profile/Profile.js index 855e265..5d37bb1 100644 --- a/src/pages/Profile/Profile.js +++ b/src/pages/Profile/Profile.js @@ -601,16 +601,16 @@ export const Profile = observer(() => { dataSource={store.transaction.dataHistoryTopUpProfile} bordered pagination={{ - pageSize: store.transaction.pageSize, + pageSize: store.transaction.pageSizeHistoryTopUpProfile, total: store.transaction.total_dataHistoryTopUpProfile, - current: store.transaction.page + 1, + current: store.transaction.pageHistoryTopUpProfile + 1, showSizeChanger: true, simple: false, }} onChange={async (page) => { let pageNumber = page.current; - store.transaction.pageSize = page.pageSize; - store.transaction.page = pageNumber - 1; + store.transaction.pageSizeHistoryTopUpProfile = page.pageSize; + store.transaction.pageHistoryTopUpProfile = pageNumber - 1; modalLoader.setLoading(true); await store.transaction.getDataHistoryTopUpProfile( store.authentication.profileData?.id @@ -854,16 +854,16 @@ export const Profile = observer(() => { dataSource={store.transaction.dataHistorybillProfile} bordered pagination={{ - pageSize: store.transaction.pageSize, + pageSize: store.transaction.pageSizeHistorybillProfile, total: store.transaction.total_dataHistorybillProfile, - current: store.transaction.page + 1, + current: store.transaction.pageHistorybillProfile + 1, showSizeChanger: true, simple: false, }} onChange={async (page) => { let pageNumber = page.current; - store.transaction.pageSize = page.pageSize; - store.transaction.page = pageNumber - 1; + store.transaction.pageSizeHistorybillProfile = page.pageSize; + store.transaction.pageHistorybillProfile = pageNumber - 1; modalLoader.setLoading(true); await store.transaction.getDataHistoryCheckBill(); modalLoader.setLoading(false); diff --git a/src/store/transaction.js b/src/store/transaction.js index ea758df..cab2987 100644 --- a/src/store/transaction.js +++ b/src/store/transaction.js @@ -46,9 +46,13 @@ export class Transaction { dataHistoryTopUp = []; total_dataHistoryTopUp = 0; + pageHistorybillProfile = 0; + pageSizeHistorybillProfile = 10; dataHistorybillProfile = []; total_dataHistorybillProfile = 0; + pageHistoryTopUpProfile = 0; + pageSizeHistoryTopUpProfile = 10; dataHistoryTopUpProfile = []; total_dataHistoryTopUpProfile = 0; @@ -141,12 +145,12 @@ export class Transaction { async getDataHistoryCheckBill() { try { - const response = await http.get( - `/transaction/check-bill-history` - ); // const response = await http.get( - // `/transaction/check-bill-history?page=${this.page}&pageSize=${this.pageSize}&start=${this.filterStart}&end=${this.filterEnd}` + // `/transaction/check-bill-history` // ); + const response = await http.get( + `/transaction/check-bill-history?page=${this.pageHistorybillProfile}&pageSize=${this.pageSizeHistorybillProfile}` + ); console.log("bill", response); this.dataHistorybillProfile = response.body.data ?? []; this.total_dataHistorybillProfile = response?.body?.count ?? 0; @@ -183,7 +187,7 @@ export class Transaction { async getDataHistoryTopUp(id) { try { const response = await http.get( - `/transaction/history-deposit?page=${this.page}&pageSize=${this.pageSize}&user-destination=${id}&start=${this.filterStart}&end=${this.filterEnd}` + `/transaction/history-deposit?page=${this.pageHistoryTopUp}&pageSize=${this.pageSizeHistoryTopUp}&user-destination=${id}&start=${this.filterStart}&end=${this.filterEnd}` ); console.log(response, 'get data history') this.dataHistoryTopUp = response.body.data ?? []; @@ -196,7 +200,7 @@ export class Transaction { async getDataHistoryTopUpProfile(id) { try { const response = await http.get( - `/transaction/history-deposit-profile?page=${this.page}&pageSize=${this.pageSize}&user-destination=${id}&start=${this.filterStart}&end=${this.filterEnd}` + `/transaction/history-deposit-profile?page=${this.pageHistoryTopUpProfile}&pageSize=${this.pageSizeHistoryTopUpProfile}&user-destination=${id}&start=${this.filterStart}&end=${this.filterEnd}` ); console.log(response, 'get data history Profile') this.dataHistoryTopUpProfile = response.body.data ?? []; -- 2.45.2 From e2fea03de93d61a86f92ca6f6a34641fd7cee3a3 Mon Sep 17 00:00:00 2001 From: Muhammad Fadli Date: Thu, 4 May 2023 02:23:33 +0700 Subject: [PATCH 08/14] - fix date time timezone and format in topup history --- src/pages/Membership/DetailUser.js | 7 ++----- src/pages/Profile/Profile.js | 7 ++----- 2 files changed, 4 insertions(+), 10 deletions(-) diff --git a/src/pages/Membership/DetailUser.js b/src/pages/Membership/DetailUser.js index dbbdc46..7226a7a 100644 --- a/src/pages/Membership/DetailUser.js +++ b/src/pages/Membership/DetailUser.js @@ -208,7 +208,7 @@ export const DetailUser = observer(() => { render: (text, record) => { return ( - {format(parseISO(record.transaction_date), "dd MMMM yyyy")} + {moment(new Date (record.transaction_date).toISOString().slice(0, -1)).format("dd MMMM yyyy")} ); }, @@ -900,10 +900,7 @@ export const DetailUser = observer(() => {
Transaction Date :{" "} - {format( - parseISO(item.transaction_date), - "dd-MM-yyyy hh:mm:ss" - )} + {moment(new Date (item.transaction_date).toISOString().slice(0, -1)).format("dd-MM-yyyy hh:mm:ss")} {" "}

diff --git a/src/pages/Profile/Profile.js b/src/pages/Profile/Profile.js index 5d37bb1..3c88d2d 100644 --- a/src/pages/Profile/Profile.js +++ b/src/pages/Profile/Profile.js @@ -273,7 +273,7 @@ export const Profile = observer(() => { render: (text, record) => { return ( - {format(parseISO(record.transaction_date), "dd MMMM yyyy HH:mm:ss")} + {moment(new Date (record.transaction_date).toISOString().slice(0, -1)).format("dd MMMM yyyy HH:mm:ss")} ); }, @@ -678,10 +678,7 @@ export const Profile = observer(() => {
Transaction Date :{" "} - {format( - parseISO(item.transaction_date), - "dd-MM-yyyy" - )} + {moment(new Date (item.transaction_date).toISOString().slice(0, -1)).format("dd-MM-yyyy")} {" "}

-- 2.45.2 From c2d46f8b00ddeb8a7102291a262d3f0bbcd0d820 Mon Sep 17 00:00:00 2001 From: Muhammad Fadli Date: Thu, 4 May 2023 02:36:48 +0700 Subject: [PATCH 09/14] - fix PAGINATION error in transaction history --- src/pages/Membership/DetailUser.js | 10 +++++----- src/pages/Profile/Profile.js | 21 +++++++++------------ 2 files changed, 14 insertions(+), 17 deletions(-) diff --git a/src/pages/Membership/DetailUser.js b/src/pages/Membership/DetailUser.js index 7226a7a..ef56e03 100644 --- a/src/pages/Membership/DetailUser.js +++ b/src/pages/Membership/DetailUser.js @@ -856,15 +856,15 @@ export const DetailUser = observer(() => { position={"top"} pagination={{ onChange: async (page, pageSize) => { - store.transaction.pageSize = pageSize; - store.transaction.page = page - 1; + store.transaction.pageSizeHistoryTopUp = pageSize; + store.transaction.pageHistoryTopUp = page - 1; modalLoader.setLoading(true); await getData(); modalLoader.setLoading(false); }, - pageSize: store.transaction.pageSize, - total: store.transaction.total_data, - current: store.transaction.page + 1, + pageSize: store.transaction.pageSizeHistoryTopUp, + total: store.transaction.total_dataHistoryTopUp, + current: store.transaction.pageHistoryTopUp + 1, style: { marginBottom: "1rem", marginRight: "1rem" }, }} dataSource={store.transaction.dataHistoryTopUp} diff --git a/src/pages/Profile/Profile.js b/src/pages/Profile/Profile.js index 3c88d2d..9d4eec7 100644 --- a/src/pages/Profile/Profile.js +++ b/src/pages/Profile/Profile.js @@ -629,17 +629,17 @@ export const Profile = observer(() => { onChange: async (page, pageSize) => { console.log(page, "Page"); console.log(pageSize, "Page size"); - store.transaction.pageSize = pageSize; - store.transaction.page = page - 1; + store.transaction.pageSizeHistoryTopUpProfile = pageSize; + store.transaction.pageHistoryTopUpProfile = page - 1; modalLoader.setLoading(true); await store.transaction.getDataHistoryTopUpProfile( store.authentication.profileData?.id ); modalLoader.setLoading(false); }, - pageSize: store.transaction.pageSize, + pageSize: store.transaction.pageSizeHistoryTopUpProfile, total: store.transaction.total_dataHistoryTopUpProfile, - current: store.transaction.page + 1, + current: store.transaction.pageHistoryTopUpProfile + 1, style: { marginBottom: "1rem", marginRight: "1rem" }, }} style={{ padding: 0 }} @@ -877,15 +877,15 @@ export const Profile = observer(() => { onChange: async (page, pageSize) => { console.log(page, "Page"); console.log(pageSize, "Page size"); - store.transaction.pageSize = pageSize; - store.transaction.page = page - 1; + store.transaction.pageSizeHistorybillProfile = pageSize; + store.transaction.pageHistorybillProfile = page - 1; modalLoader.setLoading(true); await store.transaction.getDataHistoryCheckBill(); modalLoader.setLoading(false); }, - pageSize: store.transaction.pageSize, + pageSize: store.transaction.pageSizeHistorybillProfile, total: store.transaction.total_dataHistorybillProfile, - current: store.transaction.page + 1, + current: store.transaction.pageHistorybillProfile + 1, style: { marginBottom: "1rem", marginRight: "1rem" }, }} style={{ padding: 0 }} @@ -924,10 +924,7 @@ export const Profile = observer(() => {
Transaction Date :{" "} - {format( - parseISO(item.transaction_date), - "dd-MM-yyyy" - )} + { moment(new Date (item.created_at).toISOString().slice(0, -1)).format("MM-DD-YYYY dd-MM-yyyy") } {" "}

-- 2.45.2 From 55182172198a3043b31b22ae887174583f60a822 Mon Sep 17 00:00:00 2001 From: Muhammad Fadli Date: Thu, 4 May 2023 10:17:17 +0700 Subject: [PATCH 10/14] - fix datetime for history topup --- src/pages/Membership/DetailUser.js | 4 ++-- src/pages/Profile/Profile.js | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/pages/Membership/DetailUser.js b/src/pages/Membership/DetailUser.js index ef56e03..2cfe7c6 100644 --- a/src/pages/Membership/DetailUser.js +++ b/src/pages/Membership/DetailUser.js @@ -208,7 +208,7 @@ export const DetailUser = observer(() => { render: (text, record) => { return ( - {moment(new Date (record.transaction_date).toISOString().slice(0, -1)).format("dd MMMM yyyy")} + {moment(new Date (record.transaction_date).toISOString().slice(0, -1)).format("DD MMMM YYYY")} ); }, @@ -900,7 +900,7 @@ export const DetailUser = observer(() => {
Transaction Date :{" "} - {moment(new Date (item.transaction_date).toISOString().slice(0, -1)).format("dd-MM-yyyy hh:mm:ss")} + {moment(new Date (item.transaction_date).toISOString().slice(0, -1)).format("DD MMMM YYYY hh:mm:ss")} {" "}

diff --git a/src/pages/Profile/Profile.js b/src/pages/Profile/Profile.js index 9d4eec7..3a3afe5 100644 --- a/src/pages/Profile/Profile.js +++ b/src/pages/Profile/Profile.js @@ -273,7 +273,7 @@ export const Profile = observer(() => { render: (text, record) => { return ( - {moment(new Date (record.transaction_date).toISOString().slice(0, -1)).format("dd MMMM yyyy HH:mm:ss")} + {moment(new Date (record.transaction_date).toISOString().slice(0, -1)).format("DD MMMM YYYY HH:mm:ss")} ); }, @@ -678,7 +678,7 @@ export const Profile = observer(() => {
Transaction Date :{" "} - {moment(new Date (item.transaction_date).toISOString().slice(0, -1)).format("dd-MM-yyyy")} + {moment(new Date (item.transaction_date).toISOString().slice(0, -1)).format("DD MMMM YYYY")} {" "}

-- 2.45.2 From 37e65248c2070f7db59f814849a5571e79236cc7 Mon Sep 17 00:00:00 2001 From: Muhammad Fadli Date: Tue, 9 May 2023 18:02:35 +0700 Subject: [PATCH 11/14] - added filter by transaction code in transaction history --- src/pages/Membership/DetailUser.js | 120 ++++++++++++++++++++++++++++- src/pages/Profile/Profile.js | 114 +++++++++++++++++++++++++++ src/store/transaction.js | 6 +- 3 files changed, 237 insertions(+), 3 deletions(-) diff --git a/src/pages/Membership/DetailUser.js b/src/pages/Membership/DetailUser.js index 2cfe7c6..d8013ed 100644 --- a/src/pages/Membership/DetailUser.js +++ b/src/pages/Membership/DetailUser.js @@ -15,7 +15,7 @@ import { Image, Modal, Form, - DatePicker, + DatePicker, Input, } from "antd"; import { UserOutlined, FilterOutlined,ExportOutlined } from "@ant-design/icons"; import { BreadcumbComponent } from "../../component/BreadcumbComponent"; @@ -36,6 +36,7 @@ export const DetailUser = observer(() => { const store = useStore(); const [form] = Form.useForm(); const [formExport] = Form.useForm(); + const [formFilterByTrxCode] = Form.useForm(); const modalLoader = useContext(ModalLoaderContext); const { id } = useParams(); const [visibleModal, setVisibleModal] = useState(false); @@ -43,8 +44,10 @@ export const DetailUser = observer(() => { const [confirmLoading, setConfirmLoading] = useState(false); const [filterStart, setFilterStart] = useState([]); const [filterEnd, setFilterEnd] = useState([]); + const [filterTrxId, setFilterTrxId] = useState([]); const [visibleHis, setVisibleHis] = useState(true); const [actionFilter, setAction] = useState(false); + const [actionFilterByCode, setActionFilterByCode] = useState(false); const [modalExport, setModalExport] = useState(false); useEffect(() => { @@ -389,6 +392,21 @@ export const DetailUser = observer(() => { setAction(false); }; + const handleRemoveFilterByTrxId = async () => { + store.transaction.filterStart = null; + store.transaction.filterEnd = null; + store.transaction.filterTrxId = null; + formFilterByTrxCode.resetFields(); + setFilterStart([]); + setFilterEnd([]); + setFilterTrxId([]); + store.transaction.visibleModalFilterTransactionByCode = false; + setActionFilterByCode(false); + await store.transaction.getDetailHistoryTransaction( + store.authentication.dataProfit.id + ); + }; + const handleCancelFilter = async () => { store.transaction.filterStart = null; store.transaction.filterEnd = null; @@ -404,6 +422,15 @@ export const DetailUser = observer(() => { setAction(false); }; + const handleCancelFilterByTrxId = async () => { + store.transaction.filterStart = null; + store.transaction.filterEnd = null; + store.transaction.filterTrxId = null; + store.transaction.visibleModalFilterTransactionByCode = false; + + setActionFilterByCode(false); + }; + const handleSubmitFilter = async () => { const data = form.getFieldsValue(); store.transaction.filterStart = moment(data.start_date).format( @@ -424,6 +451,20 @@ export const DetailUser = observer(() => { store.transaction.visibleModalFilterTransaction = false; setAction(false); }; + + const handleSubmitFilterByTrxId = async (data) => { + store.transaction.filterStart = null + store.transaction.filterEnd = null + store.transaction.filterTrxId = data.trx_id + modalLoader.setLoading(true); + + modalLoader.setLoading(false); + store.transaction.visibleModalFilterTransactionByCode = false; + setActionFilterByCode(false); + await store.transaction.getDetailHistoryTransaction( + store.authentication.dataProfit.id + ); + }; const footerLayoutFilter = [ , ]; + + const footerLayoutFilterByTrxId = [ + , + , + , + ]; + return (
{ Filter + + { + + { + store.transaction.filterStart = null; + store.transaction.filterEnd = null; + store.transaction.filterTrxId = null; + store.transaction.visibleModalFilterTransactionByCode = false; + actionFilter === true + ? await store.transaction.getDataHistoryTopUp(id) + : await store.transaction.getDetailHistoryTransaction( + store.authentication.dataProfit.id + ); + //await store.transaction.getDetailHistoryTransaction(); + }} + > + + + + + + + + + + + { const store = useStore(); const [form] = Form.useForm(); + const [formFilterByTrxCode] = Form.useForm(); const [formExport] = Form.useForm(); const { id } = useParams(); const modalLoader = useContext(ModalLoaderContext); const [filterStart, setFilterStart] = useState([]); const [filterEnd, setFilterEnd] = useState([]); + const [filterTrxId, setFilterTrxId] = useState([]); const [actionFilter, setAction] = useState(false); + const [actionFilterByCode, setActionFilterByCode] = useState(false); const [visible, setVisible] = useState(false); const [modalExport, setModalExport] = useState(false); @@ -93,6 +96,19 @@ export const Profile = observer(() => { setAction(false); }; + const handleRemoveFilterByTrxId = async () => { + store.transaction.filterStart = null; + store.transaction.filterEnd = null; + store.transaction.filterTrxId = null; + formFilterByTrxCode.resetFields(); + setFilterStart([]); + setFilterEnd([]); + setFilterTrxId([]); + store.transaction.visibleModalFilterTransactionByCode = false; + setActionFilterByCode(false); + await store.transaction.getDataHistoryTransaction(); + }; + const handleCancelFilter = async () => { store.transaction.filterStart = null; //form.resetFields(); @@ -107,6 +123,15 @@ export const Profile = observer(() => { //await store.transaction.getDataHistoryTransaction(); }; + const handleCancelFilterByTrxId = async () => { + store.transaction.filterStart = null; + store.transaction.filterEnd = null; + store.transaction.filterTrxId = null; + store.transaction.visibleModalFilterTransactionByCode = false; + + setActionFilterByCode(false); + }; + const handleSubmitFilter = async () => { const data = form.getFieldsValue(); store.transaction.filterStart = moment(data.start_date).format( @@ -129,6 +154,18 @@ export const Profile = observer(() => { setAction(false); }; + const handleSubmitFilterByTrxId = async (data) => { + store.transaction.filterStart = null + store.transaction.filterEnd = null + store.transaction.filterTrxId = data.trx_id + modalLoader.setLoading(true); + + modalLoader.setLoading(false); + store.transaction.visibleModalFilterTransactionByCode = false; + setActionFilterByCode(false); + await store.transaction.getDataHistoryTransaction(); + }; + const footerLayoutFilter = [ , ]; + + const footerLayoutFilterByTrxId = [ + , + , + , + ]; + const columns = [ { title: "Nama Produk", @@ -705,6 +775,18 @@ export const Profile = observer(() => { Filter + + {store.ui.mediaQuery.isDesktop && (
{ + { + //form.resetFields(); + store.transaction.filterStart = null; + store.transaction.filterEnd = null; + store.transaction.filterTrxId = null; + store.transaction.visibleModalFilterTransactionByCode = false; + actionFilterByCode === true + ? await store.transaction.getDataHistoryTopUpProfile( + store.authentication.profileData?.id + ) + : await store.transaction.getDataHistoryTransaction(); + }} + > + + + + + + + + + + + Date: Wed, 10 May 2023 15:07:44 +0700 Subject: [PATCH 12/14] - added filter by transaction code and IdTrx Mitra in transaction history --- src/pages/Membership/DetailUser.js | 20 ++++++++++++++++---- src/pages/Profile/Profile.js | 19 +++++++++++++++---- src/store/transaction.js | 5 +++-- 3 files changed, 34 insertions(+), 10 deletions(-) diff --git a/src/pages/Membership/DetailUser.js b/src/pages/Membership/DetailUser.js index d8013ed..f4e2dd3 100644 --- a/src/pages/Membership/DetailUser.js +++ b/src/pages/Membership/DetailUser.js @@ -45,6 +45,7 @@ export const DetailUser = observer(() => { const [filterStart, setFilterStart] = useState([]); const [filterEnd, setFilterEnd] = useState([]); const [filterTrxId, setFilterTrxId] = useState([]); + const [filterPartnerTrxId, setFilterPartnerTrxId] = useState([]); const [visibleHis, setVisibleHis] = useState(true); const [actionFilter, setAction] = useState(false); const [actionFilterByCode, setActionFilterByCode] = useState(false); @@ -396,10 +397,12 @@ export const DetailUser = observer(() => { store.transaction.filterStart = null; store.transaction.filterEnd = null; store.transaction.filterTrxId = null; + store.transaction.filterPartnerTrxId = null; formFilterByTrxCode.resetFields(); setFilterStart([]); setFilterEnd([]); setFilterTrxId([]); + setFilterPartnerTrxId([]); store.transaction.visibleModalFilterTransactionByCode = false; setActionFilterByCode(false); await store.transaction.getDetailHistoryTransaction( @@ -426,6 +429,7 @@ export const DetailUser = observer(() => { store.transaction.filterStart = null; store.transaction.filterEnd = null; store.transaction.filterTrxId = null; + store.transaction.filterPartnerTrxId = null; store.transaction.visibleModalFilterTransactionByCode = false; setActionFilterByCode(false); @@ -455,7 +459,8 @@ export const DetailUser = observer(() => { const handleSubmitFilterByTrxId = async (data) => { store.transaction.filterStart = null store.transaction.filterEnd = null - store.transaction.filterTrxId = data.trx_id + store.transaction.filterTrxId = data.trx_id == undefined || data.trx_id == '' ? null : data.trx_id + store.transaction.filterPartnerTrxId = data.partner_trx_id == undefined || data.partner_trx_id == '' ? null : data.partner_trx_id modalLoader.setLoading(true); modalLoader.setLoading(false); @@ -1012,7 +1017,7 @@ export const DetailUser = observer(() => { }} > - Filter By Transaction Code + Filter : kode transaksi/ IDTrx Mitra
{ { store.transaction.filterStart = null; store.transaction.filterEnd = null; store.transaction.filterTrxId = null; + store.transaction.filterPartnerTrxId = null; store.transaction.visibleModalFilterTransactionByCode = false; actionFilter === true ? await store.transaction.getDataHistoryTopUp(id) @@ -1244,7 +1250,13 @@ export const DetailUser = observer(() => { + + + + diff --git a/src/pages/Profile/Profile.js b/src/pages/Profile/Profile.js index 9d711d5..916877a 100644 --- a/src/pages/Profile/Profile.js +++ b/src/pages/Profile/Profile.js @@ -41,6 +41,7 @@ export const Profile = observer(() => { const [filterStart, setFilterStart] = useState([]); const [filterEnd, setFilterEnd] = useState([]); const [filterTrxId, setFilterTrxId] = useState([]); + const [filterPartnerTrxId, setFilterPartnerTrxId] = useState([]); const [actionFilter, setAction] = useState(false); const [actionFilterByCode, setActionFilterByCode] = useState(false); const [visible, setVisible] = useState(false); @@ -100,10 +101,12 @@ export const Profile = observer(() => { store.transaction.filterStart = null; store.transaction.filterEnd = null; store.transaction.filterTrxId = null; + store.transaction.filterPartnerTrxId = null; formFilterByTrxCode.resetFields(); setFilterStart([]); setFilterEnd([]); setFilterTrxId([]); + setFilterPartnerTrxId([]); store.transaction.visibleModalFilterTransactionByCode = false; setActionFilterByCode(false); await store.transaction.getDataHistoryTransaction(); @@ -127,6 +130,7 @@ export const Profile = observer(() => { store.transaction.filterStart = null; store.transaction.filterEnd = null; store.transaction.filterTrxId = null; + store.transaction.filterPartnerTrxId = null; store.transaction.visibleModalFilterTransactionByCode = false; setActionFilterByCode(false); @@ -157,7 +161,8 @@ export const Profile = observer(() => { const handleSubmitFilterByTrxId = async (data) => { store.transaction.filterStart = null store.transaction.filterEnd = null - store.transaction.filterTrxId = data.trx_id + store.transaction.filterTrxId = data.trx_id == undefined || data.trx_id == '' ? null : data.trx_id + store.transaction.filterPartnerTrxId = data.partner_trx_id == undefined || data.partner_trx_id == '' ? null : data.partner_trx_id modalLoader.setLoading(true); modalLoader.setLoading(false); @@ -785,7 +790,7 @@ export const Profile = observer(() => { }} > - Filter By Transaction Code + Filter : kode transaksi/ IDTrx Mitra {store.ui.mediaQuery.isDesktop && (
{ { //form.resetFields(); store.transaction.filterStart = null; store.transaction.filterEnd = null; store.transaction.filterTrxId = null; + store.transaction.filterPartnerTrxId = null; store.transaction.visibleModalFilterTransactionByCode = false; actionFilterByCode === true ? await store.transaction.getDataHistoryTopUpProfile( @@ -1087,10 +1093,15 @@ export const Profile = observer(() => { + + + diff --git a/src/store/transaction.js b/src/store/transaction.js index 7c7e013..322a1fa 100644 --- a/src/store/transaction.js +++ b/src/store/transaction.js @@ -68,6 +68,7 @@ export class Transaction { filterStart = null; filterEnd = null; filterTrxId = null; + filterPartnerTrxId = null; filterStartDetailUser = null; filterEndDetailUser = null; constructor(ctx) { @@ -165,7 +166,7 @@ export class Transaction { async getDataHistoryTransaction() { try { const response = await http.get( - `/transaction/history?page=${this.page}&pageSize=${this.pageSize}&start=${this.filterStart}&end=${this.filterEnd}&trxId=${this.filterTrxId}` + `/transaction/history?page=${this.page}&pageSize=${this.pageSize}&start=${this.filterStart}&end=${this.filterEnd}&trxId=${this.filterTrxId}&partnerTrxId=${this.filterPartnerTrxId}` ); console.log(response); this.dataHistoryTransaction = response.body.data ?? []; @@ -177,7 +178,7 @@ export class Transaction { async getDetailHistoryTransaction(id) { try { - const response = await http.get(`/transaction/history-user/${id}?page=${this.page}&pageSize=${this.pageSize}&start=${this.filterStart}&end=${this.filterEnd}&trxId=${this.filterTrxId}`); + const response = await http.get(`/transaction/history-user/${id}?page=${this.page}&pageSize=${this.pageSize}&start=${this.filterStart}&end=${this.filterEnd}&trxId=${this.filterTrxId}&partnerTrxId=${this.filterPartnerTrxId}`); console.log(response, 'Data Trans'); this.dataDetailHistoryTransactionDetailUser = response.body.data ?? []; this.total_data = response?.body?.count ?? 0; -- 2.45.2 From 429ed99d01c0459eb4e299c4f6ab6dde62e7ffd0 Mon Sep 17 00:00:00 2001 From: Muhammad Fadli Date: Wed, 21 Jun 2023 21:14:16 +0700 Subject: [PATCH 13/14] - added export all in membership --- src/pages/Membership/Membership.js | 116 ++++++++++++++++++++++++++++- src/store/membership.js | 23 +++++- src/store/transaction.js | 23 ++++++ 3 files changed, 159 insertions(+), 3 deletions(-) diff --git a/src/pages/Membership/Membership.js b/src/pages/Membership/Membership.js index 32a275d..9521b40 100644 --- a/src/pages/Membership/Membership.js +++ b/src/pages/Membership/Membership.js @@ -15,26 +15,28 @@ import { Tag, Select, Option, - Typography, + Typography, DatePicker, } from "antd"; import { useStore } from "../../utils/useStore"; import { observer } from "mobx-react-lite"; import { DownloadOutlined, PlusSquareOutlined, - FilterOutlined, + FilterOutlined, ExportOutlined, } from "@ant-design/icons"; import { MembershipModal } from "./MembershipModal"; import { BreadcumbComponent } from "../../component/BreadcumbComponent"; import { LINKS } from "../../routes/app"; import { useHistory } from "react-router-dom"; import { ModalLoaderContext } from "../../utils/modal"; +import moment from "moment"; export const Membership = observer(() => { const history = useHistory(); const { Option } = Select; const { Title } = Typography; const [form] = Form.useForm(); + const [formExport] = Form.useForm(); const store = useStore(); const [visibleModal, setVisibleModal] = useState(false); const [isVisibleTopUpModal, setIsVisibleTopUpModal] = useState(false); @@ -44,6 +46,9 @@ export const Membership = observer(() => { const modalLoader = useContext(ModalLoaderContext); const [filterMembership, setFilterMembership] = useState([]); const [filterPartner, setFilterPartner] = useState([]); + const [filterBuyer, setFilterBuyer] = useState(""); + const [modalExport, setModalExport] = useState(false); + const [filterSupplier, setFilterSupplier] = useState(""); useEffect(() => { const init = async () => { @@ -52,8 +57,10 @@ export const Membership = observer(() => { const isAdmin = store.authentication.userData.role === "Admin"; await getData(); await store.membership.getData(); + await store.membership.getDataFilter(); await store.membership.getDataBySuperior(); await store.partner.getData(); + await store.supplier.getData(); await store.role.getData(isAdmin); modalLoader.setLoading(false); } catch (e) { @@ -167,6 +174,29 @@ export const Membership = observer(() => { setDestination(null); }; + const handleSubmitExport = async () => { + const date = formExport.getFieldsValue(); + const dataAll ={ + dateStart: moment(date.start_date).format("YYYY-MM-DD"), + dateEnd: moment(date.end_date).format("YYYY-MM-DD"), + supplier: filterSupplier, + buyer: filterBuyer + } + modalLoader.setLoading(true); + try { + await store.transaction.exportTransactionAll(dataAll) + // console.log('responseiniyak', response); + // message.success("Success export"); + setModalExport(false); + modalLoader.setLoading(false); + } catch (e) { + setModalExport(false); + console.error(e, "apa errornya"); + message.error(e.response?.body?.message || "Failed to export"); + modalLoader.setLoading(false); + } + }; + const columns = [ { title: "Nama", @@ -344,6 +374,16 @@ export const Membership = observer(() => { Filter )} + {store.authentication.userData.role === "Admin" && ( + + )} {/* { + + { + setModalExport(false); + }} + > + + + + + + + + + + + + + + + + + + + ); }); diff --git a/src/store/membership.js b/src/store/membership.js index fda2a67..03ed3e7 100644 --- a/src/store/membership.js +++ b/src/store/membership.js @@ -5,6 +5,7 @@ export class Membership { page = 0; pageSize = 10 data = []; + dataFilterMembership = []; total_data = 0; dataTotal=0; @@ -44,6 +45,26 @@ export class Membership { } } + async getDataFilter() { + try { + const response = await http.get(`/users?page=${this.page}&pageSize=1000&superior=${this.filterMembership}&type=${this.filterPartner}`); + this.dataFilterMembership = response.body.data ?? [] + this.dataFilterMembership = response.body.data.map((item, idx) => { + item.key = idx; + item.name = item?.user_detail?.name; + item.username = item?.username + item.phone_number = item?.user_detail?.phone_number; + item.roleId = item?.roles.id; + item.roleName = item?.roles.name; + return item + }) ?? [] + + console.log(this.dataTotal) + } catch (e) { + console.error(e); + } + } + async getDetail(id) { try { const response = await http.get(`/users/`+id); @@ -53,7 +74,7 @@ export class Membership { console.error(e); } } - + async getDataBySuperior() { try { const response = await http.get(`/users/find-by-supperior?page=${this.page}&pageSize=${this.pageSize}`); diff --git a/src/store/transaction.js b/src/store/transaction.js index 322a1fa..1e4cce5 100644 --- a/src/store/transaction.js +++ b/src/store/transaction.js @@ -303,4 +303,27 @@ export class Transaction { console.error(e,':)') } } + + exportTransactionAll(data) { + try { + axios({ + url: appConfig.apiUrl + `/excel/history-user/export-all`, + headers: {"Authorization" : `Bearer ${TokenUtil.accessToken}`}, + method: 'POST', + data: data, + responseType: 'blob' + }).then((response) => { + var fileDownload = require('react-file-download'); + message.success("Success export"); + fileDownload(response.data, `Mutasi Transaksi ${data.dateStart} - ${data.dateEnd}.xlsx`); + return fileDownload; + }).catch(function (error) { + message.error("No data to export"); + return error; + }); + + } catch (e) { + console.error(e,':)') + } + } } -- 2.45.2 From ee0e28886631572e19ed6e51d7b2388a2b370782 Mon Sep 17 00:00:00 2001 From: Muhammad Fadli Date: Wed, 23 Aug 2023 12:03:05 +0700 Subject: [PATCH 14/14] - fix admin partner cant see markup price --- src/pages/Product/ProductDetail.js | 372 +++++++++++++++-------------- 1 file changed, 188 insertions(+), 184 deletions(-) diff --git a/src/pages/Product/ProductDetail.js b/src/pages/Product/ProductDetail.js index 17fceea..907eccb 100644 --- a/src/pages/Product/ProductDetail.js +++ b/src/pages/Product/ProductDetail.js @@ -57,39 +57,39 @@ export const ProductDetail = observer(() => { dataIndex: "mark_up_price", key: "mark_up_price", render: (text) => - new Intl.NumberFormat("id-ID", { - style: "currency", - currency: "IDR", - }).format(text), + new Intl.NumberFormat("id-ID", { + style: "currency", + currency: "IDR", + }).format(text), }, { title: "Price", dataIndex: "price", key: "price", render: (text) => - new Intl.NumberFormat("id-ID", { - style: "currency", - currency: "IDR", - }).format(text), + new Intl.NumberFormat("id-ID", { + style: "currency", + currency: "IDR", + }).format(text), }, { title: "Biaya Admin", dataIndex: "admin_price", key: "admin_price", render: (text) => - new Intl.NumberFormat("id-ID", { - style: "currency", - currency: "IDR", - }).format(text), + new Intl.NumberFormat("id-ID", { + style: "currency", + currency: "IDR", + }).format(text), }, { title: "Partner fee", dataIndex: "partner_fee", key: "partner_fee", render: (text) => - new Intl.NumberFormat("id-ID", { - style: "currency", - currency: "IDR", - }).format(text), + new Intl.NumberFormat("id-ID", { + style: "currency", + currency: "IDR", + }).format(text), }, { title: "Tanggal Berlaku", @@ -97,7 +97,7 @@ export const ProductDetail = observer(() => { key: "startDate", render: (text) => { return ( - {text ? format(parseISO(text), "dd MMMM yyyy") : "-"} + {text ? format(parseISO(text), "dd MMMM yyyy") : "-"} ); }, }, @@ -107,174 +107,178 @@ export const ProductDetail = observer(() => { key: "endDate", render: (text) => { return ( - - {text ? format(parseISO(text), "dd MMMM yyyy") : "Sampai Sekarang"} - + + {text ? format(parseISO(text), "dd MMMM yyyy") : "Sampai Sekarang"} + ); }, }, ]; + if (store.authentication.userData.role === "Admin Partner") delete columns[0]; + if (store.authentication.userData.role === "Admin Partner") delete columns[3]; + const styleSaldoTitle = store.ui.mediaQuery.isDesktop - ? { - display: "flex", - justifyContent: "center", - } - : { fontSize: "0.75rem" }; + ? { + display: "flex", + justifyContent: "center", + } + : { fontSize: "0.75rem" }; const styleSaldoContent = store.ui.mediaQuery.isDesktop - ? { - fontSize: "1.25rem", - display: "flex", - justifyContent: "center", - } - : null; + ? { + fontSize: "1.25rem", + display: "flex", + justifyContent: "center", + } + : null; return ( -
- - - Product Detail - -
- - - Kode - - - {store.product?.dataDetailProduct?.code} - - - Nama Produk - - - {store.product?.dataDetailProduct?.name} - - - Supplier - - - {store.product?.dataDetailProduct?.supplier?.name} - - - Status - - - {store.product?.dataDetailProduct?.status} - - - - - - -
- - Product Price History - - {store.ui.mediaQuery.isDesktop && ( -
{ - let pageNumber = page.current; - store.product.pageSizePriceHistory = page.pageSize; - store.product.pagePriceHistory = pageNumber - 1; - modalLoader.setLoading(true); - await store.product.getPriceHistoryByProduct(id); - modalLoader.setLoading(false); - }} - /> - )} - {store.ui.mediaQuery.isMobile && ( - { - store.product.pageSizePriceHistory = pageSize; - store.product.pagePriceHistory = page - 1; - modalLoader.setLoading(true); - await store.product.getPriceHistoryByProduct(id); - modalLoader.setLoading(false); - }, - pageSize: store.product.pageSizePriceHistory, - total: store.product.totalDataPriceHistory, - current: store.product.pagePriceHistory + 1, - style: { marginBottom: "1rem", marginRight: "1rem" }, - }} - dataSource={store.product.dataPriceHistory} - style={{ padding: 0 }} - renderItem={(item) => { - return ( -
- - -

- +

+ + + Product Detail + +
+ + + Kode + + + {store.product?.dataDetailProduct?.code} + + + Nama Produk + + + {store.product?.dataDetailProduct?.name} + + + Supplier + + + {store.product?.dataDetailProduct?.supplier?.name} + + + Status + + + {store.product?.dataDetailProduct?.status} + + + + + + +
+ + Product Price History + + {store.ui.mediaQuery.isDesktop && ( +
{ + let pageNumber = page.current; + store.product.pageSizePriceHistory = page.pageSize; + store.product.pagePriceHistory = pageNumber - 1; + modalLoader.setLoading(true); + await store.product.getPriceHistoryByProduct(id); + modalLoader.setLoading(false); + }} + /> + )} + {store.ui.mediaQuery.isMobile && ( + { + store.product.pageSizePriceHistory = pageSize; + store.product.pagePriceHistory = page - 1; + modalLoader.setLoading(true); + await store.product.getPriceHistoryByProduct(id); + modalLoader.setLoading(false); + }, + pageSize: store.product.pageSizePriceHistory, + total: store.product.totalDataPriceHistory, + current: store.product.pagePriceHistory + 1, + style: { marginBottom: "1rem", marginRight: "1rem" }, + }} + dataSource={store.product.dataPriceHistory} + style={{ padding: 0 }} + renderItem={(item) => { + return ( +
+ + +

+ {store.authentication.userData.role === "Admin" ? + ` Markup Price :{" "} {new Intl.NumberFormat("id-ID", { style: "currency", currency: "IDR", }).format(item.mark_up_price)} - {" "} -
- - Price:{" "} - {new Intl.NumberFormat("id-ID", { - style: "currency", - currency: "IDR", - }).format(item.price)} - {" "} -
- - {" "} - Tanggal Berlaku : - {item.startDate - ? format( - parseISO(item.startDate), - "dd MMMM yyyy" - ) - : "-"} - {" "} -
- - Tanggal Berakhir :{" "} - {item.endDate - ? format( - parseISO(item.endDate), - "dd MMMM yyyy" - ) - : "Sampai Sekarang"} - {" "} -
-

-

-
- } - /> - {/*
+ {" "}` : ''} +
+ + Price:{" "} + {new Intl.NumberFormat("id-ID", { + style: "currency", + currency: "IDR", + }).format(item.price)} + {" "} +
+ + {" "} + Tanggal Berlaku : + {item.startDate + ? format( + parseISO(item.startDate), + "dd MMMM yyyy" + ) + : "-"} + {" "} +
+ + Tanggal Berakhir :{" "} + {item.endDate + ? format( + parseISO(item.endDate), + "dd MMMM yyyy" + ) + : "Sampai Sekarang"} + {" "} +
+

+

+
+ } + /> + {/*

{

*/} - - - - ); - }} - /> - )} - - - -
- -
+ + + + ); + }} + /> + )} + + + +
+ +
); }); -- 2.45.2