diff --git a/src/modules/reports/shared/configs/transaction-report/configs/income-per-item-master.ts b/src/modules/reports/shared/configs/transaction-report/configs/income-per-item-master.ts new file mode 100644 index 0000000..69de3a5 --- /dev/null +++ b/src/modules/reports/shared/configs/transaction-report/configs/income-per-item-master.ts @@ -0,0 +1,340 @@ +import { + DATA_FORMAT, + DATA_TYPE, + FILTER_FIELD_TYPE, + FILTER_TYPE, + REPORT_GROUP, +} from '../../../constant'; +import { ReportConfigEntity } from '../../../entities/report-config.entity'; +import { TransactionType } from 'src/modules/transaction/transaction/constants'; +import { STATUS } from 'src/core/strings/constants/base.constants'; + +export default { + group_name: REPORT_GROUP.transaction_report, + unique_name: `${REPORT_GROUP.transaction_report}__income_per_item_master`, + label: 'Pendapatan Per Item Master', + table_schema: `transactions main + LEFT JOIN transaction_items tr_item ON tr_item.transaction_id::text = main.id::text + LEFT JOIN transaction_item_breakdowns tr_item_bundling ON tr_item_bundling.transaction_item_id::text = tr_item.id::text + LEFT JOIN refunds refund ON refund.transaction_id = main.id + LEFT JOIN items item ON item.id::text = tr_item.item_id::text + LEFT JOIN users tenant ON tenant.id::text = item.tenant_id::text + LEFT JOIN refund_items refund_item ON refund_item.refund_item_id::text = tr_item.item_id::text`, + main_table_alias: 'main', + whereDefaultConditions: [ + { + column: 'main.status', + filter_type: FILTER_TYPE.TEXT_IN_MEMBER, + values: [STATUS.SETTLED, STATUS.REFUNDED, STATUS.PROCESS_REFUND], + }, + ], + defaultOrderBy: [], + lowLevelOrderBy: [], + filter_period_config: { + hidden: true, + }, + + column_configs: [ + { + column: 'main__settlement_date', + query: 'main.settlement_date', + label: 'Tanggal Pendapatan', + type: DATA_TYPE.DIMENSION, + format: DATA_FORMAT.DATE_TIMESTAMP, + date_format: 'DD/MM/YYYY', + }, + { + column: 'item_owner', + query: `CASE WHEN tenant.name is not null THEN tenant.name ELSE 'Company' END`, + label: 'Kepemilikan', + type: DATA_TYPE.DIMENSION, + format: DATA_FORMAT.TEXT, + }, + { + column: 'main__type', + query: 'main.type', + label: 'Sumber', + type: DATA_TYPE.DIMENSION, + format: DATA_FORMAT.TEXT, + }, + { + column: 'main__invoice_code', + query: 'main.invoice_code', + label: 'Kode Booking', + type: DATA_TYPE.DIMENSION, + format: DATA_FORMAT.TEXT, + }, + { + column: 'main__payment_code', + query: 'main.payment_code', + label: 'Kode Pembayaran', + type: DATA_TYPE.DIMENSION, + format: DATA_FORMAT.TEXT, + }, + { + column: 'tr_item__item_category_name', + query: 'tr_item.item_category_name', + label: 'Kategori Item', + type: DATA_TYPE.DIMENSION, + format: DATA_FORMAT.TEXT, + }, + { + column: 'tr_item__item_name', + query: 'tr_item.item_name', + label: 'Nama Item', + type: DATA_TYPE.DIMENSION, + format: DATA_FORMAT.TEXT, + }, + { + column: 'tr_item__breakdown_bundling', + query: 'tr_item.breakdown_bundling', + label: 'Breakdown Bundling', + type: DATA_TYPE.DIMENSION, + format: DATA_FORMAT.BOOLEAN, + }, + { + column: 'tr_item_bundling__item_name', + query: 'tr_item_bundling.item_name', + label: 'Nama Item Bundling', + type: DATA_TYPE.DIMENSION, + format: DATA_FORMAT.TEXT, + }, + { + column: 'main__customer_type', + query: 'main.customer_type', + label: 'Tipe Pelanggan', + type: DATA_TYPE.DIMENSION, + format: DATA_FORMAT.TEXT, + }, + { + column: 'main__creator_counter_no', + query: 'main.creator_counter_no', + label: 'No.PoS', + type: DATA_TYPE.DIMENSION, + format: DATA_FORMAT.TEXT, + }, + { + column: 'tr_item__qty', + query: 'tr_item.qty', + label: 'Qty', + type: DATA_TYPE.DIMENSION, + format: DATA_FORMAT.NUMBER, + }, + { + column: 'tr_item__total_hpp', + query: 'tr_item.total_hpp', + label: 'Total HPP', + type: DATA_TYPE.MEASURE, + format: DATA_FORMAT.CURRENCY, + }, + // TODO => tambahkan total dpp per item + // TODO => tambahkan total tax + { + column: 'tr_item__total_price', + query: 'tr_item.total_price', + label: 'Total Penjualan', + type: DATA_TYPE.MEASURE, + format: DATA_FORMAT.CURRENCY, + }, + { + column: 'refund__refund_date', + query: 'refund.refund_date', + label: 'Tanggal Pengembalian', + type: DATA_TYPE.DIMENSION, + format: DATA_FORMAT.DATE_TIMESTAMP, + date_format: 'DD/MM/YYYY', + }, + { + column: 'refund__status', + query: 'refund.status', + label: 'Status Pengembalian', + type: DATA_TYPE.DIMENSION, + format: DATA_FORMAT.TEXT, + }, + { + column: 'refund__code', + query: 'refund.code', + label: 'Kode Pengembalian', + type: DATA_TYPE.DIMENSION, + format: DATA_FORMAT.TEXT, + }, + { + column: 'refund_item__qty_refund', + query: 'refund_item.qty_refund', + label: 'Qty Pengembalian', + type: DATA_TYPE.DIMENSION, + format: DATA_FORMAT.NUMBER, + }, + { + column: 'refund_item__refund_total', + query: '(refund_item.refund_total * -1)', + label: 'Total Pengembalian', + type: DATA_TYPE.MEASURE, + format: DATA_FORMAT.CURRENCY, + }, + + { + column: 'transaction_balance', + query: `CASE WHEN refund.id is null THEN tr_item.total_price ELSE tr_item.total_price - refund_item.refund_total END`, + label: 'Balance', + type: DATA_TYPE.MEASURE, + format: DATA_FORMAT.CURRENCY, + }, + { + column: 'tr_item__item_tenant_share_margin', + query: 'tr_item.item_tenant_share_margin', + label: 'Profile Share (IDR)', + type: DATA_TYPE.MEASURE, + format: DATA_FORMAT.CURRENCY, + }, + { + column: 'tenant_income', + query: 'tr_item.total_price - tr_item.item_tenant_share_margin', + label: 'Pendapatan Tenant', + type: DATA_TYPE.DIMENSION, + format: DATA_FORMAT.CURRENCY, + }, + + { + column: 'main__customer_name', + query: 'main.customer_name', + label: 'Nama Pelanggan', + type: DATA_TYPE.DIMENSION, + format: DATA_FORMAT.TEXT, + }, + { + column: 'main__customer_description', + query: 'main.customer_description', + label: 'Deskripsi', + type: DATA_TYPE.DIMENSION, + format: DATA_FORMAT.TEXT, + }, + { + column: 'main__customer_phone', + query: 'main.customer_phone', + label: 'Telepon', + type: DATA_TYPE.DIMENSION, + format: DATA_FORMAT.TEXT, + }, + { + column: 'main__creator_name', + query: 'main.creator_name', + label: 'Dibuat Oleh', + type: DATA_TYPE.DIMENSION, + format: DATA_FORMAT.TEXT, + }, + ], + whereCondition(filterModel) { + const queryFilter = []; + const breakdown = filterModel.tr_item__breakdown_bundling; + if (breakdown) { + const value = breakdown.filter.map((item) => { + return item === 'Yes' ? true : false; + }); + + queryFilter.push(`tr_item.breakdown_bundling in (${value.join()})`); + } + return queryFilter; + }, + ignore_filter_keys: ['tr_item__breakdown_bundling'], + filter_configs: [ + { + filed_label: 'Tanggal Pendapatan', + filter_column: 'main__settlement_date', + field_type: FILTER_FIELD_TYPE.date_range_picker, + filter_type: FILTER_TYPE.DATE_IN_RANGE_TIMESTAMP, + }, + { + filed_label: 'Kepemilikan', + filter_column: 'item_owner', + field_type: FILTER_FIELD_TYPE.input_tag, + filter_type: FILTER_TYPE.TEXT_MULTIPLE_CONTAINS, + }, + { + filed_label: 'Sumber', + filter_column: 'main__type', + field_type: FILTER_FIELD_TYPE.select, + filter_type: FILTER_TYPE.TEXT_IN_MEMBER, + select_custom_options: [...Object.values(TransactionType)], + }, + { + filed_label: 'Kode Booking', + filter_column: 'main__invoice_code', + field_type: FILTER_FIELD_TYPE.input_tag, + filter_type: FILTER_TYPE.TEXT_MULTIPLE_CONTAINS, + }, + { + filed_label: 'Kode Pembayaran', + filter_column: 'main__payment_code', + field_type: FILTER_FIELD_TYPE.input_tag, + filter_type: FILTER_TYPE.TEXT_MULTIPLE_CONTAINS, + }, + { + filed_label: 'Kategori Item', + filter_column: 'tr_item__item_category_name', + field_type: FILTER_FIELD_TYPE.input_tag, + filter_type: FILTER_TYPE.TEXT_MULTIPLE_CONTAINS, + }, + { + filed_label: 'Nama Item', + filter_column: 'tr_item__item_name', + field_type: FILTER_FIELD_TYPE.input_tag, + filter_type: FILTER_TYPE.TEXT_MULTIPLE_CONTAINS, + }, + { + filed_label: 'Breakdown Item', + filter_column: 'tr_item__breakdown_bundling', + field_type: FILTER_FIELD_TYPE.select, + filter_type: FILTER_TYPE.TEXT_MULTIPLE_CONTAINS, + select_custom_options: ['Yes', 'No'], + }, + { + filed_label: 'Nama Item Bundling', + filter_column: 'tr_item_bundling__item_name', + field_type: FILTER_FIELD_TYPE.input_tag, + filter_type: FILTER_TYPE.TEXT_MULTIPLE_CONTAINS, + }, + { + filed_label: 'Tipe Pelanggan', + filter_column: 'main__customer_type', + field_type: FILTER_FIELD_TYPE.input_tag, + filter_type: FILTER_TYPE.TEXT_MULTIPLE_CONTAINS, + }, + { + filed_label: 'No. PoS', + filter_column: 'main__creator_counter_no', + field_type: FILTER_FIELD_TYPE.input_tag, + filter_type: FILTER_TYPE.TEXT_MULTIPLE_CONTAINS, + }, + { + filed_label: 'Tanggal Pengembalian', + filter_column: 'refund__refund_date', + field_type: FILTER_FIELD_TYPE.date_range_picker, + filter_type: FILTER_TYPE.DATE_IN_RANGE_TIMESTAMP, + }, + { + filed_label: 'Kode Pengembalian', + filter_column: 'refund__code', + field_type: FILTER_FIELD_TYPE.input_tag, + filter_type: FILTER_TYPE.TEXT_MULTIPLE_CONTAINS, + }, + { + filed_label: 'Nama Pelanggan', + filter_column: 'main__customer_name', + field_type: FILTER_FIELD_TYPE.input_tag, + filter_type: FILTER_TYPE.TEXT_MULTIPLE_CONTAINS, + }, + { + filed_label: 'Bank/Issuer', + filter_column: 'main__payment_type_method_name', + field_type: FILTER_FIELD_TYPE.input_tag, + filter_type: FILTER_TYPE.TEXT_MULTIPLE_CONTAINS, + }, + { + filed_label: 'Dibuat Oleh', + filter_column: 'main__creator_name', + field_type: FILTER_FIELD_TYPE.input_tag, + filter_type: FILTER_TYPE.TEXT_MULTIPLE_CONTAINS, + }, + ], +}; diff --git a/src/modules/reports/shared/configs/transaction-report/index.ts b/src/modules/reports/shared/configs/transaction-report/index.ts index 1f3b73a..c116baa 100644 --- a/src/modules/reports/shared/configs/transaction-report/index.ts +++ b/src/modules/reports/shared/configs/transaction-report/index.ts @@ -2,6 +2,7 @@ import { ReportConfigEntity } from '../../entities/report-config.entity'; import IncomeReport from './configs/income'; import IncomeReportPerItem from './configs/income-per-item'; +import IncomeReportPerItemMaster from './configs/income-per-item-master'; import GivingDiscount from './configs/giving-discounts'; import VisitorsPerRideReport from './configs/visitors-per-ride'; import TimePerRideReport from './configs/time-per-ride'; @@ -14,6 +15,7 @@ import ReconciliationReport from './configs/reconciliation'; export const TransactionReportConfig: ReportConfigEntity[] = [ IncomeReport, IncomeReportPerItem, + IncomeReportPerItemMaster, GivingDiscount, // VisitorsPerRideReport, // TimePerRideReport,