pos-be/src/modules/item-related/item/data/models/item.model.ts

147 lines
4.0 KiB
TypeScript

import { TABLE_NAME } from 'src/core/strings/constants/table.constants';
import { ItemEntity } from '../../domain/entities/item.entity';
import {
Column,
Entity,
JoinColumn,
JoinTable,
ManyToMany,
ManyToOne,
OneToMany,
} from 'typeorm';
import { BaseStatusModel } from 'src/core/modules/data/model/base-status.model';
import { ItemType } from 'src/modules/item-related/item-category/constants';
import { LimitType } from '../../constants';
import { ItemCategoryModel } from 'src/modules/item-related/item-category/data/models/item-category.model';
import { UserModel } from 'src/modules/user-related/user/data/models/user.model';
import { ItemRateModel } from 'src/modules/item-related/item-rate/data/models/item-rate.model';
import { GateModel } from 'src/modules/web-information/gate/data/models/gate.model';
@Entity(TABLE_NAME.ITEM)
export class ItemModel
extends BaseStatusModel<ItemEntity>
implements ItemEntity
{
@Column('varchar', { name: 'name', unique: true })
name: string;
@Column('varchar', { name: 'image_url', nullable: true })
image_url: string;
@Column('varchar', { nullable: true })
video_url: string;
@Column('enum', {
name: 'item_type',
enum: ItemType,
default: ItemType.TIKET_MASUK,
})
item_type: ItemType;
@Column('bigint', { name: 'hpp', nullable: true })
hpp: number;
@Column('decimal', { name: 'sales_margin', nullable: true })
sales_margin: number;
@Column('decimal', { name: 'share_profit', nullable: true })
share_profit: number;
@Column('bigint', { name: 'total_price', nullable: true })
total_price: number;
@Column('bigint', { name: 'base_price', nullable: true })
base_price: number;
@Column('int', { name: 'play_estimation', nullable: true })
play_estimation: number;
@Column('boolean', { name: 'use_queue', default: false })
use_queue: boolean;
@Column('boolean', { name: 'show_to_booking', default: false })
show_to_booking: boolean;
@Column('boolean', { name: 'breakdown_bundling', default: false })
breakdown_bundling: boolean;
@Column('enum', {
name: 'limit_type',
enum: LimitType,
default: LimitType.NO_LIMIT,
})
limit_type: LimitType;
@Column('int', { name: 'limit_value', nullable: true })
limit_value: number;
// relation ke item category
@Column('varchar', { name: 'item_category_id', nullable: true })
item_category_id: number;
@ManyToOne(() => ItemCategoryModel, (model) => model.items, {
onUpdate: 'CASCADE',
onDelete: 'CASCADE',
})
@JoinColumn({ name: 'item_category_id' })
item_category: ItemCategoryModel;
// relation ke tenant
// ? karena item bisajadi merupakan item dari tenant
@Column('varchar', { name: 'tenant_id', nullable: true })
tenant_id: number;
@ManyToOne(() => UserModel, (model) => model.items, {
onUpdate: 'CASCADE',
onDelete: 'CASCADE',
})
@JoinColumn({ name: 'tenant_id' })
tenant: UserModel;
// relasi ke diri sendiri
// ?type bundling bisa punya relasi ke item (item adalah diri sendiri)
@ManyToMany(() => ItemModel, (model) => model.bundling_items, {
onDelete: 'CASCADE',
onUpdate: 'CASCADE',
})
@JoinTable({
name: 'item_bundlings',
joinColumn: {
name: 'item_bundling_id',
referencedColumnName: 'id',
},
inverseJoinColumn: {
name: 'item_id',
referencedColumnName: 'id',
},
})
bundling_items: ItemModel[];
// relasi ke item rates
@OneToMany(() => ItemRateModel, (model) => model.item, {
onDelete: 'CASCADE',
onUpdate: 'CASCADE',
})
item_rates: ItemRateModel[];
// relasi ke gate
@OneToMany(() => GateModel, (model) => model.item, {
onDelete: 'CASCADE',
onUpdate: 'CASCADE',
})
gates: GateModel[];
// relasi untuk mendapatkan parent bundling
@ManyToMany(() => ItemModel, (model) => model.bundling_parents)
@JoinTable({
name: 'item_bundlings',
joinColumn: {
name: 'item_id',
referencedColumnName: 'id',
},
inverseJoinColumn: {
name: 'item_bundling_id',
referencedColumnName: 'id',
},
})
bundling_parents: ItemModel[];
}