pos-be/src/modules/transaction/transaction/data/models/transaction.model.ts

281 lines
8.3 KiB
TypeScript

import { TABLE_NAME } from 'src/core/strings/constants/table.constants';
import { TransactionEntity } from '../../domain/entities/transaction.entity';
import {
Column,
Entity,
JoinColumn,
ManyToOne,
OneToMany,
OneToOne,
} from 'typeorm';
import { BaseStatusModel } from 'src/core/modules/data/model/base-status.model';
import {
TransactionType,
TransactionUserType,
TransactionPaymentType,
} from '../../constants';
import { TransactionItemModel } from './transaction-item.model';
import { TransactionTaxModel } from './transaction-tax.model';
import { STATUS } from 'src/core/strings/constants/base.constants';
import { RefundModel } from 'src/modules/transaction/refund/data/models/refund.model';
import { TransactionDemographyModel } from './transaction-demography.model';
import { VipCategoryModel } from 'src/modules/transaction/vip-category/data/models/vip-category.model';
@Entity(TABLE_NAME.TRANSACTION)
export class TransactionModel
extends BaseStatusModel<TransactionEntity>
implements TransactionEntity
{
// general info
@Column('bool', { name: 'is_recap_transaction', default: false })
is_recap_transaction: boolean;
@Column('enum', {
name: 'type',
enum: TransactionType,
default: TransactionType.ADMIN,
})
type: TransactionType;
@Column('varchar', { name: 'invoice_code', nullable: true })
invoice_code: string;
@Column('int', { name: 'creator_counter_no', nullable: true })
creator_counter_no: number;
@Column('varchar', { name: 'creator_counter_name', nullable: true })
creator_counter_name: string;
// season data
@Column('varchar', { name: 'season_period_id', nullable: true })
season_period_id: string;
@Column('varchar', { name: 'season_period_name', nullable: true })
season_period_name: string;
@Column('varchar', { name: 'season_period_type_id', nullable: true })
season_period_type_id: string;
@Column('varchar', { name: 'season_period_type_name', nullable: true })
season_period_type_name: string;
@ManyToOne(() => VipCategoryModel)
@JoinColumn({ name: 'customer_category_id' })
customer_category: VipCategoryModel;
// customer info
@Column('enum', {
name: 'customer_type',
enum: TransactionUserType,
nullable: true,
})
customer_type: TransactionUserType;
@Column('varchar', { name: 'customer_category_id', nullable: true })
customer_category_id: string;
@Column('varchar', { name: 'customer_category_name', nullable: true })
customer_category_name: string;
@Column('varchar', { name: 'customer_name', nullable: true })
customer_name: string;
@Column('varchar', { name: 'customer_phone', nullable: true })
customer_phone: string;
@Column('varchar', { name: 'customer_email', nullable: true })
customer_email: string;
@Column('varchar', { name: 'customer_description', nullable: true })
customer_description: string;
@Column('varchar', { name: 'no_of_group', nullable: true })
no_of_group: number;
@Column('date', { name: 'booking_date', nullable: true })
booking_date: Date;
@Column('date', { name: 'booking_date_before', nullable: true })
booking_date_before: Date;
@Column('date', { name: 'settlement_date', nullable: true })
settlement_date: Date;
@Column('date', { name: 'invoice_date', nullable: true })
invoice_date: Date;
// discount data
@Column('varchar', { name: 'discount_code_id', nullable: true })
discount_code_id: string;
@Column('varchar', { name: 'discount_code', nullable: true })
discount_code: string;
@Column('decimal', { name: 'discount_percentage', nullable: true })
discount_percentage: number;
@Column('decimal', { name: 'discount_value', nullable: true })
discount_value: number;
// payment data
@Column('enum', {
name: 'payment_type',
enum: TransactionPaymentType,
default: TransactionPaymentType.BANK_TRANSFER,
})
payment_type: TransactionPaymentType;
@Column('enum', {
name: 'payment_type_counter',
enum: TransactionPaymentType,
nullable: true,
})
payment_type_counter: TransactionPaymentType;
@Column('varchar', { name: 'payment_code', nullable: true })
payment_code: string;
@Column('varchar', { name: 'payment_type_method_id', nullable: true })
payment_type_method_id: string;
@Column('varchar', { name: 'payment_type_method_name', nullable: true })
payment_type_method_name: string;
@Column('varchar', { name: 'payment_type_method_number', nullable: true })
payment_type_method_number: string;
@Column('varchar', { name: 'payment_type_method_qr', nullable: true })
payment_type_method_qr: string;
@Column('varchar', { name: 'payment_card_information', nullable: true })
payment_card_information: string;
@Column('varchar', { name: 'payment_code_reference', nullable: true })
payment_code_reference: string;
@Column('varchar', { name: 'payment_midtrans_token', nullable: true })
payment_midtrans_token: string;
@Column('varchar', { name: 'payment_midtrans_url', nullable: true })
payment_midtrans_url: string;
@Column('date', { name: 'payment_date', nullable: true })
payment_date: Date;
@Column('date', { name: 'payment_date_bank', nullable: true })
payment_date_bank: Date;
// calculation data
@Column('decimal', { name: 'payment_sub_total', nullable: true })
payment_sub_total: number;
@Column('decimal', { name: 'payment_discount_total', nullable: true })
payment_discount_total: number;
@Column('decimal', { name: 'payment_total', nullable: true })
payment_total: number;
@Column('decimal', { name: 'payment_total_pay', nullable: true })
payment_total_pay: number;
@Column('decimal', { name: 'payment_change', nullable: true })
payment_change: number;
// share and profit data
@Column('decimal', { name: 'payment_total_dpp', nullable: true })
payment_total_dpp: number;
@Column('decimal', { name: 'payment_total_share', nullable: true })
payment_total_share: number;
@Column('decimal', { name: 'payment_total_tax', nullable: true })
payment_total_tax: number;
@Column('decimal', { name: 'payment_total_profit', nullable: true })
payment_total_profit: number;
@Column('varchar', { name: 'profit_share_formula', nullable: true })
profit_share_formula: string;
@Column('varchar', { name: 'sales_price_formula', nullable: true })
sales_price_formula: string;
// mdr
@Column('decimal', { name: 'reconciliation_mdr', nullable: true })
reconciliation_mdr: number;
@Column('enum', {
name: 'reconciliation_status',
enum: STATUS,
default: STATUS.DRAFT,
})
reconciliation_status: STATUS;
@Column('varchar', { name: 'reconciliation_confirm_date', nullable: true })
reconciliation_confirm_date: string;
@Column('varchar', { name: 'reconciliation_confirm_by', nullable: true })
reconciliation_confirm_by: string;
@Column('decimal', { name: 'payment_total_net_profit', nullable: true })
payment_total_net_profit: number;
// sending data
@Column('enum', {
name: 'sending_invoice_status',
enum: STATUS,
nullable: true,
})
sending_invoice_status: STATUS;
@Column({ name: 'sending_invoice_at', type: 'bigint', nullable: true })
sending_invoice_at: number;
@Column('enum', { name: 'sending_qr_status', enum: STATUS, nullable: true })
sending_qr_status: STATUS;
@Column({ name: 'sending_qr_at', type: 'bigint', nullable: true })
sending_qr_at: number;
// calendar
@Column('varchar', { name: 'calendar_id', nullable: true })
calendar_id: string;
@Column('varchar', { name: 'calendar_link', nullable: true })
calendar_link: string;
// relations to item
@OneToMany(() => TransactionItemModel, (model) => model.transaction, {
cascade: true,
onDelete: 'CASCADE',
onUpdate: 'CASCADE',
})
items: TransactionItemModel[];
// relations to tax data
@OneToMany(() => TransactionTaxModel, (model) => model.transaction, {
cascade: true,
onDelete: 'CASCADE',
onUpdate: 'CASCADE',
})
taxes: TransactionTaxModel[];
@OneToOne(() => TransactionDemographyModel, (model) => model.transaction, {
cascade: true,
onDelete: 'CASCADE',
onUpdate: 'CASCADE',
})
demographies: TransactionDemographyModel;
// relations to refund
@OneToMany(() => RefundModel, (model) => model.transaction, {
cascade: true,
onDelete: 'CASCADE',
onUpdate: 'CASCADE',
})
refunds: RefundModel[];
@Column('varchar', { name: 'otp_code', nullable: true })
otp_code: string;
}