Merge branch 'feature/BETERAN-BACKEND-APP-BROWSER-init' of https://gitlab.loafle.net/bet/beteran-backend-app-browser into feature/BETERAN-BACKEND-APP-BROWSER-init
This commit is contained in:
		
						commit
						115fe9b8af
					
				@ -206,6 +206,34 @@ export const appRoutes: Route[] = [
 | 
				
			|||||||
                'app/modules/admin/member/partner-office/partner-office.module'
 | 
					                'app/modules/admin/member/partner-office/partner-office.module'
 | 
				
			||||||
              ).then((m: any) => m.PartnerOfficeModule),
 | 
					              ).then((m: any) => m.PartnerOfficeModule),
 | 
				
			||||||
          },
 | 
					          },
 | 
				
			||||||
 | 
					          {
 | 
				
			||||||
 | 
					            path: 'partner-store',
 | 
				
			||||||
 | 
					            loadChildren: () =>
 | 
				
			||||||
 | 
					              import(
 | 
				
			||||||
 | 
					                'app/modules/admin/member/partner-store/partner-store.module'
 | 
				
			||||||
 | 
					              ).then((m: any) => m.PartnerStoreModule),
 | 
				
			||||||
 | 
					          },
 | 
				
			||||||
 | 
					          {
 | 
				
			||||||
 | 
					            path: 'partner-recommendation',
 | 
				
			||||||
 | 
					            loadChildren: () =>
 | 
				
			||||||
 | 
					              import(
 | 
				
			||||||
 | 
					                'app/modules/admin/member/partner-recommendation/partner-recommendation.module'
 | 
				
			||||||
 | 
					              ).then((m: any) => m.PartnerRecommendationModule),
 | 
				
			||||||
 | 
					          },
 | 
				
			||||||
 | 
					          {
 | 
				
			||||||
 | 
					            path: 'coupon',
 | 
				
			||||||
 | 
					            loadChildren: () =>
 | 
				
			||||||
 | 
					              import('app/modules/admin/member/coupon/coupon.module').then(
 | 
				
			||||||
 | 
					                (m: any) => m.CouponModule
 | 
				
			||||||
 | 
					              ),
 | 
				
			||||||
 | 
					          },
 | 
				
			||||||
 | 
					          {
 | 
				
			||||||
 | 
					            path: 'coupon-moneylog',
 | 
				
			||||||
 | 
					            loadChildren: () =>
 | 
				
			||||||
 | 
					              import(
 | 
				
			||||||
 | 
					                'app/modules/admin/member/coupon-moneylog/coupon-moneylog.module'
 | 
				
			||||||
 | 
					              ).then((m: any) => m.CouponMoneylogModule),
 | 
				
			||||||
 | 
					          },
 | 
				
			||||||
        ],
 | 
					        ],
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      {
 | 
					      {
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										223
									
								
								src/app/mock-api/apps/member/coupon-moneylog/api.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										223
									
								
								src/app/mock-api/apps/member/coupon-moneylog/api.ts
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,223 @@
 | 
				
			|||||||
 | 
					import { Injectable } from '@angular/core';
 | 
				
			||||||
 | 
					import { assign, cloneDeep } from 'lodash-es';
 | 
				
			||||||
 | 
					import { FuseMockApiService, FuseMockApiUtils } from '@fuse/lib/mock-api';
 | 
				
			||||||
 | 
					import { couponMoneylogs as couponMoneylogsData } from './data';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@Injectable({
 | 
				
			||||||
 | 
					  providedIn: 'root',
 | 
				
			||||||
 | 
					})
 | 
				
			||||||
 | 
					export class MemberCouponMoneylogMockApi {
 | 
				
			||||||
 | 
					  private _couponMoneylogs: any[] = couponMoneylogsData;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					   * Constructor
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					  constructor(private _fuseMockApiService: FuseMockApiService) {
 | 
				
			||||||
 | 
					    // Register Mock API handlers
 | 
				
			||||||
 | 
					    this.registerHandlers();
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // -----------------------------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					  // @ Public methods
 | 
				
			||||||
 | 
					  // -----------------------------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					   * Register Mock API handlers
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					  registerHandlers(): void {
 | 
				
			||||||
 | 
					    // -----------------------------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					    // @ CouponMoneylogs - GET
 | 
				
			||||||
 | 
					    // -----------------------------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					    this._fuseMockApiService
 | 
				
			||||||
 | 
					      .onGet('api/apps/member/coupon-moneylog/coupon-moneylogs', 300)
 | 
				
			||||||
 | 
					      .reply(({ request }) => {
 | 
				
			||||||
 | 
					        // Get available queries
 | 
				
			||||||
 | 
					        const search = request.params.get('search');
 | 
				
			||||||
 | 
					        const sort = request.params.get('sort') || 'name';
 | 
				
			||||||
 | 
					        const order = request.params.get('order') || 'asc';
 | 
				
			||||||
 | 
					        const page = parseInt(request.params.get('page') ?? '1', 10);
 | 
				
			||||||
 | 
					        const size = parseInt(request.params.get('size') ?? '10', 10);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Clone the couponMoneylogs
 | 
				
			||||||
 | 
					        let couponMoneylogs: any[] | null = cloneDeep(this._couponMoneylogs);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Sort the couponMoneylogs
 | 
				
			||||||
 | 
					        if (sort === 'sku' || sort === 'name' || sort === 'active') {
 | 
				
			||||||
 | 
					          couponMoneylogs.sort((a, b) => {
 | 
				
			||||||
 | 
					            const fieldA = a[sort].toString().toUpperCase();
 | 
				
			||||||
 | 
					            const fieldB = b[sort].toString().toUpperCase();
 | 
				
			||||||
 | 
					            return order === 'asc'
 | 
				
			||||||
 | 
					              ? fieldA.localeCompare(fieldB)
 | 
				
			||||||
 | 
					              : fieldB.localeCompare(fieldA);
 | 
				
			||||||
 | 
					          });
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					          couponMoneylogs.sort((a, b) =>
 | 
				
			||||||
 | 
					            order === 'asc' ? a[sort] - b[sort] : b[sort] - a[sort]
 | 
				
			||||||
 | 
					          );
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // If search exists...
 | 
				
			||||||
 | 
					        if (search) {
 | 
				
			||||||
 | 
					          // Filter the couponMoneylogs
 | 
				
			||||||
 | 
					          couponMoneylogs = couponMoneylogs.filter(
 | 
				
			||||||
 | 
					            (contact: any) =>
 | 
				
			||||||
 | 
					              contact.name &&
 | 
				
			||||||
 | 
					              contact.name.toLowerCase().includes(search.toLowerCase())
 | 
				
			||||||
 | 
					          );
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Paginate - Start
 | 
				
			||||||
 | 
					        const couponMoneylogsLength = couponMoneylogs.length;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Calculate pagination details
 | 
				
			||||||
 | 
					        const begin = page * size;
 | 
				
			||||||
 | 
					        const end = Math.min(size * (page + 1), couponMoneylogsLength);
 | 
				
			||||||
 | 
					        const lastPage = Math.max(Math.ceil(couponMoneylogsLength / size), 1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Prepare the pagination object
 | 
				
			||||||
 | 
					        let pagination = {};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // If the requested page number is bigger than
 | 
				
			||||||
 | 
					        // the last possible page number, return null for
 | 
				
			||||||
 | 
					        // couponMoneylogs but also send the last possible page so
 | 
				
			||||||
 | 
					        // the app can navigate to there
 | 
				
			||||||
 | 
					        if (page > lastPage) {
 | 
				
			||||||
 | 
					          couponMoneylogs = null;
 | 
				
			||||||
 | 
					          pagination = {
 | 
				
			||||||
 | 
					            lastPage,
 | 
				
			||||||
 | 
					          };
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					          // Paginate the results by size
 | 
				
			||||||
 | 
					          couponMoneylogs = couponMoneylogs.slice(begin, end);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          // Prepare the pagination mock-api
 | 
				
			||||||
 | 
					          pagination = {
 | 
				
			||||||
 | 
					            length: couponMoneylogsLength,
 | 
				
			||||||
 | 
					            size: size,
 | 
				
			||||||
 | 
					            page: page,
 | 
				
			||||||
 | 
					            lastPage: lastPage,
 | 
				
			||||||
 | 
					            startIndex: begin,
 | 
				
			||||||
 | 
					            endIndex: end - 1,
 | 
				
			||||||
 | 
					          };
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Return the response
 | 
				
			||||||
 | 
					        return [
 | 
				
			||||||
 | 
					          200,
 | 
				
			||||||
 | 
					          {
 | 
				
			||||||
 | 
					            couponMoneylogs,
 | 
				
			||||||
 | 
					            pagination,
 | 
				
			||||||
 | 
					          },
 | 
				
			||||||
 | 
					        ];
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // -----------------------------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					    // @ CouponMoneylog - GET
 | 
				
			||||||
 | 
					    // -----------------------------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					    this._fuseMockApiService
 | 
				
			||||||
 | 
					      .onGet('api/apps/member/coupon-moneylog/coupon-moneylog')
 | 
				
			||||||
 | 
					      .reply(({ request }) => {
 | 
				
			||||||
 | 
					        // Get the id from the params
 | 
				
			||||||
 | 
					        const id = request.params.get('id');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Clone the couponMoneylogs
 | 
				
			||||||
 | 
					        const couponMoneylogs = cloneDeep(this._couponMoneylogs);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Find the couponMoneylog
 | 
				
			||||||
 | 
					        const couponMoneylog = couponMoneylogs.find(
 | 
				
			||||||
 | 
					          (item: any) => item.id === id
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Return the response
 | 
				
			||||||
 | 
					        return [200, couponMoneylog];
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // -----------------------------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					    // @ CouponMoneylog - POST
 | 
				
			||||||
 | 
					    // -----------------------------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					    this._fuseMockApiService
 | 
				
			||||||
 | 
					      .onPost('api/apps/member/coupon-moneylog/coupon-moneylog')
 | 
				
			||||||
 | 
					      .reply(() => {
 | 
				
			||||||
 | 
					        // Generate a new couponMoneylog
 | 
				
			||||||
 | 
					        const newCouponMoneylog = {
 | 
				
			||||||
 | 
					          id: FuseMockApiUtils.guid(),
 | 
				
			||||||
 | 
					          category: '',
 | 
				
			||||||
 | 
					          name: 'A New User',
 | 
				
			||||||
 | 
					          description: '',
 | 
				
			||||||
 | 
					          tags: [],
 | 
				
			||||||
 | 
					          sku: '',
 | 
				
			||||||
 | 
					          barcode: '',
 | 
				
			||||||
 | 
					          brand: '',
 | 
				
			||||||
 | 
					          vendor: '',
 | 
				
			||||||
 | 
					          stock: '',
 | 
				
			||||||
 | 
					          reserved: '',
 | 
				
			||||||
 | 
					          cost: '',
 | 
				
			||||||
 | 
					          basePrice: '',
 | 
				
			||||||
 | 
					          taxPercent: '',
 | 
				
			||||||
 | 
					          price: '',
 | 
				
			||||||
 | 
					          weight: '',
 | 
				
			||||||
 | 
					          thumbnail: '',
 | 
				
			||||||
 | 
					          images: [],
 | 
				
			||||||
 | 
					          active: false,
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Unshift the new couponMoneylog
 | 
				
			||||||
 | 
					        this._couponMoneylogs.unshift(newCouponMoneylog);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Return the response
 | 
				
			||||||
 | 
					        return [200, newCouponMoneylog];
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // -----------------------------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					    // @ CouponMoneylog - PATCH
 | 
				
			||||||
 | 
					    // -----------------------------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					    this._fuseMockApiService
 | 
				
			||||||
 | 
					      .onPatch('api/apps/member/coupon-moneylog/coupon-moneylog')
 | 
				
			||||||
 | 
					      .reply(({ request }) => {
 | 
				
			||||||
 | 
					        // Get the id and couponMoneylog
 | 
				
			||||||
 | 
					        const id = request.body.id;
 | 
				
			||||||
 | 
					        const couponMoneylog = cloneDeep(request.body.couponMoneylog);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Prepare the updated couponMoneylog
 | 
				
			||||||
 | 
					        let updatedCouponMoneylog = null;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Find the couponMoneylog and update it
 | 
				
			||||||
 | 
					        this._couponMoneylogs.forEach((item, index, couponMoneylogs) => {
 | 
				
			||||||
 | 
					          if (item.id === id) {
 | 
				
			||||||
 | 
					            // Update the couponMoneylog
 | 
				
			||||||
 | 
					            couponMoneylogs[index] = assign(
 | 
				
			||||||
 | 
					              {},
 | 
				
			||||||
 | 
					              couponMoneylogs[index],
 | 
				
			||||||
 | 
					              couponMoneylog
 | 
				
			||||||
 | 
					            );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            // Store the updated couponMoneylog
 | 
				
			||||||
 | 
					            updatedCouponMoneylog = couponMoneylogs[index];
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Return the response
 | 
				
			||||||
 | 
					        return [200, updatedCouponMoneylog];
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // -----------------------------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					    // @ CouponMoneylog - DELETE
 | 
				
			||||||
 | 
					    // -----------------------------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					    this._fuseMockApiService
 | 
				
			||||||
 | 
					      .onDelete('api/apps/member/coupon-moneylog/coupon-moneylog')
 | 
				
			||||||
 | 
					      .reply(({ request }) => {
 | 
				
			||||||
 | 
					        // Get the id
 | 
				
			||||||
 | 
					        const id = request.params.get('id');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Find the couponMoneylog and delete it
 | 
				
			||||||
 | 
					        this._couponMoneylogs.forEach((item, index) => {
 | 
				
			||||||
 | 
					          if (item.id === id) {
 | 
				
			||||||
 | 
					            this._couponMoneylogs.splice(index, 1);
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Return the response
 | 
				
			||||||
 | 
					        return [200, true];
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										33
									
								
								src/app/mock-api/apps/member/coupon-moneylog/data.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								src/app/mock-api/apps/member/coupon-moneylog/data.ts
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,33 @@
 | 
				
			|||||||
 | 
					/* eslint-disable */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export const couponMoneylogs = [
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    id: 'on00',
 | 
				
			||||||
 | 
					    totalPartnerCount: '5',
 | 
				
			||||||
 | 
					    totalHoldingMoney: 303675,
 | 
				
			||||||
 | 
					    totalComp: 108933,
 | 
				
			||||||
 | 
					    total: 412608,
 | 
				
			||||||
 | 
					    branchCount: 1,
 | 
				
			||||||
 | 
					    divisionCount: 1,
 | 
				
			||||||
 | 
					    officeCount: 1,
 | 
				
			||||||
 | 
					    storeCount: 1,
 | 
				
			||||||
 | 
					    memberCount: 1,
 | 
				
			||||||
 | 
					    nickname: 'on00',
 | 
				
			||||||
 | 
					    accountHolder: '11',
 | 
				
			||||||
 | 
					    phoneNumber: '010-1111-1111',
 | 
				
			||||||
 | 
					    calculateType: '롤링',
 | 
				
			||||||
 | 
					    ownCash: 50000,
 | 
				
			||||||
 | 
					    ownComp: 1711,
 | 
				
			||||||
 | 
					    ownCoupon: 50000,
 | 
				
			||||||
 | 
					    gameMoney: 0,
 | 
				
			||||||
 | 
					    todayComp: 0,
 | 
				
			||||||
 | 
					    totalDeposit: 0,
 | 
				
			||||||
 | 
					    totalWithdraw: 0,
 | 
				
			||||||
 | 
					    balance: 0,
 | 
				
			||||||
 | 
					    registDate: '2022-06-12 15:38',
 | 
				
			||||||
 | 
					    finalSigninDate: '',
 | 
				
			||||||
 | 
					    ip: '',
 | 
				
			||||||
 | 
					    state: '정상',
 | 
				
			||||||
 | 
					    note: '',
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					];
 | 
				
			||||||
							
								
								
									
										217
									
								
								src/app/mock-api/apps/member/coupon/api.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										217
									
								
								src/app/mock-api/apps/member/coupon/api.ts
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,217 @@
 | 
				
			|||||||
 | 
					import { Injectable } from '@angular/core';
 | 
				
			||||||
 | 
					import { assign, cloneDeep } from 'lodash-es';
 | 
				
			||||||
 | 
					import { FuseMockApiService, FuseMockApiUtils } from '@fuse/lib/mock-api';
 | 
				
			||||||
 | 
					import { coupons as couponsData } from './data';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@Injectable({
 | 
				
			||||||
 | 
					  providedIn: 'root',
 | 
				
			||||||
 | 
					})
 | 
				
			||||||
 | 
					export class MemberCouponMockApi {
 | 
				
			||||||
 | 
					  private _coupons: any[] = couponsData;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					   * Constructor
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					  constructor(private _fuseMockApiService: FuseMockApiService) {
 | 
				
			||||||
 | 
					    // Register Mock API handlers
 | 
				
			||||||
 | 
					    this.registerHandlers();
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // -----------------------------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					  // @ Public methods
 | 
				
			||||||
 | 
					  // -----------------------------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					   * Register Mock API handlers
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					  registerHandlers(): void {
 | 
				
			||||||
 | 
					    // -----------------------------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					    // @ Coupons - GET
 | 
				
			||||||
 | 
					    // -----------------------------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					    this._fuseMockApiService
 | 
				
			||||||
 | 
					      .onGet('api/apps/member/coupon/coupons', 300)
 | 
				
			||||||
 | 
					      .reply(({ request }) => {
 | 
				
			||||||
 | 
					        // Get available queries
 | 
				
			||||||
 | 
					        const search = request.params.get('search');
 | 
				
			||||||
 | 
					        const sort = request.params.get('sort') || 'name';
 | 
				
			||||||
 | 
					        const order = request.params.get('order') || 'asc';
 | 
				
			||||||
 | 
					        const page = parseInt(request.params.get('page') ?? '1', 10);
 | 
				
			||||||
 | 
					        const size = parseInt(request.params.get('size') ?? '10', 10);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Clone the coupons
 | 
				
			||||||
 | 
					        let coupons: any[] | null = cloneDeep(this._coupons);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Sort the coupons
 | 
				
			||||||
 | 
					        if (sort === 'sku' || sort === 'name' || sort === 'active') {
 | 
				
			||||||
 | 
					          coupons.sort((a, b) => {
 | 
				
			||||||
 | 
					            const fieldA = a[sort].toString().toUpperCase();
 | 
				
			||||||
 | 
					            const fieldB = b[sort].toString().toUpperCase();
 | 
				
			||||||
 | 
					            return order === 'asc'
 | 
				
			||||||
 | 
					              ? fieldA.localeCompare(fieldB)
 | 
				
			||||||
 | 
					              : fieldB.localeCompare(fieldA);
 | 
				
			||||||
 | 
					          });
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					          coupons.sort((a, b) =>
 | 
				
			||||||
 | 
					            order === 'asc' ? a[sort] - b[sort] : b[sort] - a[sort]
 | 
				
			||||||
 | 
					          );
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // If search exists...
 | 
				
			||||||
 | 
					        if (search) {
 | 
				
			||||||
 | 
					          // Filter the coupons
 | 
				
			||||||
 | 
					          coupons = coupons.filter(
 | 
				
			||||||
 | 
					            (contact: any) =>
 | 
				
			||||||
 | 
					              contact.name &&
 | 
				
			||||||
 | 
					              contact.name.toLowerCase().includes(search.toLowerCase())
 | 
				
			||||||
 | 
					          );
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Paginate - Start
 | 
				
			||||||
 | 
					        const couponsLength = coupons.length;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Calculate pagination details
 | 
				
			||||||
 | 
					        const begin = page * size;
 | 
				
			||||||
 | 
					        const end = Math.min(size * (page + 1), couponsLength);
 | 
				
			||||||
 | 
					        const lastPage = Math.max(Math.ceil(couponsLength / size), 1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Prepare the pagination object
 | 
				
			||||||
 | 
					        let pagination = {};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // If the requested page number is bigger than
 | 
				
			||||||
 | 
					        // the last possible page number, return null for
 | 
				
			||||||
 | 
					        // coupons but also send the last possible page so
 | 
				
			||||||
 | 
					        // the app can navigate to there
 | 
				
			||||||
 | 
					        if (page > lastPage) {
 | 
				
			||||||
 | 
					          coupons = null;
 | 
				
			||||||
 | 
					          pagination = {
 | 
				
			||||||
 | 
					            lastPage,
 | 
				
			||||||
 | 
					          };
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					          // Paginate the results by size
 | 
				
			||||||
 | 
					          coupons = coupons.slice(begin, end);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          // Prepare the pagination mock-api
 | 
				
			||||||
 | 
					          pagination = {
 | 
				
			||||||
 | 
					            length: couponsLength,
 | 
				
			||||||
 | 
					            size: size,
 | 
				
			||||||
 | 
					            page: page,
 | 
				
			||||||
 | 
					            lastPage: lastPage,
 | 
				
			||||||
 | 
					            startIndex: begin,
 | 
				
			||||||
 | 
					            endIndex: end - 1,
 | 
				
			||||||
 | 
					          };
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Return the response
 | 
				
			||||||
 | 
					        return [
 | 
				
			||||||
 | 
					          200,
 | 
				
			||||||
 | 
					          {
 | 
				
			||||||
 | 
					            coupons,
 | 
				
			||||||
 | 
					            pagination,
 | 
				
			||||||
 | 
					          },
 | 
				
			||||||
 | 
					        ];
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // -----------------------------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					    // @ Coupon - GET
 | 
				
			||||||
 | 
					    // -----------------------------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					    this._fuseMockApiService
 | 
				
			||||||
 | 
					      .onGet('api/apps/member/coupon/coupon')
 | 
				
			||||||
 | 
					      .reply(({ request }) => {
 | 
				
			||||||
 | 
					        // Get the id from the params
 | 
				
			||||||
 | 
					        const id = request.params.get('id');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Clone the coupons
 | 
				
			||||||
 | 
					        const coupons = cloneDeep(this._coupons);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Find the coupon
 | 
				
			||||||
 | 
					        const coupon = coupons.find((item: any) => item.id === id);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Return the response
 | 
				
			||||||
 | 
					        return [200, coupon];
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // -----------------------------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					    // @ Coupon - POST
 | 
				
			||||||
 | 
					    // -----------------------------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					    this._fuseMockApiService
 | 
				
			||||||
 | 
					      .onPost('api/apps/member/coupon/coupon')
 | 
				
			||||||
 | 
					      .reply(() => {
 | 
				
			||||||
 | 
					        // Generate a new coupon
 | 
				
			||||||
 | 
					        const newCoupon = {
 | 
				
			||||||
 | 
					          id: FuseMockApiUtils.guid(),
 | 
				
			||||||
 | 
					          category: '',
 | 
				
			||||||
 | 
					          name: 'A New User',
 | 
				
			||||||
 | 
					          description: '',
 | 
				
			||||||
 | 
					          tags: [],
 | 
				
			||||||
 | 
					          sku: '',
 | 
				
			||||||
 | 
					          barcode: '',
 | 
				
			||||||
 | 
					          brand: '',
 | 
				
			||||||
 | 
					          vendor: '',
 | 
				
			||||||
 | 
					          stock: '',
 | 
				
			||||||
 | 
					          reserved: '',
 | 
				
			||||||
 | 
					          cost: '',
 | 
				
			||||||
 | 
					          basePrice: '',
 | 
				
			||||||
 | 
					          taxPercent: '',
 | 
				
			||||||
 | 
					          price: '',
 | 
				
			||||||
 | 
					          weight: '',
 | 
				
			||||||
 | 
					          thumbnail: '',
 | 
				
			||||||
 | 
					          images: [],
 | 
				
			||||||
 | 
					          active: false,
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Unshift the new coupon
 | 
				
			||||||
 | 
					        this._coupons.unshift(newCoupon);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Return the response
 | 
				
			||||||
 | 
					        return [200, newCoupon];
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // -----------------------------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					    // @ Coupon - PATCH
 | 
				
			||||||
 | 
					    // -----------------------------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					    this._fuseMockApiService
 | 
				
			||||||
 | 
					      .onPatch('api/apps/member/coupon/coupon')
 | 
				
			||||||
 | 
					      .reply(({ request }) => {
 | 
				
			||||||
 | 
					        // Get the id and coupon
 | 
				
			||||||
 | 
					        const id = request.body.id;
 | 
				
			||||||
 | 
					        const coupon = cloneDeep(request.body.coupon);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Prepare the updated coupon
 | 
				
			||||||
 | 
					        let updatedCoupon = null;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Find the coupon and update it
 | 
				
			||||||
 | 
					        this._coupons.forEach((item, index, coupons) => {
 | 
				
			||||||
 | 
					          if (item.id === id) {
 | 
				
			||||||
 | 
					            // Update the coupon
 | 
				
			||||||
 | 
					            coupons[index] = assign({}, coupons[index], coupon);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            // Store the updated coupon
 | 
				
			||||||
 | 
					            updatedCoupon = coupons[index];
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Return the response
 | 
				
			||||||
 | 
					        return [200, updatedCoupon];
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // -----------------------------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					    // @ Coupon - DELETE
 | 
				
			||||||
 | 
					    // -----------------------------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					    this._fuseMockApiService
 | 
				
			||||||
 | 
					      .onDelete('api/apps/member/coupon/coupon')
 | 
				
			||||||
 | 
					      .reply(({ request }) => {
 | 
				
			||||||
 | 
					        // Get the id
 | 
				
			||||||
 | 
					        const id = request.params.get('id');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Find the coupon and delete it
 | 
				
			||||||
 | 
					        this._coupons.forEach((item, index) => {
 | 
				
			||||||
 | 
					          if (item.id === id) {
 | 
				
			||||||
 | 
					            this._coupons.splice(index, 1);
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Return the response
 | 
				
			||||||
 | 
					        return [200, true];
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										33
									
								
								src/app/mock-api/apps/member/coupon/data.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								src/app/mock-api/apps/member/coupon/data.ts
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,33 @@
 | 
				
			|||||||
 | 
					/* eslint-disable */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export const coupons = [
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    id: 'on00',
 | 
				
			||||||
 | 
					    totalPartnerCount: '5',
 | 
				
			||||||
 | 
					    totalHoldingMoney: 303675,
 | 
				
			||||||
 | 
					    totalComp: 108933,
 | 
				
			||||||
 | 
					    total: 412608,
 | 
				
			||||||
 | 
					    branchCount: 1,
 | 
				
			||||||
 | 
					    divisionCount: 1,
 | 
				
			||||||
 | 
					    officeCount: 1,
 | 
				
			||||||
 | 
					    storeCount: 1,
 | 
				
			||||||
 | 
					    memberCount: 1,
 | 
				
			||||||
 | 
					    nickname: 'on00',
 | 
				
			||||||
 | 
					    accountHolder: '11',
 | 
				
			||||||
 | 
					    phoneNumber: '010-1111-1111',
 | 
				
			||||||
 | 
					    calculateType: '롤링',
 | 
				
			||||||
 | 
					    ownCash: 50000,
 | 
				
			||||||
 | 
					    ownComp: 1711,
 | 
				
			||||||
 | 
					    ownCoupon: 50000,
 | 
				
			||||||
 | 
					    gameMoney: 0,
 | 
				
			||||||
 | 
					    todayComp: 0,
 | 
				
			||||||
 | 
					    totalDeposit: 0,
 | 
				
			||||||
 | 
					    totalWithdraw: 0,
 | 
				
			||||||
 | 
					    balance: 0,
 | 
				
			||||||
 | 
					    registDate: '2022-06-12 15:38',
 | 
				
			||||||
 | 
					    finalSigninDate: '',
 | 
				
			||||||
 | 
					    ip: '',
 | 
				
			||||||
 | 
					    state: '정상',
 | 
				
			||||||
 | 
					    note: '',
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					];
 | 
				
			||||||
							
								
								
									
										235
									
								
								src/app/mock-api/apps/member/partner-recommendation/api.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										235
									
								
								src/app/mock-api/apps/member/partner-recommendation/api.ts
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,235 @@
 | 
				
			|||||||
 | 
					import { Injectable } from '@angular/core';
 | 
				
			||||||
 | 
					import { assign, cloneDeep } from 'lodash-es';
 | 
				
			||||||
 | 
					import { FuseMockApiService, FuseMockApiUtils } from '@fuse/lib/mock-api';
 | 
				
			||||||
 | 
					import { partnerRecommendations as partnerRecommendationsData } from './data';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@Injectable({
 | 
				
			||||||
 | 
					  providedIn: 'root',
 | 
				
			||||||
 | 
					})
 | 
				
			||||||
 | 
					export class MemberPartnerRecommendationMockApi {
 | 
				
			||||||
 | 
					  private _partnerRecommendations: any[] = partnerRecommendationsData;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					   * Constructor
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					  constructor(private _fuseMockApiService: FuseMockApiService) {
 | 
				
			||||||
 | 
					    // Register Mock API handlers
 | 
				
			||||||
 | 
					    this.registerHandlers();
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // -----------------------------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					  // @ Public methods
 | 
				
			||||||
 | 
					  // -----------------------------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					   * Register Mock API handlers
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					  registerHandlers(): void {
 | 
				
			||||||
 | 
					    // -----------------------------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					    // @ PartnerRecommendations - GET
 | 
				
			||||||
 | 
					    // -----------------------------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					    this._fuseMockApiService
 | 
				
			||||||
 | 
					      .onGet(
 | 
				
			||||||
 | 
					        'api/apps/member/partner-recommendation/partner-recommendations',
 | 
				
			||||||
 | 
					        300
 | 
				
			||||||
 | 
					      )
 | 
				
			||||||
 | 
					      .reply(({ request }) => {
 | 
				
			||||||
 | 
					        // Get available queries
 | 
				
			||||||
 | 
					        const search = request.params.get('search');
 | 
				
			||||||
 | 
					        const sort = request.params.get('sort') || 'name';
 | 
				
			||||||
 | 
					        const order = request.params.get('order') || 'asc';
 | 
				
			||||||
 | 
					        const page = parseInt(request.params.get('page') ?? '1', 10);
 | 
				
			||||||
 | 
					        const size = parseInt(request.params.get('size') ?? '10', 10);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Clone the partnerRecommendations
 | 
				
			||||||
 | 
					        let partnerRecommendations: any[] | null = cloneDeep(
 | 
				
			||||||
 | 
					          this._partnerRecommendations
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Sort the partnerRecommendations
 | 
				
			||||||
 | 
					        if (sort === 'sku' || sort === 'name' || sort === 'active') {
 | 
				
			||||||
 | 
					          partnerRecommendations.sort((a, b) => {
 | 
				
			||||||
 | 
					            const fieldA = a[sort].toString().toUpperCase();
 | 
				
			||||||
 | 
					            const fieldB = b[sort].toString().toUpperCase();
 | 
				
			||||||
 | 
					            return order === 'asc'
 | 
				
			||||||
 | 
					              ? fieldA.localeCompare(fieldB)
 | 
				
			||||||
 | 
					              : fieldB.localeCompare(fieldA);
 | 
				
			||||||
 | 
					          });
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					          partnerRecommendations.sort((a, b) =>
 | 
				
			||||||
 | 
					            order === 'asc' ? a[sort] - b[sort] : b[sort] - a[sort]
 | 
				
			||||||
 | 
					          );
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // If search exists...
 | 
				
			||||||
 | 
					        if (search) {
 | 
				
			||||||
 | 
					          // Filter the partnerRecommendations
 | 
				
			||||||
 | 
					          partnerRecommendations = partnerRecommendations.filter(
 | 
				
			||||||
 | 
					            (contact: any) =>
 | 
				
			||||||
 | 
					              contact.name &&
 | 
				
			||||||
 | 
					              contact.name.toLowerCase().includes(search.toLowerCase())
 | 
				
			||||||
 | 
					          );
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Paginate - Start
 | 
				
			||||||
 | 
					        const partnerRecommendationsLength = partnerRecommendations.length;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Calculate pagination details
 | 
				
			||||||
 | 
					        const begin = page * size;
 | 
				
			||||||
 | 
					        const end = Math.min(size * (page + 1), partnerRecommendationsLength);
 | 
				
			||||||
 | 
					        const lastPage = Math.max(
 | 
				
			||||||
 | 
					          Math.ceil(partnerRecommendationsLength / size),
 | 
				
			||||||
 | 
					          1
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Prepare the pagination object
 | 
				
			||||||
 | 
					        let pagination = {};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // If the requested page number is bigger than
 | 
				
			||||||
 | 
					        // the last possible page number, return null for
 | 
				
			||||||
 | 
					        // partnerRecommendations but also send the last possible page so
 | 
				
			||||||
 | 
					        // the app can navigate to there
 | 
				
			||||||
 | 
					        if (page > lastPage) {
 | 
				
			||||||
 | 
					          partnerRecommendations = null;
 | 
				
			||||||
 | 
					          pagination = {
 | 
				
			||||||
 | 
					            lastPage,
 | 
				
			||||||
 | 
					          };
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					          // Paginate the results by size
 | 
				
			||||||
 | 
					          partnerRecommendations = partnerRecommendations.slice(begin, end);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          // Prepare the pagination mock-api
 | 
				
			||||||
 | 
					          pagination = {
 | 
				
			||||||
 | 
					            length: partnerRecommendationsLength,
 | 
				
			||||||
 | 
					            size: size,
 | 
				
			||||||
 | 
					            page: page,
 | 
				
			||||||
 | 
					            lastPage: lastPage,
 | 
				
			||||||
 | 
					            startIndex: begin,
 | 
				
			||||||
 | 
					            endIndex: end - 1,
 | 
				
			||||||
 | 
					          };
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Return the response
 | 
				
			||||||
 | 
					        return [
 | 
				
			||||||
 | 
					          200,
 | 
				
			||||||
 | 
					          {
 | 
				
			||||||
 | 
					            partnerRecommendations,
 | 
				
			||||||
 | 
					            pagination,
 | 
				
			||||||
 | 
					          },
 | 
				
			||||||
 | 
					        ];
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // -----------------------------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					    // @ PartnerRecommendation - GET
 | 
				
			||||||
 | 
					    // -----------------------------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					    this._fuseMockApiService
 | 
				
			||||||
 | 
					      .onGet('api/apps/member/partne-recommendation/partner-recommendation')
 | 
				
			||||||
 | 
					      .reply(({ request }) => {
 | 
				
			||||||
 | 
					        // Get the id from the params
 | 
				
			||||||
 | 
					        const id = request.params.get('id');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Clone the partnerRecommendations
 | 
				
			||||||
 | 
					        const partnerRecommendations = cloneDeep(this._partnerRecommendations);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Find the partnerRecommendation
 | 
				
			||||||
 | 
					        const partnerRecommendation = partnerRecommendations.find(
 | 
				
			||||||
 | 
					          (item: any) => item.id === id
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Return the response
 | 
				
			||||||
 | 
					        return [200, partnerRecommendation];
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // -----------------------------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					    // @ PartnerRecommendation - POST
 | 
				
			||||||
 | 
					    // -----------------------------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					    this._fuseMockApiService
 | 
				
			||||||
 | 
					      .onPost('api/apps/member/partner-recommendation/partner-recommendation')
 | 
				
			||||||
 | 
					      .reply(() => {
 | 
				
			||||||
 | 
					        // Generate a new partnerRecommendation
 | 
				
			||||||
 | 
					        const newPartnerRecommendation = {
 | 
				
			||||||
 | 
					          id: FuseMockApiUtils.guid(),
 | 
				
			||||||
 | 
					          category: '',
 | 
				
			||||||
 | 
					          name: 'A New User',
 | 
				
			||||||
 | 
					          description: '',
 | 
				
			||||||
 | 
					          tags: [],
 | 
				
			||||||
 | 
					          sku: '',
 | 
				
			||||||
 | 
					          barcode: '',
 | 
				
			||||||
 | 
					          brand: '',
 | 
				
			||||||
 | 
					          vendor: '',
 | 
				
			||||||
 | 
					          stock: '',
 | 
				
			||||||
 | 
					          reserved: '',
 | 
				
			||||||
 | 
					          cost: '',
 | 
				
			||||||
 | 
					          basePrice: '',
 | 
				
			||||||
 | 
					          taxPercent: '',
 | 
				
			||||||
 | 
					          price: '',
 | 
				
			||||||
 | 
					          weight: '',
 | 
				
			||||||
 | 
					          thumbnail: '',
 | 
				
			||||||
 | 
					          images: [],
 | 
				
			||||||
 | 
					          active: false,
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Unshift the new partnerRecommendation
 | 
				
			||||||
 | 
					        this._partnerRecommendations.unshift(newPartnerRecommendation);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Return the response
 | 
				
			||||||
 | 
					        return [200, newPartnerRecommendation];
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // -----------------------------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					    // @ PartnerRecommendation - PATCH
 | 
				
			||||||
 | 
					    // -----------------------------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					    this._fuseMockApiService
 | 
				
			||||||
 | 
					      .onPatch('api/apps/member/partner-recommendation/partner-recommendation')
 | 
				
			||||||
 | 
					      .reply(({ request }) => {
 | 
				
			||||||
 | 
					        // Get the id and partnerRecommendation
 | 
				
			||||||
 | 
					        const id = request.body.id;
 | 
				
			||||||
 | 
					        const partnerRecommendation = cloneDeep(
 | 
				
			||||||
 | 
					          request.body.partnerRecommendation
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Prepare the updated partnerRecommendation
 | 
				
			||||||
 | 
					        let updatedPartnerRecommendation = null;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Find the partnerRecommendation and update it
 | 
				
			||||||
 | 
					        this._partnerRecommendations.forEach(
 | 
				
			||||||
 | 
					          (item, index, partnerRecommendations) => {
 | 
				
			||||||
 | 
					            if (item.id === id) {
 | 
				
			||||||
 | 
					              // Update the partnerRecommendation
 | 
				
			||||||
 | 
					              partnerRecommendations[index] = assign(
 | 
				
			||||||
 | 
					                {},
 | 
				
			||||||
 | 
					                partnerRecommendations[index],
 | 
				
			||||||
 | 
					                partnerRecommendation
 | 
				
			||||||
 | 
					              );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					              // Store the updated partnerRecommendation
 | 
				
			||||||
 | 
					              updatedPartnerRecommendation = partnerRecommendations[index];
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Return the response
 | 
				
			||||||
 | 
					        return [200, updatedPartnerRecommendation];
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // -----------------------------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					    // @ PartnerRecommendation - DELETE
 | 
				
			||||||
 | 
					    // -----------------------------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					    this._fuseMockApiService
 | 
				
			||||||
 | 
					      .onDelete('api/apps/member/partner-recommendation/partner-recommendation')
 | 
				
			||||||
 | 
					      .reply(({ request }) => {
 | 
				
			||||||
 | 
					        // Get the id
 | 
				
			||||||
 | 
					        const id = request.params.get('id');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Find the partnerRecommendation and delete it
 | 
				
			||||||
 | 
					        this._partnerRecommendations.forEach((item, index) => {
 | 
				
			||||||
 | 
					          if (item.id === id) {
 | 
				
			||||||
 | 
					            this._partnerRecommendations.splice(index, 1);
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Return the response
 | 
				
			||||||
 | 
					        return [200, true];
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										33
									
								
								src/app/mock-api/apps/member/partner-recommendation/data.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								src/app/mock-api/apps/member/partner-recommendation/data.ts
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,33 @@
 | 
				
			|||||||
 | 
					/* eslint-disable */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export const partnerRecommendations = [
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    id: 'on00',
 | 
				
			||||||
 | 
					    totalPartnerCount: '5',
 | 
				
			||||||
 | 
					    totalHoldingMoney: 303675,
 | 
				
			||||||
 | 
					    totalComp: 108933,
 | 
				
			||||||
 | 
					    total: 412608,
 | 
				
			||||||
 | 
					    branchCount: 1,
 | 
				
			||||||
 | 
					    divisionCount: 1,
 | 
				
			||||||
 | 
					    officeCount: 1,
 | 
				
			||||||
 | 
					    storeCount: 1,
 | 
				
			||||||
 | 
					    memberCount: 1,
 | 
				
			||||||
 | 
					    nickname: 'on00',
 | 
				
			||||||
 | 
					    accountHolder: '11',
 | 
				
			||||||
 | 
					    phoneNumber: '010-1111-1111',
 | 
				
			||||||
 | 
					    calculateType: '롤링',
 | 
				
			||||||
 | 
					    ownCash: 50000,
 | 
				
			||||||
 | 
					    ownComp: 1711,
 | 
				
			||||||
 | 
					    ownCoupon: 50000,
 | 
				
			||||||
 | 
					    gameMoney: 0,
 | 
				
			||||||
 | 
					    todayComp: 0,
 | 
				
			||||||
 | 
					    totalDeposit: 0,
 | 
				
			||||||
 | 
					    totalWithdraw: 0,
 | 
				
			||||||
 | 
					    balance: 0,
 | 
				
			||||||
 | 
					    registDate: '2022-06-12 15:38',
 | 
				
			||||||
 | 
					    finalSigninDate: '',
 | 
				
			||||||
 | 
					    ip: '',
 | 
				
			||||||
 | 
					    state: '정상',
 | 
				
			||||||
 | 
					    note: '',
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					];
 | 
				
			||||||
							
								
								
									
										221
									
								
								src/app/mock-api/apps/member/partner-store/api.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										221
									
								
								src/app/mock-api/apps/member/partner-store/api.ts
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,221 @@
 | 
				
			|||||||
 | 
					import { Injectable } from '@angular/core';
 | 
				
			||||||
 | 
					import { assign, cloneDeep } from 'lodash-es';
 | 
				
			||||||
 | 
					import { FuseMockApiService, FuseMockApiUtils } from '@fuse/lib/mock-api';
 | 
				
			||||||
 | 
					import { partnerStores as partnerStoresData } from './data';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@Injectable({
 | 
				
			||||||
 | 
					  providedIn: 'root',
 | 
				
			||||||
 | 
					})
 | 
				
			||||||
 | 
					export class MemberPartnerStoreMockApi {
 | 
				
			||||||
 | 
					  private _partnerStores: any[] = partnerStoresData;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					   * Constructor
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					  constructor(private _fuseMockApiService: FuseMockApiService) {
 | 
				
			||||||
 | 
					    // Register Mock API handlers
 | 
				
			||||||
 | 
					    this.registerHandlers();
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // -----------------------------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					  // @ Public methods
 | 
				
			||||||
 | 
					  // -----------------------------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					   * Register Mock API handlers
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					  registerHandlers(): void {
 | 
				
			||||||
 | 
					    // -----------------------------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					    // @ PartnerStores - GET
 | 
				
			||||||
 | 
					    // -----------------------------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					    this._fuseMockApiService
 | 
				
			||||||
 | 
					      .onGet('api/apps/member/partner-store/partner-stores', 300)
 | 
				
			||||||
 | 
					      .reply(({ request }) => {
 | 
				
			||||||
 | 
					        // Get available queries
 | 
				
			||||||
 | 
					        const search = request.params.get('search');
 | 
				
			||||||
 | 
					        const sort = request.params.get('sort') || 'name';
 | 
				
			||||||
 | 
					        const order = request.params.get('order') || 'asc';
 | 
				
			||||||
 | 
					        const page = parseInt(request.params.get('page') ?? '1', 10);
 | 
				
			||||||
 | 
					        const size = parseInt(request.params.get('size') ?? '10', 10);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Clone the partnerStores
 | 
				
			||||||
 | 
					        let partnerStores: any[] | null = cloneDeep(this._partnerStores);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Sort the partnerStores
 | 
				
			||||||
 | 
					        if (sort === 'sku' || sort === 'name' || sort === 'active') {
 | 
				
			||||||
 | 
					          partnerStores.sort((a, b) => {
 | 
				
			||||||
 | 
					            const fieldA = a[sort].toString().toUpperCase();
 | 
				
			||||||
 | 
					            const fieldB = b[sort].toString().toUpperCase();
 | 
				
			||||||
 | 
					            return order === 'asc'
 | 
				
			||||||
 | 
					              ? fieldA.localeCompare(fieldB)
 | 
				
			||||||
 | 
					              : fieldB.localeCompare(fieldA);
 | 
				
			||||||
 | 
					          });
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					          partnerStores.sort((a, b) =>
 | 
				
			||||||
 | 
					            order === 'asc' ? a[sort] - b[sort] : b[sort] - a[sort]
 | 
				
			||||||
 | 
					          );
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // If search exists...
 | 
				
			||||||
 | 
					        if (search) {
 | 
				
			||||||
 | 
					          // Filter the partnerStores
 | 
				
			||||||
 | 
					          partnerStores = partnerStores.filter(
 | 
				
			||||||
 | 
					            (contact: any) =>
 | 
				
			||||||
 | 
					              contact.name &&
 | 
				
			||||||
 | 
					              contact.name.toLowerCase().includes(search.toLowerCase())
 | 
				
			||||||
 | 
					          );
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Paginate - Start
 | 
				
			||||||
 | 
					        const partnerStoresLength = partnerStores.length;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Calculate pagination details
 | 
				
			||||||
 | 
					        const begin = page * size;
 | 
				
			||||||
 | 
					        const end = Math.min(size * (page + 1), partnerStoresLength);
 | 
				
			||||||
 | 
					        const lastPage = Math.max(Math.ceil(partnerStoresLength / size), 1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Prepare the pagination object
 | 
				
			||||||
 | 
					        let pagination = {};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // If the requested page number is bigger than
 | 
				
			||||||
 | 
					        // the last possible page number, return null for
 | 
				
			||||||
 | 
					        // partnerStores but also send the last possible page so
 | 
				
			||||||
 | 
					        // the app can navigate to there
 | 
				
			||||||
 | 
					        if (page > lastPage) {
 | 
				
			||||||
 | 
					          partnerStores = null;
 | 
				
			||||||
 | 
					          pagination = {
 | 
				
			||||||
 | 
					            lastPage,
 | 
				
			||||||
 | 
					          };
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					          // Paginate the results by size
 | 
				
			||||||
 | 
					          partnerStores = partnerStores.slice(begin, end);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          // Prepare the pagination mock-api
 | 
				
			||||||
 | 
					          pagination = {
 | 
				
			||||||
 | 
					            length: partnerStoresLength,
 | 
				
			||||||
 | 
					            size: size,
 | 
				
			||||||
 | 
					            page: page,
 | 
				
			||||||
 | 
					            lastPage: lastPage,
 | 
				
			||||||
 | 
					            startIndex: begin,
 | 
				
			||||||
 | 
					            endIndex: end - 1,
 | 
				
			||||||
 | 
					          };
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Return the response
 | 
				
			||||||
 | 
					        return [
 | 
				
			||||||
 | 
					          200,
 | 
				
			||||||
 | 
					          {
 | 
				
			||||||
 | 
					            partnerStores,
 | 
				
			||||||
 | 
					            pagination,
 | 
				
			||||||
 | 
					          },
 | 
				
			||||||
 | 
					        ];
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // -----------------------------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					    // @ PartnerStore - GET
 | 
				
			||||||
 | 
					    // -----------------------------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					    this._fuseMockApiService
 | 
				
			||||||
 | 
					      .onGet('api/apps/member/partne-store/partner-store')
 | 
				
			||||||
 | 
					      .reply(({ request }) => {
 | 
				
			||||||
 | 
					        // Get the id from the params
 | 
				
			||||||
 | 
					        const id = request.params.get('id');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Clone the partnerStores
 | 
				
			||||||
 | 
					        const partnerStores = cloneDeep(this._partnerStores);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Find the partnerStore
 | 
				
			||||||
 | 
					        const partnerStore = partnerStores.find((item: any) => item.id === id);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Return the response
 | 
				
			||||||
 | 
					        return [200, partnerStore];
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // -----------------------------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					    // @ PartnerStore - POST
 | 
				
			||||||
 | 
					    // -----------------------------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					    this._fuseMockApiService
 | 
				
			||||||
 | 
					      .onPost('api/apps/member/partner-store/partner-store')
 | 
				
			||||||
 | 
					      .reply(() => {
 | 
				
			||||||
 | 
					        // Generate a new partnerStore
 | 
				
			||||||
 | 
					        const newPartnerStore = {
 | 
				
			||||||
 | 
					          id: FuseMockApiUtils.guid(),
 | 
				
			||||||
 | 
					          category: '',
 | 
				
			||||||
 | 
					          name: 'A New User',
 | 
				
			||||||
 | 
					          description: '',
 | 
				
			||||||
 | 
					          tags: [],
 | 
				
			||||||
 | 
					          sku: '',
 | 
				
			||||||
 | 
					          barcode: '',
 | 
				
			||||||
 | 
					          brand: '',
 | 
				
			||||||
 | 
					          vendor: '',
 | 
				
			||||||
 | 
					          stock: '',
 | 
				
			||||||
 | 
					          reserved: '',
 | 
				
			||||||
 | 
					          cost: '',
 | 
				
			||||||
 | 
					          basePrice: '',
 | 
				
			||||||
 | 
					          taxPercent: '',
 | 
				
			||||||
 | 
					          price: '',
 | 
				
			||||||
 | 
					          weight: '',
 | 
				
			||||||
 | 
					          thumbnail: '',
 | 
				
			||||||
 | 
					          images: [],
 | 
				
			||||||
 | 
					          active: false,
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Unshift the new partnerStore
 | 
				
			||||||
 | 
					        this._partnerStores.unshift(newPartnerStore);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Return the response
 | 
				
			||||||
 | 
					        return [200, newPartnerStore];
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // -----------------------------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					    // @ PartnerStore - PATCH
 | 
				
			||||||
 | 
					    // -----------------------------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					    this._fuseMockApiService
 | 
				
			||||||
 | 
					      .onPatch('api/apps/member/partner-store/partner-store')
 | 
				
			||||||
 | 
					      .reply(({ request }) => {
 | 
				
			||||||
 | 
					        // Get the id and partnerStore
 | 
				
			||||||
 | 
					        const id = request.body.id;
 | 
				
			||||||
 | 
					        const partnerStore = cloneDeep(request.body.partnerStore);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Prepare the updated partnerStore
 | 
				
			||||||
 | 
					        let updatedPartnerStore = null;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Find the partnerStore and update it
 | 
				
			||||||
 | 
					        this._partnerStores.forEach((item, index, partnerStores) => {
 | 
				
			||||||
 | 
					          if (item.id === id) {
 | 
				
			||||||
 | 
					            // Update the partnerStore
 | 
				
			||||||
 | 
					            partnerStores[index] = assign(
 | 
				
			||||||
 | 
					              {},
 | 
				
			||||||
 | 
					              partnerStores[index],
 | 
				
			||||||
 | 
					              partnerStore
 | 
				
			||||||
 | 
					            );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            // Store the updated partnerStore
 | 
				
			||||||
 | 
					            updatedPartnerStore = partnerStores[index];
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Return the response
 | 
				
			||||||
 | 
					        return [200, updatedPartnerStore];
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // -----------------------------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					    // @ PartnerStore - DELETE
 | 
				
			||||||
 | 
					    // -----------------------------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					    this._fuseMockApiService
 | 
				
			||||||
 | 
					      .onDelete('api/apps/member/partner-store/partner-store')
 | 
				
			||||||
 | 
					      .reply(({ request }) => {
 | 
				
			||||||
 | 
					        // Get the id
 | 
				
			||||||
 | 
					        const id = request.params.get('id');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Find the partnerStore and delete it
 | 
				
			||||||
 | 
					        this._partnerStores.forEach((item, index) => {
 | 
				
			||||||
 | 
					          if (item.id === id) {
 | 
				
			||||||
 | 
					            this._partnerStores.splice(index, 1);
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Return the response
 | 
				
			||||||
 | 
					        return [200, true];
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										33
									
								
								src/app/mock-api/apps/member/partner-store/data.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								src/app/mock-api/apps/member/partner-store/data.ts
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,33 @@
 | 
				
			|||||||
 | 
					/* eslint-disable */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export const partnerStores = [
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    id: 'on00',
 | 
				
			||||||
 | 
					    totalPartnerCount: '5',
 | 
				
			||||||
 | 
					    totalHoldingMoney: 303675,
 | 
				
			||||||
 | 
					    totalComp: 108933,
 | 
				
			||||||
 | 
					    total: 412608,
 | 
				
			||||||
 | 
					    branchCount: 1,
 | 
				
			||||||
 | 
					    divisionCount: 1,
 | 
				
			||||||
 | 
					    officeCount: 1,
 | 
				
			||||||
 | 
					    storeCount: 1,
 | 
				
			||||||
 | 
					    memberCount: 1,
 | 
				
			||||||
 | 
					    nickname: 'on00',
 | 
				
			||||||
 | 
					    accountHolder: '11',
 | 
				
			||||||
 | 
					    phoneNumber: '010-1111-1111',
 | 
				
			||||||
 | 
					    calculateType: '롤링',
 | 
				
			||||||
 | 
					    ownCash: 50000,
 | 
				
			||||||
 | 
					    ownComp: 1711,
 | 
				
			||||||
 | 
					    ownCoupon: 50000,
 | 
				
			||||||
 | 
					    gameMoney: 0,
 | 
				
			||||||
 | 
					    todayComp: 0,
 | 
				
			||||||
 | 
					    totalDeposit: 0,
 | 
				
			||||||
 | 
					    totalWithdraw: 0,
 | 
				
			||||||
 | 
					    balance: 0,
 | 
				
			||||||
 | 
					    registDate: '2022-06-12 15:38',
 | 
				
			||||||
 | 
					    finalSigninDate: '',
 | 
				
			||||||
 | 
					    ip: '',
 | 
				
			||||||
 | 
					    state: '정상',
 | 
				
			||||||
 | 
					    note: '회원등록',
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					];
 | 
				
			||||||
@ -102,6 +102,34 @@ export const defaultNavigation: FuseNavigationItem[] = [
 | 
				
			|||||||
        icon: 'heroicons_outline:academic-cap',
 | 
					        icon: 'heroicons_outline:academic-cap',
 | 
				
			||||||
        link: '/member/partner-office',
 | 
					        link: '/member/partner-office',
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        id: 'member.partner-store',
 | 
				
			||||||
 | 
					        title: 'Partner Store',
 | 
				
			||||||
 | 
					        type: 'basic',
 | 
				
			||||||
 | 
					        icon: 'heroicons_outline:academic-cap',
 | 
				
			||||||
 | 
					        link: '/member/partner-store',
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        id: 'member.partner-recommendation',
 | 
				
			||||||
 | 
					        title: 'Partner Recommendation',
 | 
				
			||||||
 | 
					        type: 'basic',
 | 
				
			||||||
 | 
					        icon: 'heroicons_outline:academic-cap',
 | 
				
			||||||
 | 
					        link: '/member/partner-recommendation',
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        id: 'member.coupon',
 | 
				
			||||||
 | 
					        title: 'Coupon',
 | 
				
			||||||
 | 
					        type: 'basic',
 | 
				
			||||||
 | 
					        icon: 'heroicons_outline:academic-cap',
 | 
				
			||||||
 | 
					        link: '/member/coupon',
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        id: 'member.coupon-moneylog',
 | 
				
			||||||
 | 
					        title: 'Coupon Moneylog',
 | 
				
			||||||
 | 
					        type: 'basic',
 | 
				
			||||||
 | 
					        icon: 'heroicons_outline:academic-cap',
 | 
				
			||||||
 | 
					        link: '/member/coupon-moneylog',
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
    ],
 | 
					    ],
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
 | 
				
			|||||||
@ -19,6 +19,10 @@ import { MemberPartnerMockApi } from './apps/member/partner/api';
 | 
				
			|||||||
import { MemberPartnerBranchMockApi } from './apps/member/partner-branch/api';
 | 
					import { MemberPartnerBranchMockApi } from './apps/member/partner-branch/api';
 | 
				
			||||||
import { MemberPartnerDivisionMockApi } from './apps/member/partner-division/api';
 | 
					import { MemberPartnerDivisionMockApi } from './apps/member/partner-division/api';
 | 
				
			||||||
import { MemberPartnerOfficeMockApi } from './apps/member/partner-office/api';
 | 
					import { MemberPartnerOfficeMockApi } from './apps/member/partner-office/api';
 | 
				
			||||||
 | 
					import { MemberPartnerStoreMockApi } from './apps/member/partner-store/api';
 | 
				
			||||||
 | 
					import { MemberPartnerRecommendationMockApi } from './apps/member/partner-recommendation/api';
 | 
				
			||||||
 | 
					import { MemberCouponMockApi } from './apps/member/coupon/api';
 | 
				
			||||||
 | 
					import { MemberCouponMoneylogMockApi } from './apps/member/coupon-moneylog/api';
 | 
				
			||||||
import { MessagesMockApi } from 'app/mock-api/common/messages/api';
 | 
					import { MessagesMockApi } from 'app/mock-api/common/messages/api';
 | 
				
			||||||
import { NavigationMockApi } from 'app/mock-api/common/navigation/api';
 | 
					import { NavigationMockApi } from 'app/mock-api/common/navigation/api';
 | 
				
			||||||
import { NotesMockApi } from 'app/mock-api/apps/notes/api';
 | 
					import { NotesMockApi } from 'app/mock-api/apps/notes/api';
 | 
				
			||||||
@ -58,6 +62,10 @@ export const mockApiServices = [
 | 
				
			|||||||
  MemberPartnerBranchMockApi,
 | 
					  MemberPartnerBranchMockApi,
 | 
				
			||||||
  MemberPartnerDivisionMockApi,
 | 
					  MemberPartnerDivisionMockApi,
 | 
				
			||||||
  MemberPartnerOfficeMockApi,
 | 
					  MemberPartnerOfficeMockApi,
 | 
				
			||||||
 | 
					  MemberPartnerStoreMockApi,
 | 
				
			||||||
 | 
					  MemberPartnerRecommendationMockApi,
 | 
				
			||||||
 | 
					  MemberCouponMockApi,
 | 
				
			||||||
 | 
					  MemberCouponMoneylogMockApi,
 | 
				
			||||||
  MessagesMockApi,
 | 
					  MessagesMockApi,
 | 
				
			||||||
  NavigationMockApi,
 | 
					  NavigationMockApi,
 | 
				
			||||||
  NotesMockApi,
 | 
					  NotesMockApi,
 | 
				
			||||||
 | 
				
			|||||||
@ -85,55 +85,23 @@
 | 
				
			|||||||
              matSortDisableClear
 | 
					              matSortDisableClear
 | 
				
			||||||
            >
 | 
					            >
 | 
				
			||||||
              <div></div>
 | 
					              <div></div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="'rank'">등급</div>
 | 
					              <div class="hidden sm:block">등급</div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="'level'">
 | 
					              <div class="hidden sm:block">레벨</div>
 | 
				
			||||||
                레벨
 | 
					              <div class="hidden sm:block">아이디</div>
 | 
				
			||||||
              </div>
 | 
					              <div class="hidden sm:block">닉네임</div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="'id'">아이디</div>
 | 
					              <div class="hidden sm:block">입금예정금액</div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="'nickname'">
 | 
					              <div class="hidden sm:block">정산종류</div>
 | 
				
			||||||
                닉네임
 | 
					              <div class="hidden sm:block">회원정보</div>
 | 
				
			||||||
              </div>
 | 
					              <div class="hidden sm:block">비고</div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="'paymentDue'">
 | 
					              <div class="hidden sm:block">등록날짜</div>
 | 
				
			||||||
                입금예정금액
 | 
					              <div class="hidden sm:block">처리날짜</div>
 | 
				
			||||||
              </div>
 | 
					              <div class="hidden sm:block">입금출금</div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="'calculateType'">
 | 
					              <div class="hidden sm:block">게임중머니</div>
 | 
				
			||||||
                정산종류
 | 
					              <div class="hidden sm:block">카지노->캐쉬</div>
 | 
				
			||||||
              </div>
 | 
					              <div class="hidden sm:block">상위</div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="'accountHolder'">
 | 
					              <div class="hidden sm:block">상태</div>
 | 
				
			||||||
                회원정보
 | 
					              <div class="hidden sm:block">배팅정보</div>
 | 
				
			||||||
              </div>
 | 
					              <div class="hidden sm:block">삭제</div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="'note'">비고</div>
 | 
					 | 
				
			||||||
              <div
 | 
					 | 
				
			||||||
                class="hidden sm:block"
 | 
					 | 
				
			||||||
                [mat-sort-header]="'registrationDate'"
 | 
					 | 
				
			||||||
              >
 | 
					 | 
				
			||||||
                등록날짜
 | 
					 | 
				
			||||||
              </div>
 | 
					 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="'processDate'">
 | 
					 | 
				
			||||||
                처리날짜
 | 
					 | 
				
			||||||
              </div>
 | 
					 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="''">입금출금</div>
 | 
					 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="'gameMoney'">
 | 
					 | 
				
			||||||
                게임중머니
 | 
					 | 
				
			||||||
              </div>
 | 
					 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="'casinoCash'">
 | 
					 | 
				
			||||||
                카지노->캐쉬
 | 
					 | 
				
			||||||
              </div>
 | 
					 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="'highRank'">
 | 
					 | 
				
			||||||
                상위
 | 
					 | 
				
			||||||
              </div>
 | 
					 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="'state'">
 | 
					 | 
				
			||||||
                상태
 | 
					 | 
				
			||||||
              </div>
 | 
					 | 
				
			||||||
              <div
 | 
					 | 
				
			||||||
                class="hidden sm:block"
 | 
					 | 
				
			||||||
                [mat-sort-header]="'bettingInfomation'"
 | 
					 | 
				
			||||||
              >
 | 
					 | 
				
			||||||
                배팅정보
 | 
					 | 
				
			||||||
              </div>
 | 
					 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="'delete'">
 | 
					 | 
				
			||||||
                삭제
 | 
					 | 
				
			||||||
              </div>
 | 
					 | 
				
			||||||
              <!-- <div class="hidden md:block" [mat-sort-header]="'sku'">SKU</div>
 | 
					              <!-- <div class="hidden md:block" [mat-sort-header]="'sku'">SKU</div>
 | 
				
			||||||
              <div [mat-sort-header]="'name'">Name</div>
 | 
					              <div [mat-sort-header]="'name'">Name</div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="'price'">
 | 
					              <div class="hidden sm:block" [mat-sort-header]="'price'">
 | 
				
			||||||
 | 
				
			|||||||
@ -85,43 +85,19 @@
 | 
				
			|||||||
              matSortDisableClear
 | 
					              matSortDisableClear
 | 
				
			||||||
            >
 | 
					            >
 | 
				
			||||||
              <div></div>
 | 
					              <div></div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="'rank'">등급</div>
 | 
					              <div class="hidden sm:block">등급</div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="'id'">아이디</div>
 | 
					              <div class="hidden sm:block">아이디</div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="'nickname'">
 | 
					              <div class="hidden sm:block">닉네임</div>
 | 
				
			||||||
                닉네임
 | 
					              <div class="hidden sm:block">정산종류</div>
 | 
				
			||||||
              </div>
 | 
					              <div class="hidden sm:block">회원정보</div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="'calculateType'">
 | 
					              <div class="hidden sm:block">비고</div>
 | 
				
			||||||
                정산종류
 | 
					              <div class="hidden sm:block">등록날짜</div>
 | 
				
			||||||
              </div>
 | 
					              <div class="hidden sm:block">처리날짜</div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="'accountHolder'">
 | 
					              <div class="hidden sm:block">입금출금</div>
 | 
				
			||||||
                회원정보
 | 
					              <div class="hidden sm:block">상위</div>
 | 
				
			||||||
              </div>
 | 
					              <div class="hidden sm:block">상태</div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="'note'">비고</div>
 | 
					              <div class="hidden sm:block">배팅정보</div>
 | 
				
			||||||
              <div
 | 
					              <div class="hidden sm:block">삭제</div>
 | 
				
			||||||
                class="hidden sm:block"
 | 
					 | 
				
			||||||
                [mat-sort-header]="'registrationDate'"
 | 
					 | 
				
			||||||
              >
 | 
					 | 
				
			||||||
                등록날짜
 | 
					 | 
				
			||||||
              </div>
 | 
					 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="'processDate'">
 | 
					 | 
				
			||||||
                처리날짜
 | 
					 | 
				
			||||||
              </div>
 | 
					 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="''">입금출금</div>
 | 
					 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="'highRank'">
 | 
					 | 
				
			||||||
                상위
 | 
					 | 
				
			||||||
              </div>
 | 
					 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="'state'">
 | 
					 | 
				
			||||||
                상태
 | 
					 | 
				
			||||||
              </div>
 | 
					 | 
				
			||||||
              <div
 | 
					 | 
				
			||||||
                class="hidden sm:block"
 | 
					 | 
				
			||||||
                [mat-sort-header]="'bettingInfomation'"
 | 
					 | 
				
			||||||
              >
 | 
					 | 
				
			||||||
                배팅정보
 | 
					 | 
				
			||||||
              </div>
 | 
					 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="'delete'">
 | 
					 | 
				
			||||||
                삭제
 | 
					 | 
				
			||||||
              </div>
 | 
					 | 
				
			||||||
              <!-- <div class="hidden md:block" [mat-sort-header]="'sku'">SKU</div>
 | 
					              <!-- <div class="hidden md:block" [mat-sort-header]="'sku'">SKU</div>
 | 
				
			||||||
              <div [mat-sort-header]="'name'">Name</div>
 | 
					              <div [mat-sort-header]="'name'">Name</div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="'price'">
 | 
					              <div class="hidden sm:block" [mat-sort-header]="'price'">
 | 
				
			||||||
 | 
				
			|||||||
@ -124,32 +124,16 @@
 | 
				
			|||||||
              matSortDisableClear
 | 
					              matSortDisableClear
 | 
				
			||||||
            >
 | 
					            >
 | 
				
			||||||
              <div></div>
 | 
					              <div></div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="'highRank'">
 | 
					              <div class="hidden sm:block">상위</div>
 | 
				
			||||||
                상위
 | 
					              <div class="hidden sm:block">유저</div>
 | 
				
			||||||
              </div>
 | 
					              <div class="hidden sm:block">게임</div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="'userInfo'">
 | 
					              <div class="hidden sm:block">형식</div>
 | 
				
			||||||
                유저
 | 
					              <div class="hidden sm:block">금액</div>
 | 
				
			||||||
              </div>
 | 
					              <div class="hidden sm:block">배팅</div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="'gameInfo'">
 | 
					              <div class="hidden sm:block">데이터</div>
 | 
				
			||||||
                게임
 | 
					              <div class="hidden sm:block">콤프</div>
 | 
				
			||||||
              </div>
 | 
					              <div class="hidden sm:block">롤링</div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="'form'">형식</div>
 | 
					              <div class="hidden sm:block">배팅시간 등록시간</div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="'money'">
 | 
					 | 
				
			||||||
                금액
 | 
					 | 
				
			||||||
              </div>
 | 
					 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="'betting'">
 | 
					 | 
				
			||||||
                배팅
 | 
					 | 
				
			||||||
              </div>
 | 
					 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="'data'">
 | 
					 | 
				
			||||||
                데이터
 | 
					 | 
				
			||||||
              </div>
 | 
					 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="'comp'">콤프</div>
 | 
					 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="'rolling'">
 | 
					 | 
				
			||||||
                롤링
 | 
					 | 
				
			||||||
              </div>
 | 
					 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="'time'">
 | 
					 | 
				
			||||||
                배팅시간 등록시간
 | 
					 | 
				
			||||||
              </div>
 | 
					 | 
				
			||||||
              <!-- <div class="hidden md:block" [mat-sort-header]="'sku'">SKU</div>
 | 
					              <!-- <div class="hidden md:block" [mat-sort-header]="'sku'">SKU</div>
 | 
				
			||||||
              <div [mat-sort-header]="'name'">Name</div>
 | 
					              <div [mat-sort-header]="'name'">Name</div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="'price'">
 | 
					              <div class="hidden sm:block" [mat-sort-header]="'price'">
 | 
				
			||||||
 | 
				
			|||||||
@ -104,35 +104,17 @@
 | 
				
			|||||||
              matSortDisableClear
 | 
					              matSortDisableClear
 | 
				
			||||||
            >
 | 
					            >
 | 
				
			||||||
              <div></div>
 | 
					              <div></div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="'highRank'">
 | 
					              <div class="hidden sm:block">상위</div>
 | 
				
			||||||
                상위
 | 
					              <div class="hidden sm:block">유저</div>
 | 
				
			||||||
              </div>
 | 
					              <div class="hidden sm:block">게임</div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="'userInfo'">
 | 
					              <div class="hidden sm:block">형식</div>
 | 
				
			||||||
                유저
 | 
					              <div class="hidden sm:block">금액</div>
 | 
				
			||||||
              </div>
 | 
					              <div class="hidden sm:block">최종금액</div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="'gameInfo'">
 | 
					              <div class="hidden sm:block">배팅</div>
 | 
				
			||||||
                게임
 | 
					              <div class="hidden sm:block">데이터</div>
 | 
				
			||||||
              </div>
 | 
					              <div class="hidden sm:block">콤프</div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="'form'">형식</div>
 | 
					              <div class="hidden sm:block">롤링</div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="'money'">
 | 
					              <div class="hidden sm:block">배팅시간 등록시간</div>
 | 
				
			||||||
                금액
 | 
					 | 
				
			||||||
              </div>
 | 
					 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="'money'">
 | 
					 | 
				
			||||||
                최종금액
 | 
					 | 
				
			||||||
              </div>
 | 
					 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="'betting'">
 | 
					 | 
				
			||||||
                배팅
 | 
					 | 
				
			||||||
              </div>
 | 
					 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="'data'">
 | 
					 | 
				
			||||||
                데이터
 | 
					 | 
				
			||||||
              </div>
 | 
					 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="'comp'">콤프</div>
 | 
					 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="'rolling'">
 | 
					 | 
				
			||||||
                롤링
 | 
					 | 
				
			||||||
              </div>
 | 
					 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="'time'">
 | 
					 | 
				
			||||||
                배팅시간 등록시간
 | 
					 | 
				
			||||||
              </div>
 | 
					 | 
				
			||||||
              <!-- <div class="hidden md:block" [mat-sort-header]="'sku'">SKU</div>
 | 
					              <!-- <div class="hidden md:block" [mat-sort-header]="'sku'">SKU</div>
 | 
				
			||||||
              <div [mat-sort-header]="'name'">Name</div>
 | 
					              <div [mat-sort-header]="'name'">Name</div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="'price'">
 | 
					              <div class="hidden sm:block" [mat-sort-header]="'price'">
 | 
				
			||||||
 | 
				
			|||||||
@ -132,38 +132,22 @@
 | 
				
			|||||||
              matSortDisableClear
 | 
					              matSortDisableClear
 | 
				
			||||||
            >
 | 
					            >
 | 
				
			||||||
              <div></div>
 | 
					              <div></div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="'index'">
 | 
					              <div class="hidden sm:block">번호</div>
 | 
				
			||||||
                번호
 | 
					              <div class="hidden sm:block">구분</div>
 | 
				
			||||||
              </div>
 | 
					              <div class="hidden sm:block">등급</div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="'division'">
 | 
					              <div class="hidden sm:block">아이디</div>
 | 
				
			||||||
                구분
 | 
					 | 
				
			||||||
              </div>
 | 
					 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="'rank'">등급</div>
 | 
					 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="'id'">아이디</div>
 | 
					 | 
				
			||||||
              <div
 | 
					              <div
 | 
				
			||||||
                class="hidden sm:block"
 | 
					                class="hidden sm:block"
 | 
				
			||||||
                [mat-sort-header]="'bettingProgress'"
 | 
					                [mat-sort-header]="'bettingProgress'"
 | 
				
			||||||
              >
 | 
					              >
 | 
				
			||||||
                배팅진행내역
 | 
					                배팅진행내역
 | 
				
			||||||
              </div>
 | 
					              </div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="'odds'">
 | 
					              <div class="hidden sm:block">배당률</div>
 | 
				
			||||||
                배당률
 | 
					              <div class="hidden sm:block">배팅액</div>
 | 
				
			||||||
              </div>
 | 
					              <div class="hidden sm:block">배당적중금</div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="'bettingMoney'">
 | 
					              <div class="hidden sm:block">배팅시간</div>
 | 
				
			||||||
                배팅액
 | 
					              <div class="hidden sm:block">결과</div>
 | 
				
			||||||
              </div>
 | 
					              <div class="hidden sm:block">취소/삭제 여부</div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="'hitMoney'">
 | 
					 | 
				
			||||||
                배당적중금
 | 
					 | 
				
			||||||
              </div>
 | 
					 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="'bettingTime'">
 | 
					 | 
				
			||||||
                배팅시간
 | 
					 | 
				
			||||||
              </div>
 | 
					 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="'result'">
 | 
					 | 
				
			||||||
                결과
 | 
					 | 
				
			||||||
              </div>
 | 
					 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="'delete'">
 | 
					 | 
				
			||||||
                취소/삭제 여부
 | 
					 | 
				
			||||||
              </div>
 | 
					 | 
				
			||||||
              <!-- <div class="hidden md:block" [mat-sort-header]="'sku'">SKU</div>
 | 
					              <!-- <div class="hidden md:block" [mat-sort-header]="'sku'">SKU</div>
 | 
				
			||||||
              <div [mat-sort-header]="'name'">Name</div>
 | 
					              <div [mat-sort-header]="'name'">Name</div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="'price'">
 | 
					              <div class="hidden sm:block" [mat-sort-header]="'price'">
 | 
				
			||||||
 | 
				
			|||||||
@ -134,35 +134,17 @@
 | 
				
			|||||||
              matSortDisableClear
 | 
					              matSortDisableClear
 | 
				
			||||||
            >
 | 
					            >
 | 
				
			||||||
              <div></div>
 | 
					              <div></div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="'highRank'">
 | 
					              <div class="hidden sm:block">상위</div>
 | 
				
			||||||
                상위
 | 
					              <div class="hidden sm:block">유저</div>
 | 
				
			||||||
              </div>
 | 
					              <div class="hidden sm:block">게임</div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="'userInfo'">
 | 
					              <div class="hidden sm:block">형식</div>
 | 
				
			||||||
                유저
 | 
					              <div class="hidden sm:block">금액</div>
 | 
				
			||||||
              </div>
 | 
					              <div class="hidden sm:block">최종금액</div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="'gameInfo'">
 | 
					              <div class="hidden sm:block">배팅</div>
 | 
				
			||||||
                게임
 | 
					              <div class="hidden sm:block">데이터</div>
 | 
				
			||||||
              </div>
 | 
					              <div class="hidden sm:block">콤프</div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="'form'">형식</div>
 | 
					              <div class="hidden sm:block">롤링</div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="'money'">
 | 
					              <div class="hidden sm:block">배팅시간 등록시간</div>
 | 
				
			||||||
                금액
 | 
					 | 
				
			||||||
              </div>
 | 
					 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="'money'">
 | 
					 | 
				
			||||||
                최종금액
 | 
					 | 
				
			||||||
              </div>
 | 
					 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="'betting'">
 | 
					 | 
				
			||||||
                배팅
 | 
					 | 
				
			||||||
              </div>
 | 
					 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="'data'">
 | 
					 | 
				
			||||||
                데이터
 | 
					 | 
				
			||||||
              </div>
 | 
					 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="'comp'">콤프</div>
 | 
					 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="'rolling'">
 | 
					 | 
				
			||||||
                롤링
 | 
					 | 
				
			||||||
              </div>
 | 
					 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="'time'">
 | 
					 | 
				
			||||||
                배팅시간 등록시간
 | 
					 | 
				
			||||||
              </div>
 | 
					 | 
				
			||||||
              <!-- <div class="hidden md:block" [mat-sort-header]="'sku'">SKU</div>
 | 
					              <!-- <div class="hidden md:block" [mat-sort-header]="'sku'">SKU</div>
 | 
				
			||||||
              <div [mat-sort-header]="'name'">Name</div>
 | 
					              <div [mat-sort-header]="'name'">Name</div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="'price'">
 | 
					              <div class="hidden sm:block" [mat-sort-header]="'price'">
 | 
				
			||||||
 | 
				
			|||||||
@ -129,39 +129,19 @@
 | 
				
			|||||||
              matSortDisableClear
 | 
					              matSortDisableClear
 | 
				
			||||||
            >
 | 
					            >
 | 
				
			||||||
              <div class="hidden sm:block">요율</div>
 | 
					              <div class="hidden sm:block">요율</div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="'management'">
 | 
					              <div class="hidden sm:block">관리</div>
 | 
				
			||||||
                관리
 | 
					              <div class="hidden sm:block">아이디</div>
 | 
				
			||||||
              </div>
 | 
					              <div class="hidden sm:block">닉네임</div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="'id'">아이디</div>
 | 
					              <div class="hidden sm:block">예금주</div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="'nickname'">
 | 
					              <div class="hidden sm:block">연락처</div>
 | 
				
			||||||
                닉네임
 | 
					              <div class="hidden sm:block">보유금</div>
 | 
				
			||||||
              </div>
 | 
					              <div class="hidden sm:block">게임중머니</div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="'accountHolder'">
 | 
					              <div class="hidden sm:block">카지노->캐쉬</div>
 | 
				
			||||||
                예금주
 | 
					              <div class="hidden sm:block">금일콤프</div>
 | 
				
			||||||
              </div>
 | 
					              <div class="hidden sm:block">총입출</div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="'contact'">
 | 
					              <div class="hidden sm:block">로그</div>
 | 
				
			||||||
                연락처
 | 
					              <div class="hidden sm:block">상태</div>
 | 
				
			||||||
              </div>
 | 
					              <div class="hidden sm:block">상부</div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="'reserve'">
 | 
					 | 
				
			||||||
                보유금
 | 
					 | 
				
			||||||
              </div>
 | 
					 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="'gameMoney'">
 | 
					 | 
				
			||||||
                게임중머니
 | 
					 | 
				
			||||||
              </div>
 | 
					 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="'casinoCash'">
 | 
					 | 
				
			||||||
                카지노->캐쉬
 | 
					 | 
				
			||||||
              </div>
 | 
					 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="'todayComp'">
 | 
					 | 
				
			||||||
                금일콤프
 | 
					 | 
				
			||||||
              </div>
 | 
					 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="'total'">
 | 
					 | 
				
			||||||
                총입출
 | 
					 | 
				
			||||||
              </div>
 | 
					 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="'log'">로그</div>
 | 
					 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="'state'">
 | 
					 | 
				
			||||||
                상태
 | 
					 | 
				
			||||||
              </div>
 | 
					 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="'top'">상부</div>
 | 
					 | 
				
			||||||
            </div>
 | 
					            </div>
 | 
				
			||||||
            <!-- Rows -->
 | 
					            <!-- Rows -->
 | 
				
			||||||
            <ng-container *ngIf="casinomoneys$ | async as casinomoneys">
 | 
					            <ng-container *ngIf="casinomoneys$ | async as casinomoneys">
 | 
				
			||||||
 | 
				
			|||||||
@ -0,0 +1,3 @@
 | 
				
			|||||||
 | 
					import { ListComponent } from './list.component';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export const COMPONENTS = [ListComponent];
 | 
				
			||||||
@ -0,0 +1,360 @@
 | 
				
			|||||||
 | 
					<div
 | 
				
			||||||
 | 
					  class="sm:absolute sm:inset-0 flex flex-col flex-auto min-w-0 sm:overflow-hidden bg-card dark:bg-transparent"
 | 
				
			||||||
 | 
					>
 | 
				
			||||||
 | 
					  <!-- Header -->
 | 
				
			||||||
 | 
					  <div
 | 
				
			||||||
 | 
					    class="relative flex flex-col sm:flex-row flex-0 sm:items-center sm:justify-between py-8 px-6 md:px-8 border-b"
 | 
				
			||||||
 | 
					  >
 | 
				
			||||||
 | 
					    <!-- Loader -->
 | 
				
			||||||
 | 
					    <div class="absolute inset-x-0 bottom-0" *ngIf="isLoading">
 | 
				
			||||||
 | 
					      <mat-progress-bar [mode]="'indeterminate'"></mat-progress-bar>
 | 
				
			||||||
 | 
					    </div>
 | 
				
			||||||
 | 
					    <!-- Title -->
 | 
				
			||||||
 | 
					    <div class="text-4xl font-extrabold tracking-tight">쿠폰발행 머니로그</div>
 | 
				
			||||||
 | 
					    <!-- Actions -->
 | 
				
			||||||
 | 
					    <div class="flex shrink-0 items-center mt-6 sm:mt-0 sm:ml-4">
 | 
				
			||||||
 | 
					      <!-- Memo -->
 | 
				
			||||||
 | 
					      <!-- <mat-form-field>
 | 
				
			||||||
 | 
					        <ng-container *ngIf="couponMoneylogs$ | async as couponMoneylogs">
 | 
				
			||||||
 | 
					          <ng-container
 | 
				
			||||||
 | 
					            *ngFor="let couponMoneylog of couponMoneylogs; trackBy: __trackByFn"
 | 
				
			||||||
 | 
					          >
 | 
				
			||||||
 | 
					            <div
 | 
				
			||||||
 | 
					              class="inventory-grid grid items-center gap-4 py-3 px-6 md:px-8 border-b"
 | 
				
			||||||
 | 
					            >
 | 
				
			||||||
 | 
					              <fieldset>
 | 
				
			||||||
 | 
					                총 파트너수:{{ couponMoneylog.totalPartnerCount }} 
 | 
				
			||||||
 | 
					                총 보유머니:{{
 | 
				
			||||||
 | 
					                  couponMoneylog.totalHoldingMoney
 | 
				
			||||||
 | 
					                }}
 | 
				
			||||||
 | 
					                총 콤프:{{ couponMoneylog.totalComp }} 총 합계:{{
 | 
				
			||||||
 | 
					                  couponMoneylog.total
 | 
				
			||||||
 | 
					                }}
 | 
				
			||||||
 | 
					              </fieldset>
 | 
				
			||||||
 | 
					            </div>
 | 
				
			||||||
 | 
					          </ng-container>
 | 
				
			||||||
 | 
					        </ng-container>
 | 
				
			||||||
 | 
					      </mat-form-field> -->
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      <!-- SelectBox -->
 | 
				
			||||||
 | 
					      <mat-form-field>
 | 
				
			||||||
 | 
					        <mat-select placeholder="리스트수">
 | 
				
			||||||
 | 
					          <mat-option value="40">40</mat-option>
 | 
				
			||||||
 | 
					          <mat-option value="60">60</mat-option>
 | 
				
			||||||
 | 
					          <mat-option value="80">80</mat-option>
 | 
				
			||||||
 | 
					          <mat-option value="100">100</mat-option>
 | 
				
			||||||
 | 
					        </mat-select>
 | 
				
			||||||
 | 
					      </mat-form-field>
 | 
				
			||||||
 | 
					      <mat-form-field>
 | 
				
			||||||
 | 
					        <mat-select placeholder="레벨">
 | 
				
			||||||
 | 
					          <mat-option value="level1">LV.1</mat-option>
 | 
				
			||||||
 | 
					          <mat-option value="level2">LV.2</mat-option>
 | 
				
			||||||
 | 
					          <mat-option value="level3">LV.3</mat-option>
 | 
				
			||||||
 | 
					          <mat-option value="level4">LV.4</mat-option>
 | 
				
			||||||
 | 
					        </mat-select>
 | 
				
			||||||
 | 
					      </mat-form-field>
 | 
				
			||||||
 | 
					      <mat-form-field>
 | 
				
			||||||
 | 
					        <mat-select placeholder="상태">
 | 
				
			||||||
 | 
					          <mat-option value="">정상</mat-option>
 | 
				
			||||||
 | 
					          <mat-option value="">대기</mat-option>
 | 
				
			||||||
 | 
					          <mat-option value="">탈퇴</mat-option>
 | 
				
			||||||
 | 
					          <mat-option value="">휴면</mat-option>
 | 
				
			||||||
 | 
					          <mat-option value="">블랙</mat-option>
 | 
				
			||||||
 | 
					          <mat-option value="">정지</mat-option>
 | 
				
			||||||
 | 
					        </mat-select>
 | 
				
			||||||
 | 
					      </mat-form-field>
 | 
				
			||||||
 | 
					      <mat-form-field>
 | 
				
			||||||
 | 
					        <mat-select placeholder="제한">
 | 
				
			||||||
 | 
					          <mat-option value="">카지노제한</mat-option>
 | 
				
			||||||
 | 
					          <mat-option value="">슬롯제한</mat-option>
 | 
				
			||||||
 | 
					        </mat-select>
 | 
				
			||||||
 | 
					      </mat-form-field>
 | 
				
			||||||
 | 
					      <mat-form-field>
 | 
				
			||||||
 | 
					        <mat-select placeholder="입금">
 | 
				
			||||||
 | 
					          <mat-option value="">계좌입금</mat-option>
 | 
				
			||||||
 | 
					        </mat-select>
 | 
				
			||||||
 | 
					      </mat-form-field>
 | 
				
			||||||
 | 
					      <mat-form-field>
 | 
				
			||||||
 | 
					        <mat-select placeholder="내용">
 | 
				
			||||||
 | 
					          <mat-option value="">카지노콤프</mat-option>
 | 
				
			||||||
 | 
					          <mat-option value="">슬롯콤프</mat-option>
 | 
				
			||||||
 | 
					          <mat-option value="">배팅콤프</mat-option>
 | 
				
			||||||
 | 
					          <mat-option value="">첫충콤프</mat-option>
 | 
				
			||||||
 | 
					        </mat-select>
 | 
				
			||||||
 | 
					      </mat-form-field>
 | 
				
			||||||
 | 
					      <!-- <mat-form-field>
 | 
				
			||||||
 | 
					        <mat-select placeholder="입금">
 | 
				
			||||||
 | 
					          <mat-option value="">계좌입금</mat-option>
 | 
				
			||||||
 | 
					        </mat-select>
 | 
				
			||||||
 | 
					      </mat-form-field>
 | 
				
			||||||
 | 
					      <mat-form-field>
 | 
				
			||||||
 | 
					        <mat-select placeholder="아이디">
 | 
				
			||||||
 | 
					          <mat-option value="">아이디</mat-option>
 | 
				
			||||||
 | 
					          <mat-option value="">닉네임</mat-option>
 | 
				
			||||||
 | 
					          <mat-option value="">이름</mat-option>
 | 
				
			||||||
 | 
					          <mat-option value="">사이트</mat-option>
 | 
				
			||||||
 | 
					          <mat-option value="">파트너수동지급</mat-option>
 | 
				
			||||||
 | 
					        </mat-select>
 | 
				
			||||||
 | 
					      </mat-form-field>
 | 
				
			||||||
 | 
					      <mat-form-field>
 | 
				
			||||||
 | 
					        <mat-select placeholder="가입일 정렬">
 | 
				
			||||||
 | 
					          <mat-option value="">가입일 정렬</mat-option>
 | 
				
			||||||
 | 
					          <mat-option value="">아이디 정렬</mat-option>
 | 
				
			||||||
 | 
					          <mat-option value="">닉네임 정렬</mat-option>
 | 
				
			||||||
 | 
					          <mat-option value="">캐쉬 정렬</mat-option>
 | 
				
			||||||
 | 
					          <mat-option value="">콤프 정렬</mat-option>
 | 
				
			||||||
 | 
					          <mat-option value="">쿠폰 정렬</mat-option>
 | 
				
			||||||
 | 
					          <mat-option value="">입금 정렬</mat-option>
 | 
				
			||||||
 | 
					          <mat-option value="">출금 정렬</mat-option>
 | 
				
			||||||
 | 
					          <mat-option value="">차익 정렬</mat-option>
 | 
				
			||||||
 | 
					        </mat-select>
 | 
				
			||||||
 | 
					      </mat-form-field>
 | 
				
			||||||
 | 
					      <mat-form-field>
 | 
				
			||||||
 | 
					        <mat-select placeholder="내림차순">
 | 
				
			||||||
 | 
					          <mat-option value="">내림차순</mat-option>
 | 
				
			||||||
 | 
					          <mat-option value="">오름차순</mat-option>
 | 
				
			||||||
 | 
					        </mat-select>
 | 
				
			||||||
 | 
					      </mat-form-field> -->
 | 
				
			||||||
 | 
					      <!-- Search -->
 | 
				
			||||||
 | 
					      <mat-form-field
 | 
				
			||||||
 | 
					        class="fuse-mat-dense fuse-mat-no-subscript fuse-mat-rounded min-w-64"
 | 
				
			||||||
 | 
					      >
 | 
				
			||||||
 | 
					        <mat-icon
 | 
				
			||||||
 | 
					          class="icon-size-5"
 | 
				
			||||||
 | 
					          matPrefix
 | 
				
			||||||
 | 
					          [svgIcon]="'heroicons_solid:search'"
 | 
				
			||||||
 | 
					        ></mat-icon>
 | 
				
			||||||
 | 
					        <input
 | 
				
			||||||
 | 
					          matInput
 | 
				
			||||||
 | 
					          [formControl]="searchInputControl"
 | 
				
			||||||
 | 
					          [autocomplete]="'off'"
 | 
				
			||||||
 | 
					          [placeholder]="'Search'"
 | 
				
			||||||
 | 
					        />
 | 
				
			||||||
 | 
					      </mat-form-field>
 | 
				
			||||||
 | 
					      <!-- Add user button -->
 | 
				
			||||||
 | 
					      <button
 | 
				
			||||||
 | 
					        class="ml-4"
 | 
				
			||||||
 | 
					        mat-flat-button
 | 
				
			||||||
 | 
					        [color]="'primary'"
 | 
				
			||||||
 | 
					        (click)="__createProduct()"
 | 
				
			||||||
 | 
					      >
 | 
				
			||||||
 | 
					        <!-- <mat-icon [svgIcon]="'heroicons_outline:plus'"></mat-icon> -->
 | 
				
			||||||
 | 
					        <span class="ml-2 mr-1">검색하기</span>
 | 
				
			||||||
 | 
					      </button>
 | 
				
			||||||
 | 
					      <button>엑셀저장</button>
 | 
				
			||||||
 | 
					      <button>카지노머니확인</button>
 | 
				
			||||||
 | 
					    </div>
 | 
				
			||||||
 | 
					  </div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  <!-- Main -->
 | 
				
			||||||
 | 
					  <div class="flex flex-auto overflow-hidden">
 | 
				
			||||||
 | 
					    <!-- Products list -->
 | 
				
			||||||
 | 
					    <div
 | 
				
			||||||
 | 
					      class="flex flex-col flex-auto sm:mb-18 overflow-hidden sm:overflow-y-auto"
 | 
				
			||||||
 | 
					    >
 | 
				
			||||||
 | 
					      <ng-container *ngIf="couponMoneylogs$ | async as couponMoneylogs">
 | 
				
			||||||
 | 
					        <ng-container *ngIf="couponMoneylogs.length > 0; else noCouponMoneylog">
 | 
				
			||||||
 | 
					          <div class="grid">
 | 
				
			||||||
 | 
					            <!-- Header -->
 | 
				
			||||||
 | 
					            <div
 | 
				
			||||||
 | 
					              class="inventory-grid z-10 sticky top-0 grid gap-4 py-4 px-6 md:px-8 shadow text-md font-semibold text-secondary bg-gray-50 dark:bg-black dark:bg-opacity-5"
 | 
				
			||||||
 | 
					              matSort
 | 
				
			||||||
 | 
					              matSortDisableClear
 | 
				
			||||||
 | 
					            >
 | 
				
			||||||
 | 
					              <div class="hidden sm:block"><mat-checkbox></mat-checkbox></div>
 | 
				
			||||||
 | 
					              <div class="hidden sm:block">요율</div>
 | 
				
			||||||
 | 
					              <div class="hidden sm:block">상부트리</div>
 | 
				
			||||||
 | 
					              <div class="hidden sm:block">관리</div>
 | 
				
			||||||
 | 
					              <div class="hidden sm:block">매장수</div>
 | 
				
			||||||
 | 
					              <div class="hidden sm:block">회원수</div>
 | 
				
			||||||
 | 
					              <div class="hidden sm:block">아이디</div>
 | 
				
			||||||
 | 
					              <div class="hidden sm:block">닉네임</div>
 | 
				
			||||||
 | 
					              <div class="hidden sm:block">예금주</div>
 | 
				
			||||||
 | 
					              <div class="hidden sm:block">연락처</div>
 | 
				
			||||||
 | 
					              <div class="hidden sm:block">정산</div>
 | 
				
			||||||
 | 
					              <div class="hidden sm:block">보유금</div>
 | 
				
			||||||
 | 
					              <div class="hidden sm:block">게임중머니</div>
 | 
				
			||||||
 | 
					              <div class="hidden sm:block">카지노->캐쉬</div>
 | 
				
			||||||
 | 
					              <div class="hidden sm:block">금일콤프</div>
 | 
				
			||||||
 | 
					              <div class="hidden sm:block">총입출</div>
 | 
				
			||||||
 | 
					              <div class="hidden sm:block">로그</div>
 | 
				
			||||||
 | 
					              <div class="hidden sm:block">상태</div>
 | 
				
			||||||
 | 
					              <div class="hidden sm:block">회원수</div>
 | 
				
			||||||
 | 
					              <div class="hidden sm:block">비고</div>
 | 
				
			||||||
 | 
					            </div>
 | 
				
			||||||
 | 
					            <!-- Rows -->
 | 
				
			||||||
 | 
					            <ng-container *ngIf="couponMoneylogs$ | async as couponMoneylogs">
 | 
				
			||||||
 | 
					              <ng-container
 | 
				
			||||||
 | 
					                *ngFor="
 | 
				
			||||||
 | 
					                  let couponMoneylog of couponMoneylogs;
 | 
				
			||||||
 | 
					                  trackBy: __trackByFn
 | 
				
			||||||
 | 
					                "
 | 
				
			||||||
 | 
					              >
 | 
				
			||||||
 | 
					                <div
 | 
				
			||||||
 | 
					                  class="inventory-grid grid items-center gap-4 py-3 px-6 md:px-8 border-b"
 | 
				
			||||||
 | 
					                >
 | 
				
			||||||
 | 
					                  <div class="hidden sm:block truncate">
 | 
				
			||||||
 | 
					                    <mat-checkbox></mat-checkbox>
 | 
				
			||||||
 | 
					                  </div>
 | 
				
			||||||
 | 
					                  <!-- rate -->
 | 
				
			||||||
 | 
					                  <div class="hidden sm:block truncate">
 | 
				
			||||||
 | 
					                    <button
 | 
				
			||||||
 | 
					                      mat-button
 | 
				
			||||||
 | 
					                      color="primary"
 | 
				
			||||||
 | 
					                      matTooltip="요율확인
 | 
				
			||||||
 | 
					                                카지노-바카라: 0%
 | 
				
			||||||
 | 
					                                카지노-룰렛: 0%
 | 
				
			||||||
 | 
					                                카지노-드레곤타이거: 0%
 | 
				
			||||||
 | 
					                                카지노-그외: 0%
 | 
				
			||||||
 | 
					                                슬롯: 0%
 | 
				
			||||||
 | 
					                                카지노루징: 0%
 | 
				
			||||||
 | 
					                                슬롯루징: 0%"
 | 
				
			||||||
 | 
					                    >
 | 
				
			||||||
 | 
					                      요율
 | 
				
			||||||
 | 
					                    </button>
 | 
				
			||||||
 | 
					                    <div class="hidden sm:block truncate">
 | 
				
			||||||
 | 
					                      <!-- 관리 -->
 | 
				
			||||||
 | 
					                      <button mat-flat-button [color]="'primary'">
 | 
				
			||||||
 | 
					                        <mat-form-field>
 | 
				
			||||||
 | 
					                          <mat-select placeholder="관리">
 | 
				
			||||||
 | 
					                            <mat-option value="">보유금지급/회수</mat-option>
 | 
				
			||||||
 | 
					                            <mat-option value="">수수료설정</mat-option>
 | 
				
			||||||
 | 
					                            <mat-option value="">콤프지급/회수</mat-option>
 | 
				
			||||||
 | 
					                            <mat-option value="">쿠폰머니지급/회수</mat-option>
 | 
				
			||||||
 | 
					                            <mat-option value="">쪽지보내기</mat-option>
 | 
				
			||||||
 | 
					                            <mat-option value="">베팅리스트</mat-option>
 | 
				
			||||||
 | 
					                            <mat-option value="">강제로그아웃</mat-option>
 | 
				
			||||||
 | 
					                          </mat-select>
 | 
				
			||||||
 | 
					                        </mat-form-field>
 | 
				
			||||||
 | 
					                      </button>
 | 
				
			||||||
 | 
					                    </div>
 | 
				
			||||||
 | 
					                  </div>
 | 
				
			||||||
 | 
					                  <!-- 매장수 -->
 | 
				
			||||||
 | 
					                  <div class="hidden sm:block truncate">
 | 
				
			||||||
 | 
					                    <button mat-flat-button [color]="'primary'">
 | 
				
			||||||
 | 
					                      {{ couponMoneylog.branchCount }}
 | 
				
			||||||
 | 
					                    </button>
 | 
				
			||||||
 | 
					                    <button mat-flat-button [color]="'primary'">
 | 
				
			||||||
 | 
					                      {{ couponMoneylog.divisionCount }}
 | 
				
			||||||
 | 
					                    </button>
 | 
				
			||||||
 | 
					                    <button mat-flat-button [color]="'primary'">
 | 
				
			||||||
 | 
					                      {{ couponMoneylog.officeCount }}
 | 
				
			||||||
 | 
					                    </button>
 | 
				
			||||||
 | 
					                    <button mat-flat-button [color]="'primary'">
 | 
				
			||||||
 | 
					                      {{ couponMoneylog.storeCount }}
 | 
				
			||||||
 | 
					                    </button>
 | 
				
			||||||
 | 
					                  </div>
 | 
				
			||||||
 | 
					                  <!-- 회원수 -->
 | 
				
			||||||
 | 
					                  <div class="hidden sm:block truncate">
 | 
				
			||||||
 | 
					                    <button mat-flat-button [color]="'primary'">
 | 
				
			||||||
 | 
					                      {{ couponMoneylog.memberCount }}
 | 
				
			||||||
 | 
					                    </button>
 | 
				
			||||||
 | 
					                  </div>
 | 
				
			||||||
 | 
					                  <!-- id -->
 | 
				
			||||||
 | 
					                  <ng-container *ngIf="users$ | async as users">
 | 
				
			||||||
 | 
					                    <ng-container
 | 
				
			||||||
 | 
					                      *ngFor="let user of users; trackBy: __trackByFn"
 | 
				
			||||||
 | 
					                    >
 | 
				
			||||||
 | 
					                      <div
 | 
				
			||||||
 | 
					                        class="hidden sm:block truncate"
 | 
				
			||||||
 | 
					                        (click)="viewUserDetail(user.id!)"
 | 
				
			||||||
 | 
					                      >
 | 
				
			||||||
 | 
					                        {{ couponMoneylog.id }}
 | 
				
			||||||
 | 
					                      </div>
 | 
				
			||||||
 | 
					                    </ng-container>
 | 
				
			||||||
 | 
					                  </ng-container>
 | 
				
			||||||
 | 
					                  <!-- nickname -->
 | 
				
			||||||
 | 
					                  <div class="hidden sm:block truncate">
 | 
				
			||||||
 | 
					                    {{ couponMoneylog.nickname }}
 | 
				
			||||||
 | 
					                  </div>
 | 
				
			||||||
 | 
					                  <!-- accountHolder -->
 | 
				
			||||||
 | 
					                  <div class="hidden sm:block truncate">
 | 
				
			||||||
 | 
					                    {{ couponMoneylog.accountHolder }}
 | 
				
			||||||
 | 
					                  </div>
 | 
				
			||||||
 | 
					                  <!-- 연락처 -->
 | 
				
			||||||
 | 
					                  <div class="hidden sm:block truncate">
 | 
				
			||||||
 | 
					                    {{ couponMoneylog.phoneNumber }}
 | 
				
			||||||
 | 
					                  </div>
 | 
				
			||||||
 | 
					                  <!-- 정산 -->
 | 
				
			||||||
 | 
					                  <div class="hidden sm:block truncate">
 | 
				
			||||||
 | 
					                    {{ couponMoneylog.calculateType }}
 | 
				
			||||||
 | 
					                  </div>
 | 
				
			||||||
 | 
					                  <!-- 보유금 -->
 | 
				
			||||||
 | 
					                  <div class="hidden sm:block truncate">
 | 
				
			||||||
 | 
					                    캐쉬{{ couponMoneylog.ownCash }} 콤프{{
 | 
				
			||||||
 | 
					                      couponMoneylog.ownComp
 | 
				
			||||||
 | 
					                    }}
 | 
				
			||||||
 | 
					                    쿠폰{{ couponMoneylog.ownCoupon }}
 | 
				
			||||||
 | 
					                  </div>
 | 
				
			||||||
 | 
					                  <!-- gameMoney -->
 | 
				
			||||||
 | 
					                  <div class="hidden sm:block truncate">
 | 
				
			||||||
 | 
					                    {{ couponMoneylog.gameMoney }}
 | 
				
			||||||
 | 
					                  </div>
 | 
				
			||||||
 | 
					                  <!-- casinoCash -->
 | 
				
			||||||
 | 
					                  <div class="hidden sm:block truncate">
 | 
				
			||||||
 | 
					                    <button mat-flat-button [color]="'primary'">
 | 
				
			||||||
 | 
					                      게임머니확인
 | 
				
			||||||
 | 
					                    </button>
 | 
				
			||||||
 | 
					                    <button mat-flat-button [color]="'primary'">
 | 
				
			||||||
 | 
					                      게임머니회수
 | 
				
			||||||
 | 
					                    </button>
 | 
				
			||||||
 | 
					                  </div>
 | 
				
			||||||
 | 
					                  <!-- todayComp -->
 | 
				
			||||||
 | 
					                  <div class="hidden sm:block truncate">
 | 
				
			||||||
 | 
					                    {{ couponMoneylog.todayComp }}P
 | 
				
			||||||
 | 
					                  </div>
 | 
				
			||||||
 | 
					                  <!-- 총입출 -->
 | 
				
			||||||
 | 
					                  <div class="hidden sm:block truncate">
 | 
				
			||||||
 | 
					                    입금{{ couponMoneylog.totalDeposit }} 출금{{
 | 
				
			||||||
 | 
					                      couponMoneylog.totalWithdraw
 | 
				
			||||||
 | 
					                    }}
 | 
				
			||||||
 | 
					                    차익{{ couponMoneylog.balance }}
 | 
				
			||||||
 | 
					                  </div>
 | 
				
			||||||
 | 
					                  <!-- log -->
 | 
				
			||||||
 | 
					                  <div class="hidden sm:block truncate">
 | 
				
			||||||
 | 
					                    가입{{ couponMoneylog.registDate }} 최종{{
 | 
				
			||||||
 | 
					                      couponMoneylog.finalSigninDate
 | 
				
			||||||
 | 
					                    }}
 | 
				
			||||||
 | 
					                    IP{{ couponMoneylog.ip }}
 | 
				
			||||||
 | 
					                  </div>
 | 
				
			||||||
 | 
					                  <!-- state -->
 | 
				
			||||||
 | 
					                  <div class="hidden sm:block truncate">
 | 
				
			||||||
 | 
					                    {{ couponMoneylog.state }}
 | 
				
			||||||
 | 
					                  </div>
 | 
				
			||||||
 | 
					                  <!-- 회원수 -->
 | 
				
			||||||
 | 
					                  <div class="hidden sm:block truncate">
 | 
				
			||||||
 | 
					                    {{ couponMoneylog.memberCount }}
 | 
				
			||||||
 | 
					                  </div>
 | 
				
			||||||
 | 
					                  <!-- 비고 -->
 | 
				
			||||||
 | 
					                  <div class="hidden sm:block truncate">
 | 
				
			||||||
 | 
					                    <button mat-flat-button [color]="'primary'">
 | 
				
			||||||
 | 
					                      {{ couponMoneylog.note }}
 | 
				
			||||||
 | 
					                    </button>
 | 
				
			||||||
 | 
					                  </div>
 | 
				
			||||||
 | 
					                </div>
 | 
				
			||||||
 | 
					              </ng-container>
 | 
				
			||||||
 | 
					            </ng-container>
 | 
				
			||||||
 | 
					          </div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          <mat-paginator
 | 
				
			||||||
 | 
					            class="sm:absolute sm:inset-x-0 sm:bottom-0 border-b sm:border-t sm:border-b-0 z-10 bg-gray-50 dark:bg-transparent"
 | 
				
			||||||
 | 
					            [ngClass]="{ 'pointer-events-none': isLoading }"
 | 
				
			||||||
 | 
					            [length]="pagination?.length"
 | 
				
			||||||
 | 
					            [pageIndex]="pagination?.page"
 | 
				
			||||||
 | 
					            [pageSize]="pagination?.size"
 | 
				
			||||||
 | 
					            [pageSizeOptions]="[5, 10, 25, 100]"
 | 
				
			||||||
 | 
					            [showFirstLastButtons]="true"
 | 
				
			||||||
 | 
					          ></mat-paginator>
 | 
				
			||||||
 | 
					        </ng-container>
 | 
				
			||||||
 | 
					      </ng-container>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      <ng-template #noCouponMoneylog>
 | 
				
			||||||
 | 
					        <div
 | 
				
			||||||
 | 
					          class="p-8 sm:p-16 border-t text-4xl font-semibold tracking-tight text-center"
 | 
				
			||||||
 | 
					        >
 | 
				
			||||||
 | 
					          There are no coupon moneylogs!
 | 
				
			||||||
 | 
					        </div>
 | 
				
			||||||
 | 
					      </ng-template>
 | 
				
			||||||
 | 
					    </div>
 | 
				
			||||||
 | 
					  </div>
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
@ -0,0 +1,198 @@
 | 
				
			|||||||
 | 
					import {
 | 
				
			||||||
 | 
					  AfterViewInit,
 | 
				
			||||||
 | 
					  ChangeDetectionStrategy,
 | 
				
			||||||
 | 
					  ChangeDetectorRef,
 | 
				
			||||||
 | 
					  Component,
 | 
				
			||||||
 | 
					  OnDestroy,
 | 
				
			||||||
 | 
					  OnInit,
 | 
				
			||||||
 | 
					  ViewChild,
 | 
				
			||||||
 | 
					  ViewEncapsulation,
 | 
				
			||||||
 | 
					} from '@angular/core';
 | 
				
			||||||
 | 
					import {
 | 
				
			||||||
 | 
					  FormBuilder,
 | 
				
			||||||
 | 
					  FormControl,
 | 
				
			||||||
 | 
					  FormGroup,
 | 
				
			||||||
 | 
					  Validators,
 | 
				
			||||||
 | 
					} from '@angular/forms';
 | 
				
			||||||
 | 
					import { MatCheckboxChange } from '@angular/material/checkbox';
 | 
				
			||||||
 | 
					import { MatPaginator } from '@angular/material/paginator';
 | 
				
			||||||
 | 
					import { MatSort } from '@angular/material/sort';
 | 
				
			||||||
 | 
					import {
 | 
				
			||||||
 | 
					  debounceTime,
 | 
				
			||||||
 | 
					  map,
 | 
				
			||||||
 | 
					  merge,
 | 
				
			||||||
 | 
					  Observable,
 | 
				
			||||||
 | 
					  Subject,
 | 
				
			||||||
 | 
					  switchMap,
 | 
				
			||||||
 | 
					  takeUntil,
 | 
				
			||||||
 | 
					} from 'rxjs';
 | 
				
			||||||
 | 
					import { fuseAnimations } from '@fuse/animations';
 | 
				
			||||||
 | 
					import { FuseConfirmationService } from '@fuse/services/confirmation';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import { User } from '../../user/models/user';
 | 
				
			||||||
 | 
					import { CouponMoneylog } from '../models/coupon-moneylog';
 | 
				
			||||||
 | 
					import { CouponMoneylogPagination } from '../models/coupon-moneylog-pagination';
 | 
				
			||||||
 | 
					import { CouponMoneylogService } from '../services/coupon-moneylog.service';
 | 
				
			||||||
 | 
					import { Router } from '@angular/router';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@Component({
 | 
				
			||||||
 | 
					  selector: 'coupon-moneylog-list',
 | 
				
			||||||
 | 
					  templateUrl: './list.component.html',
 | 
				
			||||||
 | 
					  styles: [
 | 
				
			||||||
 | 
					    /* language=SCSS */
 | 
				
			||||||
 | 
					    `
 | 
				
			||||||
 | 
					      .inventory-grid {
 | 
				
			||||||
 | 
					        grid-template-columns: 60px auto 40px;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        @screen sm {
 | 
				
			||||||
 | 
					          grid-template-columns: 60px 60px 60px 60px 60px 60px auto 60px;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        @screen md {
 | 
				
			||||||
 | 
					          grid-template-columns: 60px 60px 60px 60px 60px 60px auto 60px 60px;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        @screen lg {
 | 
				
			||||||
 | 
					          grid-template-columns: 60px 70px 70px 70px 70px 100px 60px 60px auto 60px 60px 60px 60px;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    `,
 | 
				
			||||||
 | 
					  ],
 | 
				
			||||||
 | 
					  encapsulation: ViewEncapsulation.None,
 | 
				
			||||||
 | 
					  changeDetection: ChangeDetectionStrategy.OnPush,
 | 
				
			||||||
 | 
					  animations: fuseAnimations,
 | 
				
			||||||
 | 
					})
 | 
				
			||||||
 | 
					export class ListComponent implements OnInit, AfterViewInit, OnDestroy {
 | 
				
			||||||
 | 
					  @ViewChild(MatPaginator) private _paginator!: MatPaginator;
 | 
				
			||||||
 | 
					  @ViewChild(MatSort) private _sort!: MatSort;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  couponMoneylogs$!: Observable<CouponMoneylog[] | undefined>;
 | 
				
			||||||
 | 
					  users$!: Observable<User[] | undefined>;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  isLoading = false;
 | 
				
			||||||
 | 
					  searchInputControl = new FormControl();
 | 
				
			||||||
 | 
					  selectedCouponMoneylog?: CouponMoneylog;
 | 
				
			||||||
 | 
					  pagination?: CouponMoneylogPagination;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  private _unsubscribeAll: Subject<any> = new Subject<any>();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					   * Constructor
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					  constructor(
 | 
				
			||||||
 | 
					    private _changeDetectorRef: ChangeDetectorRef,
 | 
				
			||||||
 | 
					    private _fuseConfirmationService: FuseConfirmationService,
 | 
				
			||||||
 | 
					    private _formBuilder: FormBuilder,
 | 
				
			||||||
 | 
					    private _couponMoneylogService: CouponMoneylogService,
 | 
				
			||||||
 | 
					    private router: Router
 | 
				
			||||||
 | 
					  ) {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // -----------------------------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					  // @ Lifecycle hooks
 | 
				
			||||||
 | 
					  // -----------------------------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					   * On init
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					  ngOnInit(): void {
 | 
				
			||||||
 | 
					    // Get the pagination
 | 
				
			||||||
 | 
					    this._couponMoneylogService.pagination$
 | 
				
			||||||
 | 
					      .pipe(takeUntil(this._unsubscribeAll))
 | 
				
			||||||
 | 
					      .subscribe((pagination: CouponMoneylogPagination | undefined) => {
 | 
				
			||||||
 | 
					        // Update the pagination
 | 
				
			||||||
 | 
					        this.pagination = pagination;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Mark for check
 | 
				
			||||||
 | 
					        this._changeDetectorRef.markForCheck();
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Get the products
 | 
				
			||||||
 | 
					    this.couponMoneylogs$ = this._couponMoneylogService.couponMoneylogs$;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					   * After view init
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					  ngAfterViewInit(): void {
 | 
				
			||||||
 | 
					    if (this._sort && this._paginator) {
 | 
				
			||||||
 | 
					      // Set the initial sort
 | 
				
			||||||
 | 
					      this._sort.sort({
 | 
				
			||||||
 | 
					        id: 'name',
 | 
				
			||||||
 | 
					        start: 'asc',
 | 
				
			||||||
 | 
					        disableClear: true,
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      // Mark for check
 | 
				
			||||||
 | 
					      this._changeDetectorRef.markForCheck();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      // If the couponMoneylog changes the sort order...
 | 
				
			||||||
 | 
					      this._sort.sortChange
 | 
				
			||||||
 | 
					        .pipe(takeUntil(this._unsubscribeAll))
 | 
				
			||||||
 | 
					        .subscribe(() => {
 | 
				
			||||||
 | 
					          // Reset back to the first page
 | 
				
			||||||
 | 
					          this._paginator.pageIndex = 0;
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      // Get products if sort or page changes
 | 
				
			||||||
 | 
					      merge(this._sort.sortChange, this._paginator.page)
 | 
				
			||||||
 | 
					        .pipe(
 | 
				
			||||||
 | 
					          switchMap(() => {
 | 
				
			||||||
 | 
					            this.isLoading = true;
 | 
				
			||||||
 | 
					            return this._couponMoneylogService.getCouponMoneylogs(
 | 
				
			||||||
 | 
					              this._paginator.pageIndex,
 | 
				
			||||||
 | 
					              this._paginator.pageSize,
 | 
				
			||||||
 | 
					              this._sort.active,
 | 
				
			||||||
 | 
					              this._sort.direction
 | 
				
			||||||
 | 
					            );
 | 
				
			||||||
 | 
					          }),
 | 
				
			||||||
 | 
					          map(() => {
 | 
				
			||||||
 | 
					            this.isLoading = false;
 | 
				
			||||||
 | 
					          })
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					        .subscribe();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					   * On destroy
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					  ngOnDestroy(): void {
 | 
				
			||||||
 | 
					    // Unsubscribe from all subscriptions
 | 
				
			||||||
 | 
					    this._unsubscribeAll.next(null);
 | 
				
			||||||
 | 
					    this._unsubscribeAll.complete();
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // -----------------------------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					  // @ Public methods
 | 
				
			||||||
 | 
					  // -----------------------------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  viewUserDetail(id: string): void {
 | 
				
			||||||
 | 
					    let url: string = 'member/user/' + id;
 | 
				
			||||||
 | 
					    this.router.navigateByUrl(url);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  // -----------------------------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					  // @ Private methods
 | 
				
			||||||
 | 
					  // -----------------------------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					   * Create product
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					  __createProduct(): void {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					   * Toggle product details
 | 
				
			||||||
 | 
					   *
 | 
				
			||||||
 | 
					   * @param productId
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					  __toggleDetails(productId: string): void {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					   * Track by function for ngFor loops
 | 
				
			||||||
 | 
					   *
 | 
				
			||||||
 | 
					   * @param index
 | 
				
			||||||
 | 
					   * @param item
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					  __trackByFn(index: number, item: any): any {
 | 
				
			||||||
 | 
					    return item.id || index;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -0,0 +1,50 @@
 | 
				
			|||||||
 | 
					import { NgModule } from '@angular/core';
 | 
				
			||||||
 | 
					import { RouterModule } from '@angular/router';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import { MatButtonModule } from '@angular/material/button';
 | 
				
			||||||
 | 
					import { MatFormFieldModule } from '@angular/material/form-field';
 | 
				
			||||||
 | 
					import { MatIconModule } from '@angular/material/icon';
 | 
				
			||||||
 | 
					import { MatInputModule } from '@angular/material/input';
 | 
				
			||||||
 | 
					import { MatPaginatorModule } from '@angular/material/paginator';
 | 
				
			||||||
 | 
					import { MatProgressBarModule } from '@angular/material/progress-bar';
 | 
				
			||||||
 | 
					import { MatRippleModule } from '@angular/material/core';
 | 
				
			||||||
 | 
					import { MatSortModule } from '@angular/material/sort';
 | 
				
			||||||
 | 
					import { MatSelectModule } from '@angular/material/select';
 | 
				
			||||||
 | 
					import { MatTooltipModule } from '@angular/material/tooltip';
 | 
				
			||||||
 | 
					import { MatGridListModule } from '@angular/material/grid-list';
 | 
				
			||||||
 | 
					import { MatSlideToggleModule } from '@angular/material/slide-toggle';
 | 
				
			||||||
 | 
					import { MatRadioModule } from '@angular/material/radio';
 | 
				
			||||||
 | 
					import { MatCheckboxModule } from '@angular/material/checkbox';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import { TranslocoModule } from '@ngneat/transloco';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import { SharedModule } from 'app/shared/shared.module';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import { COMPONENTS } from './components';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import { CouponMoneylogRoutes } from './coupon-moneylog.routing';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@NgModule({
 | 
				
			||||||
 | 
					  declarations: [COMPONENTS],
 | 
				
			||||||
 | 
					  imports: [
 | 
				
			||||||
 | 
					    TranslocoModule,
 | 
				
			||||||
 | 
					    SharedModule,
 | 
				
			||||||
 | 
					    RouterModule.forChild(CouponMoneylogRoutes),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    MatButtonModule,
 | 
				
			||||||
 | 
					    MatFormFieldModule,
 | 
				
			||||||
 | 
					    MatIconModule,
 | 
				
			||||||
 | 
					    MatInputModule,
 | 
				
			||||||
 | 
					    MatPaginatorModule,
 | 
				
			||||||
 | 
					    MatProgressBarModule,
 | 
				
			||||||
 | 
					    MatRippleModule,
 | 
				
			||||||
 | 
					    MatSortModule,
 | 
				
			||||||
 | 
					    MatSelectModule,
 | 
				
			||||||
 | 
					    MatTooltipModule,
 | 
				
			||||||
 | 
					    MatGridListModule,
 | 
				
			||||||
 | 
					    MatSlideToggleModule,
 | 
				
			||||||
 | 
					    MatRadioModule,
 | 
				
			||||||
 | 
					    MatCheckboxModule,
 | 
				
			||||||
 | 
					  ],
 | 
				
			||||||
 | 
					})
 | 
				
			||||||
 | 
					export class CouponMoneylogModule {}
 | 
				
			||||||
@ -0,0 +1,24 @@
 | 
				
			|||||||
 | 
					import { Route } from '@angular/router';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import { ListComponent } from './components/list.component';
 | 
				
			||||||
 | 
					import { ViewComponent } from '../user/components/view.component';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import { CouponMoneylogsResolver } from './resolvers/coupon-moneylog.resolver';
 | 
				
			||||||
 | 
					import { UserResolver } from '../user/resolvers/user.resolver';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export const CouponMoneylogRoutes: Route[] = [
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    path: '',
 | 
				
			||||||
 | 
					    component: ListComponent,
 | 
				
			||||||
 | 
					    resolve: {
 | 
				
			||||||
 | 
					      CouponMoneylogs: CouponMoneylogsResolver,
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    path: ':id',
 | 
				
			||||||
 | 
					    component: ViewComponent,
 | 
				
			||||||
 | 
					    resolve: {
 | 
				
			||||||
 | 
					      users: UserResolver,
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					];
 | 
				
			||||||
@ -0,0 +1,8 @@
 | 
				
			|||||||
 | 
					export interface CouponMoneylogPagination {
 | 
				
			||||||
 | 
					  length: number;
 | 
				
			||||||
 | 
					  size: number;
 | 
				
			||||||
 | 
					  page: number;
 | 
				
			||||||
 | 
					  lastPage: number;
 | 
				
			||||||
 | 
					  startIndex: number;
 | 
				
			||||||
 | 
					  endIndex: number;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -0,0 +1,29 @@
 | 
				
			|||||||
 | 
					export interface CouponMoneylog {
 | 
				
			||||||
 | 
					  id?: string;
 | 
				
			||||||
 | 
					  totalPartnerCount?: number;
 | 
				
			||||||
 | 
					  totalHoldingMoney?: number;
 | 
				
			||||||
 | 
					  totalComp?: number;
 | 
				
			||||||
 | 
					  total?: number;
 | 
				
			||||||
 | 
					  branchCount?: number;
 | 
				
			||||||
 | 
					  divisionCount?: number;
 | 
				
			||||||
 | 
					  officeCount?: number;
 | 
				
			||||||
 | 
					  storeCount?: number;
 | 
				
			||||||
 | 
					  memberCount?: number;
 | 
				
			||||||
 | 
					  nickname?: string;
 | 
				
			||||||
 | 
					  accountHolder?: string;
 | 
				
			||||||
 | 
					  phoneNumber?: string;
 | 
				
			||||||
 | 
					  calculateType?: string;
 | 
				
			||||||
 | 
					  ownCash?: number;
 | 
				
			||||||
 | 
					  ownComp?: number;
 | 
				
			||||||
 | 
					  ownCoupon?: number;
 | 
				
			||||||
 | 
					  gameMoney?: number;
 | 
				
			||||||
 | 
					  todayComp?: number;
 | 
				
			||||||
 | 
					  totalDeposit?: number;
 | 
				
			||||||
 | 
					  totalWithdraw?: number;
 | 
				
			||||||
 | 
					  balance?: number;
 | 
				
			||||||
 | 
					  registDate?: string;
 | 
				
			||||||
 | 
					  finalSigninDate?: string;
 | 
				
			||||||
 | 
					  ip?: string;
 | 
				
			||||||
 | 
					  state?: string;
 | 
				
			||||||
 | 
					  note?: string;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -0,0 +1,89 @@
 | 
				
			|||||||
 | 
					import { Injectable } from '@angular/core';
 | 
				
			||||||
 | 
					import {
 | 
				
			||||||
 | 
					  ActivatedRouteSnapshot,
 | 
				
			||||||
 | 
					  Resolve,
 | 
				
			||||||
 | 
					  Router,
 | 
				
			||||||
 | 
					  RouterStateSnapshot,
 | 
				
			||||||
 | 
					} from '@angular/router';
 | 
				
			||||||
 | 
					import { catchError, Observable, throwError } from 'rxjs';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import { CouponMoneylog } from '../models/coupon-moneylog';
 | 
				
			||||||
 | 
					import { CouponMoneylogPagination } from '../models/coupon-moneylog-pagination';
 | 
				
			||||||
 | 
					import { CouponMoneylogService } from '../services/coupon-moneylog.service';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@Injectable({
 | 
				
			||||||
 | 
					  providedIn: 'root',
 | 
				
			||||||
 | 
					})
 | 
				
			||||||
 | 
					export class CouponMoneylogResolver implements Resolve<any> {
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					   * Constructor
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					  constructor(
 | 
				
			||||||
 | 
					    private _couponMoneylogService: CouponMoneylogService,
 | 
				
			||||||
 | 
					    private _router: Router
 | 
				
			||||||
 | 
					  ) {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // -----------------------------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					  // @ Public methods
 | 
				
			||||||
 | 
					  // -----------------------------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					   * Resolver
 | 
				
			||||||
 | 
					   *
 | 
				
			||||||
 | 
					   * @param route
 | 
				
			||||||
 | 
					   * @param state
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					  resolve(
 | 
				
			||||||
 | 
					    route: ActivatedRouteSnapshot,
 | 
				
			||||||
 | 
					    state: RouterStateSnapshot
 | 
				
			||||||
 | 
					  ): Observable<CouponMoneylog | undefined> {
 | 
				
			||||||
 | 
					    return this._couponMoneylogService
 | 
				
			||||||
 | 
					      .getCouponMoneylogById(route.paramMap.get('id'))
 | 
				
			||||||
 | 
					      .pipe(
 | 
				
			||||||
 | 
					        // Error here means the requested product is not available
 | 
				
			||||||
 | 
					        catchError((error) => {
 | 
				
			||||||
 | 
					          // Log the error
 | 
				
			||||||
 | 
					          console.error(error);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          // Get the parent url
 | 
				
			||||||
 | 
					          const parentUrl = state.url.split('/').slice(0, -1).join('/');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          // Navigate to there
 | 
				
			||||||
 | 
					          this._router.navigateByUrl(parentUrl);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          // Throw an error
 | 
				
			||||||
 | 
					          return throwError(error);
 | 
				
			||||||
 | 
					        })
 | 
				
			||||||
 | 
					      );
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@Injectable({
 | 
				
			||||||
 | 
					  providedIn: 'root',
 | 
				
			||||||
 | 
					})
 | 
				
			||||||
 | 
					export class CouponMoneylogsResolver implements Resolve<any> {
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					   * Constructor
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					  constructor(private _couponMoneylogService: CouponMoneylogService) {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // -----------------------------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					  // @ Public methods
 | 
				
			||||||
 | 
					  // -----------------------------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					   * Resolver
 | 
				
			||||||
 | 
					   *
 | 
				
			||||||
 | 
					   * @param route
 | 
				
			||||||
 | 
					   * @param state
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					  resolve(
 | 
				
			||||||
 | 
					    route: ActivatedRouteSnapshot,
 | 
				
			||||||
 | 
					    state: RouterStateSnapshot
 | 
				
			||||||
 | 
					  ): Observable<{
 | 
				
			||||||
 | 
					    pagination: CouponMoneylogPagination;
 | 
				
			||||||
 | 
					    couponMoneylogs: CouponMoneylog[];
 | 
				
			||||||
 | 
					  }> {
 | 
				
			||||||
 | 
					    return this._couponMoneylogService.getCouponMoneylogs();
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -0,0 +1,161 @@
 | 
				
			|||||||
 | 
					import { Injectable } from '@angular/core';
 | 
				
			||||||
 | 
					import { HttpClient } from '@angular/common/http';
 | 
				
			||||||
 | 
					import {
 | 
				
			||||||
 | 
					  BehaviorSubject,
 | 
				
			||||||
 | 
					  filter,
 | 
				
			||||||
 | 
					  map,
 | 
				
			||||||
 | 
					  Observable,
 | 
				
			||||||
 | 
					  of,
 | 
				
			||||||
 | 
					  switchMap,
 | 
				
			||||||
 | 
					  take,
 | 
				
			||||||
 | 
					  tap,
 | 
				
			||||||
 | 
					  throwError,
 | 
				
			||||||
 | 
					} from 'rxjs';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import { CouponMoneylog } from '../models/coupon-moneylog';
 | 
				
			||||||
 | 
					import { CouponMoneylogPagination } from '../models/coupon-moneylog-pagination';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@Injectable({
 | 
				
			||||||
 | 
					  providedIn: 'root',
 | 
				
			||||||
 | 
					})
 | 
				
			||||||
 | 
					export class CouponMoneylogService {
 | 
				
			||||||
 | 
					  // Private
 | 
				
			||||||
 | 
					  private __pagination = new BehaviorSubject<
 | 
				
			||||||
 | 
					    CouponMoneylogPagination | undefined
 | 
				
			||||||
 | 
					  >(undefined);
 | 
				
			||||||
 | 
					  private __couponMoneylog = new BehaviorSubject<CouponMoneylog | undefined>(
 | 
				
			||||||
 | 
					    undefined
 | 
				
			||||||
 | 
					  );
 | 
				
			||||||
 | 
					  private __couponMoneylogs = new BehaviorSubject<CouponMoneylog[] | undefined>(
 | 
				
			||||||
 | 
					    undefined
 | 
				
			||||||
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					   * Constructor
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					  constructor(private _httpClient: HttpClient) {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // -----------------------------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					  // @ Accessors
 | 
				
			||||||
 | 
					  // -----------------------------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					   * Getter for pagination
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					  get pagination$(): Observable<CouponMoneylogPagination | undefined> {
 | 
				
			||||||
 | 
					    return this.__pagination.asObservable();
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					   * Getter for couponMoneylog
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					  get couponMoneylog$(): Observable<CouponMoneylog | undefined> {
 | 
				
			||||||
 | 
					    return this.__couponMoneylog.asObservable();
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					   * Getter for couponMoneylogs
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					  get couponMoneylogs$(): Observable<CouponMoneylog[] | undefined> {
 | 
				
			||||||
 | 
					    return this.__couponMoneylogs.asObservable();
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // -----------------------------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					  // @ Public methods
 | 
				
			||||||
 | 
					  // -----------------------------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					   * Get couponMoneylogs
 | 
				
			||||||
 | 
					   *
 | 
				
			||||||
 | 
					   *
 | 
				
			||||||
 | 
					   * @param page
 | 
				
			||||||
 | 
					   * @param size
 | 
				
			||||||
 | 
					   * @param sort
 | 
				
			||||||
 | 
					   * @param order
 | 
				
			||||||
 | 
					   * @param search
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					  getCouponMoneylogs(
 | 
				
			||||||
 | 
					    page: number = 0,
 | 
				
			||||||
 | 
					    size: number = 10,
 | 
				
			||||||
 | 
					    sort: string = 'name',
 | 
				
			||||||
 | 
					    order: 'asc' | 'desc' | '' = 'asc',
 | 
				
			||||||
 | 
					    search: string = ''
 | 
				
			||||||
 | 
					  ): Observable<{
 | 
				
			||||||
 | 
					    pagination: CouponMoneylogPagination;
 | 
				
			||||||
 | 
					    couponMoneylogs: CouponMoneylog[];
 | 
				
			||||||
 | 
					  }> {
 | 
				
			||||||
 | 
					    return this._httpClient
 | 
				
			||||||
 | 
					      .get<{
 | 
				
			||||||
 | 
					        pagination: CouponMoneylogPagination;
 | 
				
			||||||
 | 
					        couponMoneylogs: CouponMoneylog[];
 | 
				
			||||||
 | 
					      }>('api/apps/member/coupon-moneylog/coupon-moneylogs', {
 | 
				
			||||||
 | 
					        params: {
 | 
				
			||||||
 | 
					          page: '' + page,
 | 
				
			||||||
 | 
					          size: '' + size,
 | 
				
			||||||
 | 
					          sort,
 | 
				
			||||||
 | 
					          order,
 | 
				
			||||||
 | 
					          search,
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					      })
 | 
				
			||||||
 | 
					      .pipe(
 | 
				
			||||||
 | 
					        tap((response) => {
 | 
				
			||||||
 | 
					          this.__pagination.next(response.pagination);
 | 
				
			||||||
 | 
					          this.__couponMoneylogs.next(response.couponMoneylogs);
 | 
				
			||||||
 | 
					        })
 | 
				
			||||||
 | 
					      );
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					   * Get product by id
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					  getCouponMoneylogById(id: string | null): Observable<CouponMoneylog> {
 | 
				
			||||||
 | 
					    return this.__couponMoneylogs.pipe(
 | 
				
			||||||
 | 
					      take(1),
 | 
				
			||||||
 | 
					      map((couponMoneylogs) => {
 | 
				
			||||||
 | 
					        // Find the product
 | 
				
			||||||
 | 
					        const couponMoneylog =
 | 
				
			||||||
 | 
					          couponMoneylogs?.find((item) => item.id === id) || undefined;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Update the product
 | 
				
			||||||
 | 
					        this.__couponMoneylog.next(couponMoneylog);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Return the product
 | 
				
			||||||
 | 
					        return couponMoneylog;
 | 
				
			||||||
 | 
					      }),
 | 
				
			||||||
 | 
					      switchMap((product) => {
 | 
				
			||||||
 | 
					        if (!product) {
 | 
				
			||||||
 | 
					          return throwError('Could not found product with id of ' + id + '!');
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return of(product);
 | 
				
			||||||
 | 
					      })
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					   * Create product
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					  createCouponMoneylog(): Observable<CouponMoneylog> {
 | 
				
			||||||
 | 
					    return this.couponMoneylogs$.pipe(
 | 
				
			||||||
 | 
					      take(1),
 | 
				
			||||||
 | 
					      switchMap((couponMoneylogs) =>
 | 
				
			||||||
 | 
					        this._httpClient
 | 
				
			||||||
 | 
					          .post<CouponMoneylog>('api/apps/member/coupon-moneylog/product', {})
 | 
				
			||||||
 | 
					          .pipe(
 | 
				
			||||||
 | 
					            map((newCouponMoneylog) => {
 | 
				
			||||||
 | 
					              // Update the couponMoneylogs with the new product
 | 
				
			||||||
 | 
					              if (!!couponMoneylogs) {
 | 
				
			||||||
 | 
					                this.__couponMoneylogs.next([
 | 
				
			||||||
 | 
					                  newCouponMoneylog,
 | 
				
			||||||
 | 
					                  ...couponMoneylogs,
 | 
				
			||||||
 | 
					                ]);
 | 
				
			||||||
 | 
					              }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					              // Return the new product
 | 
				
			||||||
 | 
					              return newCouponMoneylog;
 | 
				
			||||||
 | 
					            })
 | 
				
			||||||
 | 
					          )
 | 
				
			||||||
 | 
					      )
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										3
									
								
								src/app/modules/admin/member/coupon/components/index.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								src/app/modules/admin/member/coupon/components/index.ts
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,3 @@
 | 
				
			|||||||
 | 
					import { ListComponent } from './list.component';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export const COMPONENTS = [ListComponent];
 | 
				
			||||||
@ -0,0 +1,355 @@
 | 
				
			|||||||
 | 
					<div
 | 
				
			||||||
 | 
					  class="sm:absolute sm:inset-0 flex flex-col flex-auto min-w-0 sm:overflow-hidden bg-card dark:bg-transparent"
 | 
				
			||||||
 | 
					>
 | 
				
			||||||
 | 
					  <!-- Header -->
 | 
				
			||||||
 | 
					  <div
 | 
				
			||||||
 | 
					    class="relative flex flex-col sm:flex-row flex-0 sm:items-center sm:justify-between py-8 px-6 md:px-8 border-b"
 | 
				
			||||||
 | 
					  >
 | 
				
			||||||
 | 
					    <!-- Loader -->
 | 
				
			||||||
 | 
					    <div class="absolute inset-x-0 bottom-0" *ngIf="isLoading">
 | 
				
			||||||
 | 
					      <mat-progress-bar [mode]="'indeterminate'"></mat-progress-bar>
 | 
				
			||||||
 | 
					    </div>
 | 
				
			||||||
 | 
					    <!-- Title -->
 | 
				
			||||||
 | 
					    <div class="text-4xl font-extrabold tracking-tight">쿠폰발행리스트</div>
 | 
				
			||||||
 | 
					    <!-- Actions -->
 | 
				
			||||||
 | 
					    <div class="flex shrink-0 items-center mt-6 sm:mt-0 sm:ml-4">
 | 
				
			||||||
 | 
					      <!-- Memo -->
 | 
				
			||||||
 | 
					      <!-- <mat-form-field>
 | 
				
			||||||
 | 
					        <ng-container *ngIf="coupons$ | async as coupons">
 | 
				
			||||||
 | 
					          <ng-container
 | 
				
			||||||
 | 
					            *ngFor="let coupon of coupons; trackBy: __trackByFn"
 | 
				
			||||||
 | 
					          >
 | 
				
			||||||
 | 
					            <div
 | 
				
			||||||
 | 
					              class="inventory-grid grid items-center gap-4 py-3 px-6 md:px-8 border-b"
 | 
				
			||||||
 | 
					            >
 | 
				
			||||||
 | 
					              <fieldset>
 | 
				
			||||||
 | 
					                총 파트너수:{{ coupon.totalPartnerCount }} 총 보유머니:{{
 | 
				
			||||||
 | 
					                  coupon.totalHoldingMoney
 | 
				
			||||||
 | 
					                }}
 | 
				
			||||||
 | 
					                총 콤프:{{ coupon.totalComp }} 총 합계:{{
 | 
				
			||||||
 | 
					                  coupon.total
 | 
				
			||||||
 | 
					                }}
 | 
				
			||||||
 | 
					              </fieldset>
 | 
				
			||||||
 | 
					            </div>
 | 
				
			||||||
 | 
					          </ng-container>
 | 
				
			||||||
 | 
					        </ng-container>
 | 
				
			||||||
 | 
					      </mat-form-field> -->
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      <!-- SelectBox -->
 | 
				
			||||||
 | 
					      <mat-form-field>
 | 
				
			||||||
 | 
					        <mat-select placeholder="리스트수">
 | 
				
			||||||
 | 
					          <mat-option value="40">40</mat-option>
 | 
				
			||||||
 | 
					          <mat-option value="60">60</mat-option>
 | 
				
			||||||
 | 
					          <mat-option value="80">80</mat-option>
 | 
				
			||||||
 | 
					          <mat-option value="100">100</mat-option>
 | 
				
			||||||
 | 
					        </mat-select>
 | 
				
			||||||
 | 
					      </mat-form-field>
 | 
				
			||||||
 | 
					      <mat-form-field>
 | 
				
			||||||
 | 
					        <mat-select placeholder="레벨">
 | 
				
			||||||
 | 
					          <mat-option value="level1">LV.1</mat-option>
 | 
				
			||||||
 | 
					          <mat-option value="level2">LV.2</mat-option>
 | 
				
			||||||
 | 
					          <mat-option value="level3">LV.3</mat-option>
 | 
				
			||||||
 | 
					          <mat-option value="level4">LV.4</mat-option>
 | 
				
			||||||
 | 
					        </mat-select>
 | 
				
			||||||
 | 
					      </mat-form-field>
 | 
				
			||||||
 | 
					      <mat-form-field>
 | 
				
			||||||
 | 
					        <mat-select placeholder="상태">
 | 
				
			||||||
 | 
					          <mat-option value="">정상</mat-option>
 | 
				
			||||||
 | 
					          <mat-option value="">대기</mat-option>
 | 
				
			||||||
 | 
					          <mat-option value="">탈퇴</mat-option>
 | 
				
			||||||
 | 
					          <mat-option value="">휴면</mat-option>
 | 
				
			||||||
 | 
					          <mat-option value="">블랙</mat-option>
 | 
				
			||||||
 | 
					          <mat-option value="">정지</mat-option>
 | 
				
			||||||
 | 
					        </mat-select>
 | 
				
			||||||
 | 
					      </mat-form-field>
 | 
				
			||||||
 | 
					      <mat-form-field>
 | 
				
			||||||
 | 
					        <mat-select placeholder="제한">
 | 
				
			||||||
 | 
					          <mat-option value="">카지노제한</mat-option>
 | 
				
			||||||
 | 
					          <mat-option value="">슬롯제한</mat-option>
 | 
				
			||||||
 | 
					        </mat-select>
 | 
				
			||||||
 | 
					      </mat-form-field>
 | 
				
			||||||
 | 
					      <mat-form-field>
 | 
				
			||||||
 | 
					        <mat-select placeholder="입금">
 | 
				
			||||||
 | 
					          <mat-option value="">계좌입금</mat-option>
 | 
				
			||||||
 | 
					        </mat-select>
 | 
				
			||||||
 | 
					      </mat-form-field>
 | 
				
			||||||
 | 
					      <mat-form-field>
 | 
				
			||||||
 | 
					        <mat-select placeholder="내용">
 | 
				
			||||||
 | 
					          <mat-option value="">카지노콤프</mat-option>
 | 
				
			||||||
 | 
					          <mat-option value="">슬롯콤프</mat-option>
 | 
				
			||||||
 | 
					          <mat-option value="">배팅콤프</mat-option>
 | 
				
			||||||
 | 
					          <mat-option value="">첫충콤프</mat-option>
 | 
				
			||||||
 | 
					        </mat-select>
 | 
				
			||||||
 | 
					      </mat-form-field>
 | 
				
			||||||
 | 
					      <!-- <mat-form-field>
 | 
				
			||||||
 | 
					        <mat-select placeholder="입금">
 | 
				
			||||||
 | 
					          <mat-option value="">계좌입금</mat-option>
 | 
				
			||||||
 | 
					        </mat-select>
 | 
				
			||||||
 | 
					      </mat-form-field>
 | 
				
			||||||
 | 
					      <mat-form-field>
 | 
				
			||||||
 | 
					        <mat-select placeholder="아이디">
 | 
				
			||||||
 | 
					          <mat-option value="">아이디</mat-option>
 | 
				
			||||||
 | 
					          <mat-option value="">닉네임</mat-option>
 | 
				
			||||||
 | 
					          <mat-option value="">이름</mat-option>
 | 
				
			||||||
 | 
					          <mat-option value="">사이트</mat-option>
 | 
				
			||||||
 | 
					          <mat-option value="">파트너수동지급</mat-option>
 | 
				
			||||||
 | 
					        </mat-select>
 | 
				
			||||||
 | 
					      </mat-form-field>
 | 
				
			||||||
 | 
					      <mat-form-field>
 | 
				
			||||||
 | 
					        <mat-select placeholder="가입일 정렬">
 | 
				
			||||||
 | 
					          <mat-option value="">가입일 정렬</mat-option>
 | 
				
			||||||
 | 
					          <mat-option value="">아이디 정렬</mat-option>
 | 
				
			||||||
 | 
					          <mat-option value="">닉네임 정렬</mat-option>
 | 
				
			||||||
 | 
					          <mat-option value="">캐쉬 정렬</mat-option>
 | 
				
			||||||
 | 
					          <mat-option value="">콤프 정렬</mat-option>
 | 
				
			||||||
 | 
					          <mat-option value="">쿠폰 정렬</mat-option>
 | 
				
			||||||
 | 
					          <mat-option value="">입금 정렬</mat-option>
 | 
				
			||||||
 | 
					          <mat-option value="">출금 정렬</mat-option>
 | 
				
			||||||
 | 
					          <mat-option value="">차익 정렬</mat-option>
 | 
				
			||||||
 | 
					        </mat-select>
 | 
				
			||||||
 | 
					      </mat-form-field>
 | 
				
			||||||
 | 
					      <mat-form-field>
 | 
				
			||||||
 | 
					        <mat-select placeholder="내림차순">
 | 
				
			||||||
 | 
					          <mat-option value="">내림차순</mat-option>
 | 
				
			||||||
 | 
					          <mat-option value="">오름차순</mat-option>
 | 
				
			||||||
 | 
					        </mat-select>
 | 
				
			||||||
 | 
					      </mat-form-field> -->
 | 
				
			||||||
 | 
					      <!-- Search -->
 | 
				
			||||||
 | 
					      <mat-form-field
 | 
				
			||||||
 | 
					        class="fuse-mat-dense fuse-mat-no-subscript fuse-mat-rounded min-w-64"
 | 
				
			||||||
 | 
					      >
 | 
				
			||||||
 | 
					        <mat-icon
 | 
				
			||||||
 | 
					          class="icon-size-5"
 | 
				
			||||||
 | 
					          matPrefix
 | 
				
			||||||
 | 
					          [svgIcon]="'heroicons_solid:search'"
 | 
				
			||||||
 | 
					        ></mat-icon>
 | 
				
			||||||
 | 
					        <input
 | 
				
			||||||
 | 
					          matInput
 | 
				
			||||||
 | 
					          [formControl]="searchInputControl"
 | 
				
			||||||
 | 
					          [autocomplete]="'off'"
 | 
				
			||||||
 | 
					          [placeholder]="'Search'"
 | 
				
			||||||
 | 
					        />
 | 
				
			||||||
 | 
					      </mat-form-field>
 | 
				
			||||||
 | 
					      <!-- Add user button -->
 | 
				
			||||||
 | 
					      <button
 | 
				
			||||||
 | 
					        class="ml-4"
 | 
				
			||||||
 | 
					        mat-flat-button
 | 
				
			||||||
 | 
					        [color]="'primary'"
 | 
				
			||||||
 | 
					        (click)="__createProduct()"
 | 
				
			||||||
 | 
					      >
 | 
				
			||||||
 | 
					        <!-- <mat-icon [svgIcon]="'heroicons_outline:plus'"></mat-icon> -->
 | 
				
			||||||
 | 
					        <span class="ml-2 mr-1">검색하기</span>
 | 
				
			||||||
 | 
					      </button>
 | 
				
			||||||
 | 
					      <button>엑셀저장</button>
 | 
				
			||||||
 | 
					      <button>카지노머니확인</button>
 | 
				
			||||||
 | 
					    </div>
 | 
				
			||||||
 | 
					  </div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  <!-- Main -->
 | 
				
			||||||
 | 
					  <div class="flex flex-auto overflow-hidden">
 | 
				
			||||||
 | 
					    <!-- Products list -->
 | 
				
			||||||
 | 
					    <div
 | 
				
			||||||
 | 
					      class="flex flex-col flex-auto sm:mb-18 overflow-hidden sm:overflow-y-auto"
 | 
				
			||||||
 | 
					    >
 | 
				
			||||||
 | 
					      <ng-container *ngIf="coupons$ | async as coupons">
 | 
				
			||||||
 | 
					        <ng-container *ngIf="coupons.length > 0; else noCoupon">
 | 
				
			||||||
 | 
					          <div class="grid">
 | 
				
			||||||
 | 
					            <!-- Header -->
 | 
				
			||||||
 | 
					            <div
 | 
				
			||||||
 | 
					              class="inventory-grid z-10 sticky top-0 grid gap-4 py-4 px-6 md:px-8 shadow text-md font-semibold text-secondary bg-gray-50 dark:bg-black dark:bg-opacity-5"
 | 
				
			||||||
 | 
					              matSort
 | 
				
			||||||
 | 
					              matSortDisableClear
 | 
				
			||||||
 | 
					            >
 | 
				
			||||||
 | 
					              <div class="hidden sm:block"><mat-checkbox></mat-checkbox></div>
 | 
				
			||||||
 | 
					              <div class="hidden sm:block">요율</div>
 | 
				
			||||||
 | 
					              <div class="hidden sm:block">상부트리</div>
 | 
				
			||||||
 | 
					              <div class="hidden sm:block">관리</div>
 | 
				
			||||||
 | 
					              <div class="hidden sm:block">매장수</div>
 | 
				
			||||||
 | 
					              <div class="hidden sm:block">회원수</div>
 | 
				
			||||||
 | 
					              <div class="hidden sm:block">아이디</div>
 | 
				
			||||||
 | 
					              <div class="hidden sm:block">닉네임</div>
 | 
				
			||||||
 | 
					              <div class="hidden sm:block">예금주</div>
 | 
				
			||||||
 | 
					              <div class="hidden sm:block">연락처</div>
 | 
				
			||||||
 | 
					              <div class="hidden sm:block">정산</div>
 | 
				
			||||||
 | 
					              <div class="hidden sm:block">보유금</div>
 | 
				
			||||||
 | 
					              <div class="hidden sm:block">게임중머니</div>
 | 
				
			||||||
 | 
					              <div class="hidden sm:block">카지노->캐쉬</div>
 | 
				
			||||||
 | 
					              <div class="hidden sm:block">금일콤프</div>
 | 
				
			||||||
 | 
					              <div class="hidden sm:block">총입출</div>
 | 
				
			||||||
 | 
					              <div class="hidden sm:block">로그</div>
 | 
				
			||||||
 | 
					              <div class="hidden sm:block">상태</div>
 | 
				
			||||||
 | 
					              <div class="hidden sm:block">회원수</div>
 | 
				
			||||||
 | 
					              <div class="hidden sm:block">비고</div>
 | 
				
			||||||
 | 
					            </div>
 | 
				
			||||||
 | 
					            <!-- Rows -->
 | 
				
			||||||
 | 
					            <ng-container *ngIf="coupons$ | async as coupons">
 | 
				
			||||||
 | 
					              <ng-container
 | 
				
			||||||
 | 
					                *ngFor="let coupon of coupons; trackBy: __trackByFn"
 | 
				
			||||||
 | 
					              >
 | 
				
			||||||
 | 
					                <div
 | 
				
			||||||
 | 
					                  class="inventory-grid grid items-center gap-4 py-3 px-6 md:px-8 border-b"
 | 
				
			||||||
 | 
					                >
 | 
				
			||||||
 | 
					                  <div class="hidden sm:block truncate">
 | 
				
			||||||
 | 
					                    <mat-checkbox></mat-checkbox>
 | 
				
			||||||
 | 
					                  </div>
 | 
				
			||||||
 | 
					                  <!-- rate -->
 | 
				
			||||||
 | 
					                  <div class="hidden sm:block truncate">
 | 
				
			||||||
 | 
					                    <button
 | 
				
			||||||
 | 
					                      mat-button
 | 
				
			||||||
 | 
					                      color="primary"
 | 
				
			||||||
 | 
					                      matTooltip="요율확인
 | 
				
			||||||
 | 
					                                카지노-바카라: 0%
 | 
				
			||||||
 | 
					                                카지노-룰렛: 0%
 | 
				
			||||||
 | 
					                                카지노-드레곤타이거: 0%
 | 
				
			||||||
 | 
					                                카지노-그외: 0%
 | 
				
			||||||
 | 
					                                슬롯: 0%
 | 
				
			||||||
 | 
					                                카지노루징: 0%
 | 
				
			||||||
 | 
					                                슬롯루징: 0%"
 | 
				
			||||||
 | 
					                    >
 | 
				
			||||||
 | 
					                      요율
 | 
				
			||||||
 | 
					                    </button>
 | 
				
			||||||
 | 
					                    <div class="hidden sm:block truncate">
 | 
				
			||||||
 | 
					                      <!-- 관리 -->
 | 
				
			||||||
 | 
					                      <button mat-flat-button [color]="'primary'">
 | 
				
			||||||
 | 
					                        <mat-form-field>
 | 
				
			||||||
 | 
					                          <mat-select placeholder="관리">
 | 
				
			||||||
 | 
					                            <mat-option value="">보유금지급/회수</mat-option>
 | 
				
			||||||
 | 
					                            <mat-option value="">수수료설정</mat-option>
 | 
				
			||||||
 | 
					                            <mat-option value="">콤프지급/회수</mat-option>
 | 
				
			||||||
 | 
					                            <mat-option value="">쿠폰머니지급/회수</mat-option>
 | 
				
			||||||
 | 
					                            <mat-option value="">쪽지보내기</mat-option>
 | 
				
			||||||
 | 
					                            <mat-option value="">베팅리스트</mat-option>
 | 
				
			||||||
 | 
					                            <mat-option value="">강제로그아웃</mat-option>
 | 
				
			||||||
 | 
					                          </mat-select>
 | 
				
			||||||
 | 
					                        </mat-form-field>
 | 
				
			||||||
 | 
					                      </button>
 | 
				
			||||||
 | 
					                    </div>
 | 
				
			||||||
 | 
					                  </div>
 | 
				
			||||||
 | 
					                  <!-- 매장수 -->
 | 
				
			||||||
 | 
					                  <div class="hidden sm:block truncate">
 | 
				
			||||||
 | 
					                    <button mat-flat-button [color]="'primary'">
 | 
				
			||||||
 | 
					                      {{ coupon.branchCount }}
 | 
				
			||||||
 | 
					                    </button>
 | 
				
			||||||
 | 
					                    <button mat-flat-button [color]="'primary'">
 | 
				
			||||||
 | 
					                      {{ coupon.divisionCount }}
 | 
				
			||||||
 | 
					                    </button>
 | 
				
			||||||
 | 
					                    <button mat-flat-button [color]="'primary'">
 | 
				
			||||||
 | 
					                      {{ coupon.officeCount }}
 | 
				
			||||||
 | 
					                    </button>
 | 
				
			||||||
 | 
					                    <button mat-flat-button [color]="'primary'">
 | 
				
			||||||
 | 
					                      {{ coupon.storeCount }}
 | 
				
			||||||
 | 
					                    </button>
 | 
				
			||||||
 | 
					                  </div>
 | 
				
			||||||
 | 
					                  <!-- 회원수 -->
 | 
				
			||||||
 | 
					                  <div class="hidden sm:block truncate">
 | 
				
			||||||
 | 
					                    <button mat-flat-button [color]="'primary'">
 | 
				
			||||||
 | 
					                      {{ coupon.memberCount }}
 | 
				
			||||||
 | 
					                    </button>
 | 
				
			||||||
 | 
					                  </div>
 | 
				
			||||||
 | 
					                  <!-- id -->
 | 
				
			||||||
 | 
					                  <ng-container *ngIf="users$ | async as users">
 | 
				
			||||||
 | 
					                    <ng-container
 | 
				
			||||||
 | 
					                      *ngFor="let user of users; trackBy: __trackByFn"
 | 
				
			||||||
 | 
					                    >
 | 
				
			||||||
 | 
					                      <div
 | 
				
			||||||
 | 
					                        class="hidden sm:block truncate"
 | 
				
			||||||
 | 
					                        (click)="viewUserDetail(user.id!)"
 | 
				
			||||||
 | 
					                      >
 | 
				
			||||||
 | 
					                        {{ coupon.id }}
 | 
				
			||||||
 | 
					                      </div>
 | 
				
			||||||
 | 
					                    </ng-container>
 | 
				
			||||||
 | 
					                  </ng-container>
 | 
				
			||||||
 | 
					                  <!-- nickname -->
 | 
				
			||||||
 | 
					                  <div class="hidden sm:block truncate">
 | 
				
			||||||
 | 
					                    {{ coupon.nickname }}
 | 
				
			||||||
 | 
					                  </div>
 | 
				
			||||||
 | 
					                  <!-- accountHolder -->
 | 
				
			||||||
 | 
					                  <div class="hidden sm:block truncate">
 | 
				
			||||||
 | 
					                    {{ coupon.accountHolder }}
 | 
				
			||||||
 | 
					                  </div>
 | 
				
			||||||
 | 
					                  <!-- 연락처 -->
 | 
				
			||||||
 | 
					                  <div class="hidden sm:block truncate">
 | 
				
			||||||
 | 
					                    {{ coupon.phoneNumber }}
 | 
				
			||||||
 | 
					                  </div>
 | 
				
			||||||
 | 
					                  <!-- 정산 -->
 | 
				
			||||||
 | 
					                  <div class="hidden sm:block truncate">
 | 
				
			||||||
 | 
					                    {{ coupon.calculateType }}
 | 
				
			||||||
 | 
					                  </div>
 | 
				
			||||||
 | 
					                  <!-- 보유금 -->
 | 
				
			||||||
 | 
					                  <div class="hidden sm:block truncate">
 | 
				
			||||||
 | 
					                    캐쉬{{ coupon.ownCash }} 콤프{{ coupon.ownComp }} 쿠폰{{
 | 
				
			||||||
 | 
					                      coupon.ownCoupon
 | 
				
			||||||
 | 
					                    }}
 | 
				
			||||||
 | 
					                  </div>
 | 
				
			||||||
 | 
					                  <!-- gameMoney -->
 | 
				
			||||||
 | 
					                  <div class="hidden sm:block truncate">
 | 
				
			||||||
 | 
					                    {{ coupon.gameMoney }}
 | 
				
			||||||
 | 
					                  </div>
 | 
				
			||||||
 | 
					                  <!-- casinoCash -->
 | 
				
			||||||
 | 
					                  <div class="hidden sm:block truncate">
 | 
				
			||||||
 | 
					                    <button mat-flat-button [color]="'primary'">
 | 
				
			||||||
 | 
					                      게임머니확인
 | 
				
			||||||
 | 
					                    </button>
 | 
				
			||||||
 | 
					                    <button mat-flat-button [color]="'primary'">
 | 
				
			||||||
 | 
					                      게임머니회수
 | 
				
			||||||
 | 
					                    </button>
 | 
				
			||||||
 | 
					                  </div>
 | 
				
			||||||
 | 
					                  <!-- todayComp -->
 | 
				
			||||||
 | 
					                  <div class="hidden sm:block truncate">
 | 
				
			||||||
 | 
					                    {{ coupon.todayComp }}P
 | 
				
			||||||
 | 
					                  </div>
 | 
				
			||||||
 | 
					                  <!-- 총입출 -->
 | 
				
			||||||
 | 
					                  <div class="hidden sm:block truncate">
 | 
				
			||||||
 | 
					                    입금{{ coupon.totalDeposit }} 출금{{
 | 
				
			||||||
 | 
					                      coupon.totalWithdraw
 | 
				
			||||||
 | 
					                    }}
 | 
				
			||||||
 | 
					                    차익{{ coupon.balance }}
 | 
				
			||||||
 | 
					                  </div>
 | 
				
			||||||
 | 
					                  <!-- log -->
 | 
				
			||||||
 | 
					                  <div class="hidden sm:block truncate">
 | 
				
			||||||
 | 
					                    가입{{ coupon.registDate }} 최종{{
 | 
				
			||||||
 | 
					                      coupon.finalSigninDate
 | 
				
			||||||
 | 
					                    }}
 | 
				
			||||||
 | 
					                    IP{{ coupon.ip }}
 | 
				
			||||||
 | 
					                  </div>
 | 
				
			||||||
 | 
					                  <!-- state -->
 | 
				
			||||||
 | 
					                  <div class="hidden sm:block truncate">
 | 
				
			||||||
 | 
					                    {{ coupon.state }}
 | 
				
			||||||
 | 
					                  </div>
 | 
				
			||||||
 | 
					                  <!-- 회원수 -->
 | 
				
			||||||
 | 
					                  <div class="hidden sm:block truncate">
 | 
				
			||||||
 | 
					                    {{ coupon.memberCount }}
 | 
				
			||||||
 | 
					                  </div>
 | 
				
			||||||
 | 
					                  <!-- 비고 -->
 | 
				
			||||||
 | 
					                  <div class="hidden sm:block truncate">
 | 
				
			||||||
 | 
					                    <button mat-flat-button [color]="'primary'">
 | 
				
			||||||
 | 
					                      {{ coupon.note }}
 | 
				
			||||||
 | 
					                    </button>
 | 
				
			||||||
 | 
					                  </div>
 | 
				
			||||||
 | 
					                </div>
 | 
				
			||||||
 | 
					              </ng-container>
 | 
				
			||||||
 | 
					            </ng-container>
 | 
				
			||||||
 | 
					          </div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          <mat-paginator
 | 
				
			||||||
 | 
					            class="sm:absolute sm:inset-x-0 sm:bottom-0 border-b sm:border-t sm:border-b-0 z-10 bg-gray-50 dark:bg-transparent"
 | 
				
			||||||
 | 
					            [ngClass]="{ 'pointer-events-none': isLoading }"
 | 
				
			||||||
 | 
					            [length]="pagination?.length"
 | 
				
			||||||
 | 
					            [pageIndex]="pagination?.page"
 | 
				
			||||||
 | 
					            [pageSize]="pagination?.size"
 | 
				
			||||||
 | 
					            [pageSizeOptions]="[5, 10, 25, 100]"
 | 
				
			||||||
 | 
					            [showFirstLastButtons]="true"
 | 
				
			||||||
 | 
					          ></mat-paginator>
 | 
				
			||||||
 | 
					        </ng-container>
 | 
				
			||||||
 | 
					      </ng-container>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      <ng-template #noCoupon>
 | 
				
			||||||
 | 
					        <div
 | 
				
			||||||
 | 
					          class="p-8 sm:p-16 border-t text-4xl font-semibold tracking-tight text-center"
 | 
				
			||||||
 | 
					        >
 | 
				
			||||||
 | 
					          There are no coupons!
 | 
				
			||||||
 | 
					        </div>
 | 
				
			||||||
 | 
					      </ng-template>
 | 
				
			||||||
 | 
					    </div>
 | 
				
			||||||
 | 
					  </div>
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
							
								
								
									
										198
									
								
								src/app/modules/admin/member/coupon/components/list.component.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										198
									
								
								src/app/modules/admin/member/coupon/components/list.component.ts
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,198 @@
 | 
				
			|||||||
 | 
					import {
 | 
				
			||||||
 | 
					  AfterViewInit,
 | 
				
			||||||
 | 
					  ChangeDetectionStrategy,
 | 
				
			||||||
 | 
					  ChangeDetectorRef,
 | 
				
			||||||
 | 
					  Component,
 | 
				
			||||||
 | 
					  OnDestroy,
 | 
				
			||||||
 | 
					  OnInit,
 | 
				
			||||||
 | 
					  ViewChild,
 | 
				
			||||||
 | 
					  ViewEncapsulation,
 | 
				
			||||||
 | 
					} from '@angular/core';
 | 
				
			||||||
 | 
					import {
 | 
				
			||||||
 | 
					  FormBuilder,
 | 
				
			||||||
 | 
					  FormControl,
 | 
				
			||||||
 | 
					  FormGroup,
 | 
				
			||||||
 | 
					  Validators,
 | 
				
			||||||
 | 
					} from '@angular/forms';
 | 
				
			||||||
 | 
					import { MatCheckboxChange } from '@angular/material/checkbox';
 | 
				
			||||||
 | 
					import { MatPaginator } from '@angular/material/paginator';
 | 
				
			||||||
 | 
					import { MatSort } from '@angular/material/sort';
 | 
				
			||||||
 | 
					import {
 | 
				
			||||||
 | 
					  debounceTime,
 | 
				
			||||||
 | 
					  map,
 | 
				
			||||||
 | 
					  merge,
 | 
				
			||||||
 | 
					  Observable,
 | 
				
			||||||
 | 
					  Subject,
 | 
				
			||||||
 | 
					  switchMap,
 | 
				
			||||||
 | 
					  takeUntil,
 | 
				
			||||||
 | 
					} from 'rxjs';
 | 
				
			||||||
 | 
					import { fuseAnimations } from '@fuse/animations';
 | 
				
			||||||
 | 
					import { FuseConfirmationService } from '@fuse/services/confirmation';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import { User } from '../../user/models/user';
 | 
				
			||||||
 | 
					import { Coupon } from '../models/coupon';
 | 
				
			||||||
 | 
					import { CouponPagination } from '../models/coupon-pagination';
 | 
				
			||||||
 | 
					import { CouponService } from '../services/coupon.service';
 | 
				
			||||||
 | 
					import { Router } from '@angular/router';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@Component({
 | 
				
			||||||
 | 
					  selector: 'coupon-list',
 | 
				
			||||||
 | 
					  templateUrl: './list.component.html',
 | 
				
			||||||
 | 
					  styles: [
 | 
				
			||||||
 | 
					    /* language=SCSS */
 | 
				
			||||||
 | 
					    `
 | 
				
			||||||
 | 
					      .inventory-grid {
 | 
				
			||||||
 | 
					        grid-template-columns: 60px auto 40px;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        @screen sm {
 | 
				
			||||||
 | 
					          grid-template-columns: 60px 60px 60px 60px 60px 60px auto 60px;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        @screen md {
 | 
				
			||||||
 | 
					          grid-template-columns: 60px 60px 60px 60px 60px 60px auto 60px 60px;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        @screen lg {
 | 
				
			||||||
 | 
					          grid-template-columns: 60px 70px 70px 70px 70px 100px 60px 60px auto 60px 60px 60px 60px;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    `,
 | 
				
			||||||
 | 
					  ],
 | 
				
			||||||
 | 
					  encapsulation: ViewEncapsulation.None,
 | 
				
			||||||
 | 
					  changeDetection: ChangeDetectionStrategy.OnPush,
 | 
				
			||||||
 | 
					  animations: fuseAnimations,
 | 
				
			||||||
 | 
					})
 | 
				
			||||||
 | 
					export class ListComponent implements OnInit, AfterViewInit, OnDestroy {
 | 
				
			||||||
 | 
					  @ViewChild(MatPaginator) private _paginator!: MatPaginator;
 | 
				
			||||||
 | 
					  @ViewChild(MatSort) private _sort!: MatSort;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  coupons$!: Observable<Coupon[] | undefined>;
 | 
				
			||||||
 | 
					  users$!: Observable<User[] | undefined>;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  isLoading = false;
 | 
				
			||||||
 | 
					  searchInputControl = new FormControl();
 | 
				
			||||||
 | 
					  selectedCoupon?: Coupon;
 | 
				
			||||||
 | 
					  pagination?: CouponPagination;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  private _unsubscribeAll: Subject<any> = new Subject<any>();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					   * Constructor
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					  constructor(
 | 
				
			||||||
 | 
					    private _changeDetectorRef: ChangeDetectorRef,
 | 
				
			||||||
 | 
					    private _fuseConfirmationService: FuseConfirmationService,
 | 
				
			||||||
 | 
					    private _formBuilder: FormBuilder,
 | 
				
			||||||
 | 
					    private _couponService: CouponService,
 | 
				
			||||||
 | 
					    private router: Router
 | 
				
			||||||
 | 
					  ) {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // -----------------------------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					  // @ Lifecycle hooks
 | 
				
			||||||
 | 
					  // -----------------------------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					   * On init
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					  ngOnInit(): void {
 | 
				
			||||||
 | 
					    // Get the pagination
 | 
				
			||||||
 | 
					    this._couponService.pagination$
 | 
				
			||||||
 | 
					      .pipe(takeUntil(this._unsubscribeAll))
 | 
				
			||||||
 | 
					      .subscribe((pagination: CouponPagination | undefined) => {
 | 
				
			||||||
 | 
					        // Update the pagination
 | 
				
			||||||
 | 
					        this.pagination = pagination;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Mark for check
 | 
				
			||||||
 | 
					        this._changeDetectorRef.markForCheck();
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Get the products
 | 
				
			||||||
 | 
					    this.coupons$ = this._couponService.coupons$;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					   * After view init
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					  ngAfterViewInit(): void {
 | 
				
			||||||
 | 
					    if (this._sort && this._paginator) {
 | 
				
			||||||
 | 
					      // Set the initial sort
 | 
				
			||||||
 | 
					      this._sort.sort({
 | 
				
			||||||
 | 
					        id: 'name',
 | 
				
			||||||
 | 
					        start: 'asc',
 | 
				
			||||||
 | 
					        disableClear: true,
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      // Mark for check
 | 
				
			||||||
 | 
					      this._changeDetectorRef.markForCheck();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      // If the coupon changes the sort order...
 | 
				
			||||||
 | 
					      this._sort.sortChange
 | 
				
			||||||
 | 
					        .pipe(takeUntil(this._unsubscribeAll))
 | 
				
			||||||
 | 
					        .subscribe(() => {
 | 
				
			||||||
 | 
					          // Reset back to the first page
 | 
				
			||||||
 | 
					          this._paginator.pageIndex = 0;
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      // Get products if sort or page changes
 | 
				
			||||||
 | 
					      merge(this._sort.sortChange, this._paginator.page)
 | 
				
			||||||
 | 
					        .pipe(
 | 
				
			||||||
 | 
					          switchMap(() => {
 | 
				
			||||||
 | 
					            this.isLoading = true;
 | 
				
			||||||
 | 
					            return this._couponService.getCoupons(
 | 
				
			||||||
 | 
					              this._paginator.pageIndex,
 | 
				
			||||||
 | 
					              this._paginator.pageSize,
 | 
				
			||||||
 | 
					              this._sort.active,
 | 
				
			||||||
 | 
					              this._sort.direction
 | 
				
			||||||
 | 
					            );
 | 
				
			||||||
 | 
					          }),
 | 
				
			||||||
 | 
					          map(() => {
 | 
				
			||||||
 | 
					            this.isLoading = false;
 | 
				
			||||||
 | 
					          })
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					        .subscribe();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					   * On destroy
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					  ngOnDestroy(): void {
 | 
				
			||||||
 | 
					    // Unsubscribe from all subscriptions
 | 
				
			||||||
 | 
					    this._unsubscribeAll.next(null);
 | 
				
			||||||
 | 
					    this._unsubscribeAll.complete();
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // -----------------------------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					  // @ Public methods
 | 
				
			||||||
 | 
					  // -----------------------------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  viewUserDetail(id: string): void {
 | 
				
			||||||
 | 
					    let url: string = 'member/user/' + id;
 | 
				
			||||||
 | 
					    this.router.navigateByUrl(url);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  // -----------------------------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					  // @ Private methods
 | 
				
			||||||
 | 
					  // -----------------------------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					   * Create product
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					  __createProduct(): void {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					   * Toggle product details
 | 
				
			||||||
 | 
					   *
 | 
				
			||||||
 | 
					   * @param productId
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					  __toggleDetails(productId: string): void {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					   * Track by function for ngFor loops
 | 
				
			||||||
 | 
					   *
 | 
				
			||||||
 | 
					   * @param index
 | 
				
			||||||
 | 
					   * @param item
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					  __trackByFn(index: number, item: any): any {
 | 
				
			||||||
 | 
					    return item.id || index;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										50
									
								
								src/app/modules/admin/member/coupon/coupon.module.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										50
									
								
								src/app/modules/admin/member/coupon/coupon.module.ts
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,50 @@
 | 
				
			|||||||
 | 
					import { NgModule } from '@angular/core';
 | 
				
			||||||
 | 
					import { RouterModule } from '@angular/router';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import { MatButtonModule } from '@angular/material/button';
 | 
				
			||||||
 | 
					import { MatFormFieldModule } from '@angular/material/form-field';
 | 
				
			||||||
 | 
					import { MatIconModule } from '@angular/material/icon';
 | 
				
			||||||
 | 
					import { MatInputModule } from '@angular/material/input';
 | 
				
			||||||
 | 
					import { MatPaginatorModule } from '@angular/material/paginator';
 | 
				
			||||||
 | 
					import { MatProgressBarModule } from '@angular/material/progress-bar';
 | 
				
			||||||
 | 
					import { MatRippleModule } from '@angular/material/core';
 | 
				
			||||||
 | 
					import { MatSortModule } from '@angular/material/sort';
 | 
				
			||||||
 | 
					import { MatSelectModule } from '@angular/material/select';
 | 
				
			||||||
 | 
					import { MatTooltipModule } from '@angular/material/tooltip';
 | 
				
			||||||
 | 
					import { MatGridListModule } from '@angular/material/grid-list';
 | 
				
			||||||
 | 
					import { MatSlideToggleModule } from '@angular/material/slide-toggle';
 | 
				
			||||||
 | 
					import { MatRadioModule } from '@angular/material/radio';
 | 
				
			||||||
 | 
					import { MatCheckboxModule } from '@angular/material/checkbox';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import { TranslocoModule } from '@ngneat/transloco';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import { SharedModule } from 'app/shared/shared.module';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import { COMPONENTS } from './components';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import { CouponRoutes } from './coupon.routing';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@NgModule({
 | 
				
			||||||
 | 
					  declarations: [COMPONENTS],
 | 
				
			||||||
 | 
					  imports: [
 | 
				
			||||||
 | 
					    TranslocoModule,
 | 
				
			||||||
 | 
					    SharedModule,
 | 
				
			||||||
 | 
					    RouterModule.forChild(CouponRoutes),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    MatButtonModule,
 | 
				
			||||||
 | 
					    MatFormFieldModule,
 | 
				
			||||||
 | 
					    MatIconModule,
 | 
				
			||||||
 | 
					    MatInputModule,
 | 
				
			||||||
 | 
					    MatPaginatorModule,
 | 
				
			||||||
 | 
					    MatProgressBarModule,
 | 
				
			||||||
 | 
					    MatRippleModule,
 | 
				
			||||||
 | 
					    MatSortModule,
 | 
				
			||||||
 | 
					    MatSelectModule,
 | 
				
			||||||
 | 
					    MatTooltipModule,
 | 
				
			||||||
 | 
					    MatGridListModule,
 | 
				
			||||||
 | 
					    MatSlideToggleModule,
 | 
				
			||||||
 | 
					    MatRadioModule,
 | 
				
			||||||
 | 
					    MatCheckboxModule,
 | 
				
			||||||
 | 
					  ],
 | 
				
			||||||
 | 
					})
 | 
				
			||||||
 | 
					export class CouponModule {}
 | 
				
			||||||
							
								
								
									
										24
									
								
								src/app/modules/admin/member/coupon/coupon.routing.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								src/app/modules/admin/member/coupon/coupon.routing.ts
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,24 @@
 | 
				
			|||||||
 | 
					import { Route } from '@angular/router';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import { ListComponent } from './components/list.component';
 | 
				
			||||||
 | 
					import { ViewComponent } from '../user/components/view.component';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import { CouponsResolver } from './resolvers/coupon.resolver';
 | 
				
			||||||
 | 
					import { UserResolver } from '../user/resolvers/user.resolver';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export const CouponRoutes: Route[] = [
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    path: '',
 | 
				
			||||||
 | 
					    component: ListComponent,
 | 
				
			||||||
 | 
					    resolve: {
 | 
				
			||||||
 | 
					      Coupons: CouponsResolver,
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    path: ':id',
 | 
				
			||||||
 | 
					    component: ViewComponent,
 | 
				
			||||||
 | 
					    resolve: {
 | 
				
			||||||
 | 
					      users: UserResolver,
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					];
 | 
				
			||||||
@ -0,0 +1,8 @@
 | 
				
			|||||||
 | 
					export interface CouponPagination {
 | 
				
			||||||
 | 
					  length: number;
 | 
				
			||||||
 | 
					  size: number;
 | 
				
			||||||
 | 
					  page: number;
 | 
				
			||||||
 | 
					  lastPage: number;
 | 
				
			||||||
 | 
					  startIndex: number;
 | 
				
			||||||
 | 
					  endIndex: number;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										29
									
								
								src/app/modules/admin/member/coupon/models/coupon.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								src/app/modules/admin/member/coupon/models/coupon.ts
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,29 @@
 | 
				
			|||||||
 | 
					export interface Coupon {
 | 
				
			||||||
 | 
					  id?: string;
 | 
				
			||||||
 | 
					  totalPartnerCount?: number;
 | 
				
			||||||
 | 
					  totalHoldingMoney?: number;
 | 
				
			||||||
 | 
					  totalComp?: number;
 | 
				
			||||||
 | 
					  total?: number;
 | 
				
			||||||
 | 
					  branchCount?: number;
 | 
				
			||||||
 | 
					  divisionCount?: number;
 | 
				
			||||||
 | 
					  officeCount?: number;
 | 
				
			||||||
 | 
					  storeCount?: number;
 | 
				
			||||||
 | 
					  memberCount?: number;
 | 
				
			||||||
 | 
					  nickname?: string;
 | 
				
			||||||
 | 
					  accountHolder?: string;
 | 
				
			||||||
 | 
					  phoneNumber?: string;
 | 
				
			||||||
 | 
					  calculateType?: string;
 | 
				
			||||||
 | 
					  ownCash?: number;
 | 
				
			||||||
 | 
					  ownComp?: number;
 | 
				
			||||||
 | 
					  ownCoupon?: number;
 | 
				
			||||||
 | 
					  gameMoney?: number;
 | 
				
			||||||
 | 
					  todayComp?: number;
 | 
				
			||||||
 | 
					  totalDeposit?: number;
 | 
				
			||||||
 | 
					  totalWithdraw?: number;
 | 
				
			||||||
 | 
					  balance?: number;
 | 
				
			||||||
 | 
					  registDate?: string;
 | 
				
			||||||
 | 
					  finalSigninDate?: string;
 | 
				
			||||||
 | 
					  ip?: string;
 | 
				
			||||||
 | 
					  state?: string;
 | 
				
			||||||
 | 
					  note?: string;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -0,0 +1,84 @@
 | 
				
			|||||||
 | 
					import { Injectable } from '@angular/core';
 | 
				
			||||||
 | 
					import {
 | 
				
			||||||
 | 
					  ActivatedRouteSnapshot,
 | 
				
			||||||
 | 
					  Resolve,
 | 
				
			||||||
 | 
					  Router,
 | 
				
			||||||
 | 
					  RouterStateSnapshot,
 | 
				
			||||||
 | 
					} from '@angular/router';
 | 
				
			||||||
 | 
					import { catchError, Observable, throwError } from 'rxjs';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import { Coupon } from '../models/coupon';
 | 
				
			||||||
 | 
					import { CouponPagination } from '../models/coupon-pagination';
 | 
				
			||||||
 | 
					import { CouponService } from '../services/coupon.service';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@Injectable({
 | 
				
			||||||
 | 
					  providedIn: 'root',
 | 
				
			||||||
 | 
					})
 | 
				
			||||||
 | 
					export class CouponResolver implements Resolve<any> {
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					   * Constructor
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					  constructor(private _couponService: CouponService, private _router: Router) {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // -----------------------------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					  // @ Public methods
 | 
				
			||||||
 | 
					  // -----------------------------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					   * Resolver
 | 
				
			||||||
 | 
					   *
 | 
				
			||||||
 | 
					   * @param route
 | 
				
			||||||
 | 
					   * @param state
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					  resolve(
 | 
				
			||||||
 | 
					    route: ActivatedRouteSnapshot,
 | 
				
			||||||
 | 
					    state: RouterStateSnapshot
 | 
				
			||||||
 | 
					  ): Observable<Coupon | undefined> {
 | 
				
			||||||
 | 
					    return this._couponService.getCouponById(route.paramMap.get('id')).pipe(
 | 
				
			||||||
 | 
					      // Error here means the requested product is not available
 | 
				
			||||||
 | 
					      catchError((error) => {
 | 
				
			||||||
 | 
					        // Log the error
 | 
				
			||||||
 | 
					        console.error(error);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Get the parent url
 | 
				
			||||||
 | 
					        const parentUrl = state.url.split('/').slice(0, -1).join('/');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Navigate to there
 | 
				
			||||||
 | 
					        this._router.navigateByUrl(parentUrl);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Throw an error
 | 
				
			||||||
 | 
					        return throwError(error);
 | 
				
			||||||
 | 
					      })
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@Injectable({
 | 
				
			||||||
 | 
					  providedIn: 'root',
 | 
				
			||||||
 | 
					})
 | 
				
			||||||
 | 
					export class CouponsResolver implements Resolve<any> {
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					   * Constructor
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					  constructor(private _couponService: CouponService) {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // -----------------------------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					  // @ Public methods
 | 
				
			||||||
 | 
					  // -----------------------------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					   * Resolver
 | 
				
			||||||
 | 
					   *
 | 
				
			||||||
 | 
					   * @param route
 | 
				
			||||||
 | 
					   * @param state
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					  resolve(
 | 
				
			||||||
 | 
					    route: ActivatedRouteSnapshot,
 | 
				
			||||||
 | 
					    state: RouterStateSnapshot
 | 
				
			||||||
 | 
					  ): Observable<{
 | 
				
			||||||
 | 
					    pagination: CouponPagination;
 | 
				
			||||||
 | 
					    coupons: Coupon[];
 | 
				
			||||||
 | 
					  }> {
 | 
				
			||||||
 | 
					    return this._couponService.getCoupons();
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										153
									
								
								src/app/modules/admin/member/coupon/services/coupon.service.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										153
									
								
								src/app/modules/admin/member/coupon/services/coupon.service.ts
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,153 @@
 | 
				
			|||||||
 | 
					import { Injectable } from '@angular/core';
 | 
				
			||||||
 | 
					import { HttpClient } from '@angular/common/http';
 | 
				
			||||||
 | 
					import {
 | 
				
			||||||
 | 
					  BehaviorSubject,
 | 
				
			||||||
 | 
					  filter,
 | 
				
			||||||
 | 
					  map,
 | 
				
			||||||
 | 
					  Observable,
 | 
				
			||||||
 | 
					  of,
 | 
				
			||||||
 | 
					  switchMap,
 | 
				
			||||||
 | 
					  take,
 | 
				
			||||||
 | 
					  tap,
 | 
				
			||||||
 | 
					  throwError,
 | 
				
			||||||
 | 
					} from 'rxjs';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import { Coupon } from '../models/coupon';
 | 
				
			||||||
 | 
					import { CouponPagination } from '../models/coupon-pagination';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@Injectable({
 | 
				
			||||||
 | 
					  providedIn: 'root',
 | 
				
			||||||
 | 
					})
 | 
				
			||||||
 | 
					export class CouponService {
 | 
				
			||||||
 | 
					  // Private
 | 
				
			||||||
 | 
					  private __pagination = new BehaviorSubject<CouponPagination | undefined>(
 | 
				
			||||||
 | 
					    undefined
 | 
				
			||||||
 | 
					  );
 | 
				
			||||||
 | 
					  private __coupon = new BehaviorSubject<Coupon | undefined>(undefined);
 | 
				
			||||||
 | 
					  private __coupons = new BehaviorSubject<Coupon[] | undefined>(undefined);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					   * Constructor
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					  constructor(private _httpClient: HttpClient) {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // -----------------------------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					  // @ Accessors
 | 
				
			||||||
 | 
					  // -----------------------------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					   * Getter for pagination
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					  get pagination$(): Observable<CouponPagination | undefined> {
 | 
				
			||||||
 | 
					    return this.__pagination.asObservable();
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					   * Getter for coupon
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					  get coupon$(): Observable<Coupon | undefined> {
 | 
				
			||||||
 | 
					    return this.__coupon.asObservable();
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					   * Getter for coupons
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					  get coupons$(): Observable<Coupon[] | undefined> {
 | 
				
			||||||
 | 
					    return this.__coupons.asObservable();
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // -----------------------------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					  // @ Public methods
 | 
				
			||||||
 | 
					  // -----------------------------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					   * Get coupons
 | 
				
			||||||
 | 
					   *
 | 
				
			||||||
 | 
					   *
 | 
				
			||||||
 | 
					   * @param page
 | 
				
			||||||
 | 
					   * @param size
 | 
				
			||||||
 | 
					   * @param sort
 | 
				
			||||||
 | 
					   * @param order
 | 
				
			||||||
 | 
					   * @param search
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					  getCoupons(
 | 
				
			||||||
 | 
					    page: number = 0,
 | 
				
			||||||
 | 
					    size: number = 10,
 | 
				
			||||||
 | 
					    sort: string = 'name',
 | 
				
			||||||
 | 
					    order: 'asc' | 'desc' | '' = 'asc',
 | 
				
			||||||
 | 
					    search: string = ''
 | 
				
			||||||
 | 
					  ): Observable<{
 | 
				
			||||||
 | 
					    pagination: CouponPagination;
 | 
				
			||||||
 | 
					    coupons: Coupon[];
 | 
				
			||||||
 | 
					  }> {
 | 
				
			||||||
 | 
					    return this._httpClient
 | 
				
			||||||
 | 
					      .get<{
 | 
				
			||||||
 | 
					        pagination: CouponPagination;
 | 
				
			||||||
 | 
					        coupons: Coupon[];
 | 
				
			||||||
 | 
					      }>('api/apps/member/coupon/coupons', {
 | 
				
			||||||
 | 
					        params: {
 | 
				
			||||||
 | 
					          page: '' + page,
 | 
				
			||||||
 | 
					          size: '' + size,
 | 
				
			||||||
 | 
					          sort,
 | 
				
			||||||
 | 
					          order,
 | 
				
			||||||
 | 
					          search,
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					      })
 | 
				
			||||||
 | 
					      .pipe(
 | 
				
			||||||
 | 
					        tap((response) => {
 | 
				
			||||||
 | 
					          this.__pagination.next(response.pagination);
 | 
				
			||||||
 | 
					          this.__coupons.next(response.coupons);
 | 
				
			||||||
 | 
					        })
 | 
				
			||||||
 | 
					      );
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					   * Get product by id
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					  getCouponById(id: string | null): Observable<Coupon> {
 | 
				
			||||||
 | 
					    return this.__coupons.pipe(
 | 
				
			||||||
 | 
					      take(1),
 | 
				
			||||||
 | 
					      map((coupons) => {
 | 
				
			||||||
 | 
					        // Find the product
 | 
				
			||||||
 | 
					        const coupon = coupons?.find((item) => item.id === id) || undefined;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Update the product
 | 
				
			||||||
 | 
					        this.__coupon.next(coupon);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Return the product
 | 
				
			||||||
 | 
					        return coupon;
 | 
				
			||||||
 | 
					      }),
 | 
				
			||||||
 | 
					      switchMap((product) => {
 | 
				
			||||||
 | 
					        if (!product) {
 | 
				
			||||||
 | 
					          return throwError('Could not found product with id of ' + id + '!');
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return of(product);
 | 
				
			||||||
 | 
					      })
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					   * Create product
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					  createCoupon(): Observable<Coupon> {
 | 
				
			||||||
 | 
					    return this.coupons$.pipe(
 | 
				
			||||||
 | 
					      take(1),
 | 
				
			||||||
 | 
					      switchMap((coupons) =>
 | 
				
			||||||
 | 
					        this._httpClient
 | 
				
			||||||
 | 
					          .post<Coupon>('api/apps/member/coupon/product', {})
 | 
				
			||||||
 | 
					          .pipe(
 | 
				
			||||||
 | 
					            map((newCoupon) => {
 | 
				
			||||||
 | 
					              // Update the coupons with the new product
 | 
				
			||||||
 | 
					              if (!!coupons) {
 | 
				
			||||||
 | 
					                this.__coupons.next([newCoupon, ...coupons]);
 | 
				
			||||||
 | 
					              }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					              // Return the new product
 | 
				
			||||||
 | 
					              return newCoupon;
 | 
				
			||||||
 | 
					            })
 | 
				
			||||||
 | 
					          )
 | 
				
			||||||
 | 
					      )
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -162,28 +162,24 @@
 | 
				
			|||||||
            >
 | 
					            >
 | 
				
			||||||
              <div class="hidden sm:block"><mat-checkbox></mat-checkbox></div>
 | 
					              <div class="hidden sm:block"><mat-checkbox></mat-checkbox></div>
 | 
				
			||||||
              <div class="hidden sm:block">요율</div>
 | 
					              <div class="hidden sm:block">요율</div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="''">상부트리</div>
 | 
					              <div class="hidden sm:block">상부트리</div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="''">관리</div>
 | 
					              <div class="hidden sm:block">관리</div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="''">매장수</div>
 | 
					              <div class="hidden sm:block">매장수</div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="''">회원수</div>
 | 
					              <div class="hidden sm:block">회원수</div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="''">아이디</div>
 | 
					              <div class="hidden sm:block">아이디</div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="''">닉네임</div>
 | 
					              <div class="hidden sm:block">닉네임</div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="''">예금주</div>
 | 
					              <div class="hidden sm:block">예금주</div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="''">연락처</div>
 | 
					              <div class="hidden sm:block">연락처</div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="''">정산</div>
 | 
					              <div class="hidden sm:block">정산</div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="''">보유금</div>
 | 
					              <div class="hidden sm:block">보유금</div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="''">
 | 
					              <div class="hidden sm:block">게임중머니</div>
 | 
				
			||||||
                게임중머니
 | 
					              <div class="hidden sm:block">카지노->캐쉬</div>
 | 
				
			||||||
              </div>
 | 
					              <div class="hidden sm:block">금일콤프</div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="''">
 | 
					              <div class="hidden sm:block">총입출</div>
 | 
				
			||||||
                카지노->캐쉬
 | 
					              <div class="hidden sm:block">로그</div>
 | 
				
			||||||
              </div>
 | 
					              <div class="hidden sm:block">상태</div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="''">금일콤프</div>
 | 
					              <div class="hidden sm:block">회원수</div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="''">총입출</div>
 | 
					              <div class="hidden sm:block">비고</div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="''">로그</div>
 | 
					 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="''">상태</div>
 | 
					 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="''">회원수</div>
 | 
					 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="''">비고</div>
 | 
					 | 
				
			||||||
            </div>
 | 
					            </div>
 | 
				
			||||||
            <!-- Rows -->
 | 
					            <!-- Rows -->
 | 
				
			||||||
            <ng-container *ngIf="partnerBranchs$ | async as partnerBranchs">
 | 
					            <ng-container *ngIf="partnerBranchs$ | async as partnerBranchs">
 | 
				
			||||||
 | 
				
			|||||||
@ -164,28 +164,24 @@
 | 
				
			|||||||
            >
 | 
					            >
 | 
				
			||||||
              <div class="hidden sm:block"><mat-checkbox></mat-checkbox></div>
 | 
					              <div class="hidden sm:block"><mat-checkbox></mat-checkbox></div>
 | 
				
			||||||
              <div class="hidden sm:block">요율</div>
 | 
					              <div class="hidden sm:block">요율</div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="''">상부트리</div>
 | 
					              <div class="hidden sm:block">상부트리</div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="''">관리</div>
 | 
					              <div class="hidden sm:block">관리</div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="''">매장수</div>
 | 
					              <div class="hidden sm:block">매장수</div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="''">회원수</div>
 | 
					              <div class="hidden sm:block">회원수</div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="''">아이디</div>
 | 
					              <div class="hidden sm:block">아이디</div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="''">닉네임</div>
 | 
					              <div class="hidden sm:block">닉네임</div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="''">예금주</div>
 | 
					              <div class="hidden sm:block">예금주</div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="''">연락처</div>
 | 
					              <div class="hidden sm:block">연락처</div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="''">정산</div>
 | 
					              <div class="hidden sm:block">정산</div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="''">보유금</div>
 | 
					              <div class="hidden sm:block">보유금</div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="''">
 | 
					              <div class="hidden sm:block">게임중머니</div>
 | 
				
			||||||
                게임중머니
 | 
					              <div class="hidden sm:block">카지노->캐쉬</div>
 | 
				
			||||||
              </div>
 | 
					              <div class="hidden sm:block">금일콤프</div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="''">
 | 
					              <div class="hidden sm:block">총입출</div>
 | 
				
			||||||
                카지노->캐쉬
 | 
					              <div class="hidden sm:block">로그</div>
 | 
				
			||||||
              </div>
 | 
					              <div class="hidden sm:block">상태</div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="''">금일콤프</div>
 | 
					              <div class="hidden sm:block">회원수</div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="''">총입출</div>
 | 
					              <div class="hidden sm:block">비고</div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="''">로그</div>
 | 
					 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="''">상태</div>
 | 
					 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="''">회원수</div>
 | 
					 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="''">비고</div>
 | 
					 | 
				
			||||||
            </div>
 | 
					            </div>
 | 
				
			||||||
            <!-- Rows -->
 | 
					            <!-- Rows -->
 | 
				
			||||||
            <ng-container *ngIf="partnerDivisions$ | async as partnerDivisions">
 | 
					            <ng-container *ngIf="partnerDivisions$ | async as partnerDivisions">
 | 
				
			||||||
 | 
				
			|||||||
@ -164,28 +164,26 @@
 | 
				
			|||||||
            >
 | 
					            >
 | 
				
			||||||
              <div class="hidden sm:block"><mat-checkbox></mat-checkbox></div>
 | 
					              <div class="hidden sm:block"><mat-checkbox></mat-checkbox></div>
 | 
				
			||||||
              <div class="hidden sm:block">요율</div>
 | 
					              <div class="hidden sm:block">요율</div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="''">상부트리</div>
 | 
					              <div class="hidden sm:block">상부트리</div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="''">관리</div>
 | 
					              <div class="hidden sm:block">관리</div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="''">매장수</div>
 | 
					              <div class="hidden sm:block">매장수</div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="''">회원수</div>
 | 
					              <div class="hidden sm:block">회원수</div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="''">아이디</div>
 | 
					              <div class="hidden sm:block">아이디</div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="''">닉네임</div>
 | 
					              <div class="hidden sm:block">닉네임</div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="''">예금주</div>
 | 
					              <div class="hidden sm:block">예금주</div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="''">연락처</div>
 | 
					              <div class="hidden sm:block">연락처</div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="''">정산</div>
 | 
					              <div class="hidden sm:block">정산</div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="''">보유금</div>
 | 
					              <div class="hidden sm:block">보유금</div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="''">
 | 
					              <div class="hidden sm:block">게임중머니</div>
 | 
				
			||||||
                게임중머니
 | 
					 | 
				
			||||||
              </div>
 | 
					 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="''">
 | 
					              <div class="hidden sm:block" [mat-sort-header]="''">
 | 
				
			||||||
                카지노->캐쉬
 | 
					                카지노->캐쉬
 | 
				
			||||||
              </div>
 | 
					              </div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="''">금일콤프</div>
 | 
					              <div class="hidden sm:block">금일콤프</div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="''">총입출</div>
 | 
					              <div class="hidden sm:block">총입출</div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="''">로그</div>
 | 
					              <div class="hidden sm:block">로그</div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="''">상태</div>
 | 
					              <div class="hidden sm:block">상태</div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="''">회원수</div>
 | 
					              <div class="hidden sm:block">회원수</div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="''">비고</div>
 | 
					              <div class="hidden sm:block">비고</div>
 | 
				
			||||||
            </div>
 | 
					            </div>
 | 
				
			||||||
            <!-- Rows -->
 | 
					            <!-- Rows -->
 | 
				
			||||||
            <ng-container
 | 
					            <ng-container
 | 
				
			||||||
 | 
				
			|||||||
@ -162,28 +162,24 @@
 | 
				
			|||||||
            >
 | 
					            >
 | 
				
			||||||
              <div class="hidden sm:block"><mat-checkbox></mat-checkbox></div>
 | 
					              <div class="hidden sm:block"><mat-checkbox></mat-checkbox></div>
 | 
				
			||||||
              <div class="hidden sm:block">요율</div>
 | 
					              <div class="hidden sm:block">요율</div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="''">상부트리</div>
 | 
					              <div class="hidden sm:block">상부트리</div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="''">관리</div>
 | 
					              <div class="hidden sm:block">관리</div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="''">매장수</div>
 | 
					              <div class="hidden sm:block">매장수</div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="''">회원수</div>
 | 
					              <div class="hidden sm:block">회원수</div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="''">아이디</div>
 | 
					              <div class="hidden sm:block">아이디</div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="''">닉네임</div>
 | 
					              <div class="hidden sm:block">닉네임</div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="''">예금주</div>
 | 
					              <div class="hidden sm:block">예금주</div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="''">연락처</div>
 | 
					              <div class="hidden sm:block">연락처</div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="''">정산</div>
 | 
					              <div class="hidden sm:block">정산</div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="''">보유금</div>
 | 
					              <div class="hidden sm:block">보유금</div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="''">
 | 
					              <div class="hidden sm:block">게임중머니</div>
 | 
				
			||||||
                게임중머니
 | 
					              <div class="hidden sm:block">카지노->캐쉬</div>
 | 
				
			||||||
              </div>
 | 
					              <div class="hidden sm:block">금일콤프</div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="''">
 | 
					              <div class="hidden sm:block">총입출</div>
 | 
				
			||||||
                카지노->캐쉬
 | 
					              <div class="hidden sm:block">로그</div>
 | 
				
			||||||
              </div>
 | 
					              <div class="hidden sm:block">상태</div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="''">금일콤프</div>
 | 
					              <div class="hidden sm:block">회원수</div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="''">총입출</div>
 | 
					              <div class="hidden sm:block">비고</div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="''">로그</div>
 | 
					 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="''">상태</div>
 | 
					 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="''">회원수</div>
 | 
					 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="''">비고</div>
 | 
					 | 
				
			||||||
            </div>
 | 
					            </div>
 | 
				
			||||||
            <!-- Rows -->
 | 
					            <!-- Rows -->
 | 
				
			||||||
            <ng-container *ngIf="partnerOffices$ | async as partnerOffices">
 | 
					            <ng-container *ngIf="partnerOffices$ | async as partnerOffices">
 | 
				
			||||||
 | 
				
			|||||||
@ -0,0 +1,3 @@
 | 
				
			|||||||
 | 
					import { ListComponent } from './list.component';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export const COMPONENTS = [ListComponent];
 | 
				
			||||||
@ -0,0 +1,368 @@
 | 
				
			|||||||
 | 
					<div
 | 
				
			||||||
 | 
					  class="sm:absolute sm:inset-0 flex flex-col flex-auto min-w-0 sm:overflow-hidden bg-card dark:bg-transparent"
 | 
				
			||||||
 | 
					>
 | 
				
			||||||
 | 
					  <!-- Header -->
 | 
				
			||||||
 | 
					  <div
 | 
				
			||||||
 | 
					    class="relative flex flex-col sm:flex-row flex-0 sm:items-center sm:justify-between py-8 px-6 md:px-8 border-b"
 | 
				
			||||||
 | 
					  >
 | 
				
			||||||
 | 
					    <!-- Loader -->
 | 
				
			||||||
 | 
					    <div class="absolute inset-x-0 bottom-0" *ngIf="isLoading">
 | 
				
			||||||
 | 
					      <mat-progress-bar [mode]="'indeterminate'"></mat-progress-bar>
 | 
				
			||||||
 | 
					    </div>
 | 
				
			||||||
 | 
					    <!-- Title -->
 | 
				
			||||||
 | 
					    <div class="text-4xl font-extrabold tracking-tight">추천코드등록</div>
 | 
				
			||||||
 | 
					    <!-- Actions -->
 | 
				
			||||||
 | 
					    <div class="flex shrink-0 items-center mt-6 sm:mt-0 sm:ml-4">
 | 
				
			||||||
 | 
					      <!-- Memo -->
 | 
				
			||||||
 | 
					      <!-- <mat-form-field>
 | 
				
			||||||
 | 
					        <ng-container *ngIf="partnerRecommendations$ | async as partnerRecommendations">
 | 
				
			||||||
 | 
					          <ng-container
 | 
				
			||||||
 | 
					            *ngFor="let partnerRecommendation of partnerRecommendations; trackBy: __trackByFn"
 | 
				
			||||||
 | 
					          >
 | 
				
			||||||
 | 
					            <div
 | 
				
			||||||
 | 
					              class="inventory-grid grid items-center gap-4 py-3 px-6 md:px-8 border-b"
 | 
				
			||||||
 | 
					            >
 | 
				
			||||||
 | 
					              <fieldset>
 | 
				
			||||||
 | 
					                총 파트너수:{{ partnerRecommendation.totalPartnerCount }} 총 보유머니:{{
 | 
				
			||||||
 | 
					                  partnerRecommendation.totalHoldingMoney
 | 
				
			||||||
 | 
					                }}
 | 
				
			||||||
 | 
					                총 콤프:{{ partnerRecommendation.totalComp }} 총 합계:{{
 | 
				
			||||||
 | 
					                  partnerRecommendation.total
 | 
				
			||||||
 | 
					                }}
 | 
				
			||||||
 | 
					              </fieldset>
 | 
				
			||||||
 | 
					            </div>
 | 
				
			||||||
 | 
					          </ng-container>
 | 
				
			||||||
 | 
					        </ng-container>
 | 
				
			||||||
 | 
					      </mat-form-field> -->
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      <!-- SelectBox -->
 | 
				
			||||||
 | 
					      <mat-form-field>
 | 
				
			||||||
 | 
					        <mat-select placeholder="리스트수">
 | 
				
			||||||
 | 
					          <mat-option value="40">40</mat-option>
 | 
				
			||||||
 | 
					          <mat-option value="60">60</mat-option>
 | 
				
			||||||
 | 
					          <mat-option value="80">80</mat-option>
 | 
				
			||||||
 | 
					          <mat-option value="100">100</mat-option>
 | 
				
			||||||
 | 
					        </mat-select>
 | 
				
			||||||
 | 
					      </mat-form-field>
 | 
				
			||||||
 | 
					      <mat-form-field>
 | 
				
			||||||
 | 
					        <mat-select placeholder="레벨">
 | 
				
			||||||
 | 
					          <mat-option value="level1">LV.1</mat-option>
 | 
				
			||||||
 | 
					          <mat-option value="level2">LV.2</mat-option>
 | 
				
			||||||
 | 
					          <mat-option value="level3">LV.3</mat-option>
 | 
				
			||||||
 | 
					          <mat-option value="level4">LV.4</mat-option>
 | 
				
			||||||
 | 
					        </mat-select>
 | 
				
			||||||
 | 
					      </mat-form-field>
 | 
				
			||||||
 | 
					      <mat-form-field>
 | 
				
			||||||
 | 
					        <mat-select placeholder="상태">
 | 
				
			||||||
 | 
					          <mat-option value="">정상</mat-option>
 | 
				
			||||||
 | 
					          <mat-option value="">대기</mat-option>
 | 
				
			||||||
 | 
					          <mat-option value="">탈퇴</mat-option>
 | 
				
			||||||
 | 
					          <mat-option value="">휴면</mat-option>
 | 
				
			||||||
 | 
					          <mat-option value="">블랙</mat-option>
 | 
				
			||||||
 | 
					          <mat-option value="">정지</mat-option>
 | 
				
			||||||
 | 
					        </mat-select>
 | 
				
			||||||
 | 
					      </mat-form-field>
 | 
				
			||||||
 | 
					      <mat-form-field>
 | 
				
			||||||
 | 
					        <mat-select placeholder="제한">
 | 
				
			||||||
 | 
					          <mat-option value="">카지노제한</mat-option>
 | 
				
			||||||
 | 
					          <mat-option value="">슬롯제한</mat-option>
 | 
				
			||||||
 | 
					        </mat-select>
 | 
				
			||||||
 | 
					      </mat-form-field>
 | 
				
			||||||
 | 
					      <mat-form-field>
 | 
				
			||||||
 | 
					        <mat-select placeholder="입금">
 | 
				
			||||||
 | 
					          <mat-option value="">계좌입금</mat-option>
 | 
				
			||||||
 | 
					        </mat-select>
 | 
				
			||||||
 | 
					      </mat-form-field>
 | 
				
			||||||
 | 
					      <mat-form-field>
 | 
				
			||||||
 | 
					        <mat-select placeholder="내용">
 | 
				
			||||||
 | 
					          <mat-option value="">카지노콤프</mat-option>
 | 
				
			||||||
 | 
					          <mat-option value="">슬롯콤프</mat-option>
 | 
				
			||||||
 | 
					          <mat-option value="">배팅콤프</mat-option>
 | 
				
			||||||
 | 
					          <mat-option value="">첫충콤프</mat-option>
 | 
				
			||||||
 | 
					        </mat-select>
 | 
				
			||||||
 | 
					      </mat-form-field>
 | 
				
			||||||
 | 
					      <!-- <mat-form-field>
 | 
				
			||||||
 | 
					        <mat-select placeholder="입금">
 | 
				
			||||||
 | 
					          <mat-option value="">계좌입금</mat-option>
 | 
				
			||||||
 | 
					        </mat-select>
 | 
				
			||||||
 | 
					      </mat-form-field>
 | 
				
			||||||
 | 
					      <mat-form-field>
 | 
				
			||||||
 | 
					        <mat-select placeholder="아이디">
 | 
				
			||||||
 | 
					          <mat-option value="">아이디</mat-option>
 | 
				
			||||||
 | 
					          <mat-option value="">닉네임</mat-option>
 | 
				
			||||||
 | 
					          <mat-option value="">이름</mat-option>
 | 
				
			||||||
 | 
					          <mat-option value="">사이트</mat-option>
 | 
				
			||||||
 | 
					          <mat-option value="">파트너수동지급</mat-option>
 | 
				
			||||||
 | 
					        </mat-select>
 | 
				
			||||||
 | 
					      </mat-form-field>
 | 
				
			||||||
 | 
					      <mat-form-field>
 | 
				
			||||||
 | 
					        <mat-select placeholder="가입일 정렬">
 | 
				
			||||||
 | 
					          <mat-option value="">가입일 정렬</mat-option>
 | 
				
			||||||
 | 
					          <mat-option value="">아이디 정렬</mat-option>
 | 
				
			||||||
 | 
					          <mat-option value="">닉네임 정렬</mat-option>
 | 
				
			||||||
 | 
					          <mat-option value="">캐쉬 정렬</mat-option>
 | 
				
			||||||
 | 
					          <mat-option value="">콤프 정렬</mat-option>
 | 
				
			||||||
 | 
					          <mat-option value="">쿠폰 정렬</mat-option>
 | 
				
			||||||
 | 
					          <mat-option value="">입금 정렬</mat-option>
 | 
				
			||||||
 | 
					          <mat-option value="">출금 정렬</mat-option>
 | 
				
			||||||
 | 
					          <mat-option value="">차익 정렬</mat-option>
 | 
				
			||||||
 | 
					        </mat-select>
 | 
				
			||||||
 | 
					      </mat-form-field>
 | 
				
			||||||
 | 
					      <mat-form-field>
 | 
				
			||||||
 | 
					        <mat-select placeholder="내림차순">
 | 
				
			||||||
 | 
					          <mat-option value="">내림차순</mat-option>
 | 
				
			||||||
 | 
					          <mat-option value="">오름차순</mat-option>
 | 
				
			||||||
 | 
					        </mat-select>
 | 
				
			||||||
 | 
					      </mat-form-field> -->
 | 
				
			||||||
 | 
					      <!-- Search -->
 | 
				
			||||||
 | 
					      <mat-form-field
 | 
				
			||||||
 | 
					        class="fuse-mat-dense fuse-mat-no-subscript fuse-mat-rounded min-w-64"
 | 
				
			||||||
 | 
					      >
 | 
				
			||||||
 | 
					        <mat-icon
 | 
				
			||||||
 | 
					          class="icon-size-5"
 | 
				
			||||||
 | 
					          matPrefix
 | 
				
			||||||
 | 
					          [svgIcon]="'heroicons_solid:search'"
 | 
				
			||||||
 | 
					        ></mat-icon>
 | 
				
			||||||
 | 
					        <input
 | 
				
			||||||
 | 
					          matInput
 | 
				
			||||||
 | 
					          [formControl]="searchInputControl"
 | 
				
			||||||
 | 
					          [autocomplete]="'off'"
 | 
				
			||||||
 | 
					          [placeholder]="'Search'"
 | 
				
			||||||
 | 
					        />
 | 
				
			||||||
 | 
					      </mat-form-field>
 | 
				
			||||||
 | 
					      <!-- Add user button -->
 | 
				
			||||||
 | 
					      <button
 | 
				
			||||||
 | 
					        class="ml-4"
 | 
				
			||||||
 | 
					        mat-flat-button
 | 
				
			||||||
 | 
					        [color]="'primary'"
 | 
				
			||||||
 | 
					        (click)="__createProduct()"
 | 
				
			||||||
 | 
					      >
 | 
				
			||||||
 | 
					        <!-- <mat-icon [svgIcon]="'heroicons_outline:plus'"></mat-icon> -->
 | 
				
			||||||
 | 
					        <span class="ml-2 mr-1">검색하기</span>
 | 
				
			||||||
 | 
					      </button>
 | 
				
			||||||
 | 
					      <button>엑셀저장</button>
 | 
				
			||||||
 | 
					      <button>카지노머니확인</button>
 | 
				
			||||||
 | 
					    </div>
 | 
				
			||||||
 | 
					  </div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  <!-- Main -->
 | 
				
			||||||
 | 
					  <div class="flex flex-auto overflow-hidden">
 | 
				
			||||||
 | 
					    <!-- Products list -->
 | 
				
			||||||
 | 
					    <div
 | 
				
			||||||
 | 
					      class="flex flex-col flex-auto sm:mb-18 overflow-hidden sm:overflow-y-auto"
 | 
				
			||||||
 | 
					    >
 | 
				
			||||||
 | 
					      <ng-container
 | 
				
			||||||
 | 
					        *ngIf="partnerRecommendations$ | async as partnerRecommendations"
 | 
				
			||||||
 | 
					      >
 | 
				
			||||||
 | 
					        <ng-container
 | 
				
			||||||
 | 
					          *ngIf="
 | 
				
			||||||
 | 
					            partnerRecommendations.length > 0;
 | 
				
			||||||
 | 
					            else noPartnerRecommendation
 | 
				
			||||||
 | 
					          "
 | 
				
			||||||
 | 
					        >
 | 
				
			||||||
 | 
					          <div class="grid">
 | 
				
			||||||
 | 
					            <!-- Header -->
 | 
				
			||||||
 | 
					            <div
 | 
				
			||||||
 | 
					              class="inventory-grid z-10 sticky top-0 grid gap-4 py-4 px-6 md:px-8 shadow text-md font-semibold text-secondary bg-gray-50 dark:bg-black dark:bg-opacity-5"
 | 
				
			||||||
 | 
					              matSort
 | 
				
			||||||
 | 
					              matSortDisableClear
 | 
				
			||||||
 | 
					            >
 | 
				
			||||||
 | 
					              <div class="hidden sm:block"><mat-checkbox></mat-checkbox></div>
 | 
				
			||||||
 | 
					              <div class="hidden sm:block">요율</div>
 | 
				
			||||||
 | 
					              <div class="hidden sm:block">상부트리</div>
 | 
				
			||||||
 | 
					              <div class="hidden sm:block">관리</div>
 | 
				
			||||||
 | 
					              <div class="hidden sm:block">매장수</div>
 | 
				
			||||||
 | 
					              <div class="hidden sm:block">회원수</div>
 | 
				
			||||||
 | 
					              <div class="hidden sm:block">아이디</div>
 | 
				
			||||||
 | 
					              <div class="hidden sm:block">닉네임</div>
 | 
				
			||||||
 | 
					              <div class="hidden sm:block">예금주</div>
 | 
				
			||||||
 | 
					              <div class="hidden sm:block">연락처</div>
 | 
				
			||||||
 | 
					              <div class="hidden sm:block">정산</div>
 | 
				
			||||||
 | 
					              <div class="hidden sm:block">보유금</div>
 | 
				
			||||||
 | 
					              <div class="hidden sm:block">게임중머니</div>
 | 
				
			||||||
 | 
					              <div class="hidden sm:block">카지노->캐쉬</div>
 | 
				
			||||||
 | 
					              <div class="hidden sm:block">금일콤프</div>
 | 
				
			||||||
 | 
					              <div class="hidden sm:block">총입출</div>
 | 
				
			||||||
 | 
					              <div class="hidden sm:block">로그</div>
 | 
				
			||||||
 | 
					              <div class="hidden sm:block">상태</div>
 | 
				
			||||||
 | 
					              <div class="hidden sm:block">회원수</div>
 | 
				
			||||||
 | 
					              <div class="hidden sm:block">비고</div>
 | 
				
			||||||
 | 
					            </div>
 | 
				
			||||||
 | 
					            <!-- Rows -->
 | 
				
			||||||
 | 
					            <ng-container
 | 
				
			||||||
 | 
					              *ngIf="partnerRecommendations$ | async as partnerRecommendations"
 | 
				
			||||||
 | 
					            >
 | 
				
			||||||
 | 
					              <ng-container
 | 
				
			||||||
 | 
					                *ngFor="
 | 
				
			||||||
 | 
					                  let partnerRecommendation of partnerRecommendations;
 | 
				
			||||||
 | 
					                  trackBy: __trackByFn
 | 
				
			||||||
 | 
					                "
 | 
				
			||||||
 | 
					              >
 | 
				
			||||||
 | 
					                <div
 | 
				
			||||||
 | 
					                  class="inventory-grid grid items-center gap-4 py-3 px-6 md:px-8 border-b"
 | 
				
			||||||
 | 
					                >
 | 
				
			||||||
 | 
					                  <div class="hidden sm:block truncate">
 | 
				
			||||||
 | 
					                    <mat-checkbox></mat-checkbox>
 | 
				
			||||||
 | 
					                  </div>
 | 
				
			||||||
 | 
					                  <!-- rate -->
 | 
				
			||||||
 | 
					                  <div class="hidden sm:block truncate">
 | 
				
			||||||
 | 
					                    <button
 | 
				
			||||||
 | 
					                      mat-button
 | 
				
			||||||
 | 
					                      color="primary"
 | 
				
			||||||
 | 
					                      matTooltip="요율확인
 | 
				
			||||||
 | 
					                                카지노-바카라: 0%
 | 
				
			||||||
 | 
					                                카지노-룰렛: 0%
 | 
				
			||||||
 | 
					                                카지노-드레곤타이거: 0%
 | 
				
			||||||
 | 
					                                카지노-그외: 0%
 | 
				
			||||||
 | 
					                                슬롯: 0%
 | 
				
			||||||
 | 
					                                카지노루징: 0%
 | 
				
			||||||
 | 
					                                슬롯루징: 0%"
 | 
				
			||||||
 | 
					                    >
 | 
				
			||||||
 | 
					                      요율
 | 
				
			||||||
 | 
					                    </button>
 | 
				
			||||||
 | 
					                    <div class="hidden sm:block truncate">
 | 
				
			||||||
 | 
					                      <!-- 관리 -->
 | 
				
			||||||
 | 
					                      <button mat-flat-button [color]="'primary'">
 | 
				
			||||||
 | 
					                        <mat-form-field>
 | 
				
			||||||
 | 
					                          <mat-select placeholder="관리">
 | 
				
			||||||
 | 
					                            <mat-option value="">보유금지급/회수</mat-option>
 | 
				
			||||||
 | 
					                            <mat-option value="">수수료설정</mat-option>
 | 
				
			||||||
 | 
					                            <mat-option value="">콤프지급/회수</mat-option>
 | 
				
			||||||
 | 
					                            <mat-option value="">쿠폰머니지급/회수</mat-option>
 | 
				
			||||||
 | 
					                            <mat-option value="">쪽지보내기</mat-option>
 | 
				
			||||||
 | 
					                            <mat-option value="">베팅리스트</mat-option>
 | 
				
			||||||
 | 
					                            <mat-option value="">강제로그아웃</mat-option>
 | 
				
			||||||
 | 
					                          </mat-select>
 | 
				
			||||||
 | 
					                        </mat-form-field>
 | 
				
			||||||
 | 
					                      </button>
 | 
				
			||||||
 | 
					                    </div>
 | 
				
			||||||
 | 
					                  </div>
 | 
				
			||||||
 | 
					                  <!-- 매장수 -->
 | 
				
			||||||
 | 
					                  <div class="hidden sm:block truncate">
 | 
				
			||||||
 | 
					                    <button mat-flat-button [color]="'primary'">
 | 
				
			||||||
 | 
					                      {{ partnerRecommendation.branchCount }}
 | 
				
			||||||
 | 
					                    </button>
 | 
				
			||||||
 | 
					                    <button mat-flat-button [color]="'primary'">
 | 
				
			||||||
 | 
					                      {{ partnerRecommendation.divisionCount }}
 | 
				
			||||||
 | 
					                    </button>
 | 
				
			||||||
 | 
					                    <button mat-flat-button [color]="'primary'">
 | 
				
			||||||
 | 
					                      {{ partnerRecommendation.officeCount }}
 | 
				
			||||||
 | 
					                    </button>
 | 
				
			||||||
 | 
					                    <button mat-flat-button [color]="'primary'">
 | 
				
			||||||
 | 
					                      {{ partnerRecommendation.storeCount }}
 | 
				
			||||||
 | 
					                    </button>
 | 
				
			||||||
 | 
					                  </div>
 | 
				
			||||||
 | 
					                  <!-- 회원수 -->
 | 
				
			||||||
 | 
					                  <div class="hidden sm:block truncate">
 | 
				
			||||||
 | 
					                    <button mat-flat-button [color]="'primary'">
 | 
				
			||||||
 | 
					                      {{ partnerRecommendation.memberCount }}
 | 
				
			||||||
 | 
					                    </button>
 | 
				
			||||||
 | 
					                  </div>
 | 
				
			||||||
 | 
					                  <!-- id -->
 | 
				
			||||||
 | 
					                  <ng-container *ngIf="users$ | async as users">
 | 
				
			||||||
 | 
					                    <ng-container
 | 
				
			||||||
 | 
					                      *ngFor="let user of users; trackBy: __trackByFn"
 | 
				
			||||||
 | 
					                    >
 | 
				
			||||||
 | 
					                      <div
 | 
				
			||||||
 | 
					                        class="hidden sm:block truncate"
 | 
				
			||||||
 | 
					                        (click)="viewUserDetail(user.id!)"
 | 
				
			||||||
 | 
					                      >
 | 
				
			||||||
 | 
					                        {{ partnerRecommendation.id }}
 | 
				
			||||||
 | 
					                      </div>
 | 
				
			||||||
 | 
					                    </ng-container>
 | 
				
			||||||
 | 
					                  </ng-container>
 | 
				
			||||||
 | 
					                  <!-- nickname -->
 | 
				
			||||||
 | 
					                  <div class="hidden sm:block truncate">
 | 
				
			||||||
 | 
					                    {{ partnerRecommendation.nickname }}
 | 
				
			||||||
 | 
					                  </div>
 | 
				
			||||||
 | 
					                  <!-- accountHolder -->
 | 
				
			||||||
 | 
					                  <div class="hidden sm:block truncate">
 | 
				
			||||||
 | 
					                    {{ partnerRecommendation.accountHolder }}
 | 
				
			||||||
 | 
					                  </div>
 | 
				
			||||||
 | 
					                  <!-- 연락처 -->
 | 
				
			||||||
 | 
					                  <div class="hidden sm:block truncate">
 | 
				
			||||||
 | 
					                    {{ partnerRecommendation.phoneNumber }}
 | 
				
			||||||
 | 
					                  </div>
 | 
				
			||||||
 | 
					                  <!-- 정산 -->
 | 
				
			||||||
 | 
					                  <div class="hidden sm:block truncate">
 | 
				
			||||||
 | 
					                    {{ partnerRecommendation.calculateType }}
 | 
				
			||||||
 | 
					                  </div>
 | 
				
			||||||
 | 
					                  <!-- 보유금 -->
 | 
				
			||||||
 | 
					                  <div class="hidden sm:block truncate">
 | 
				
			||||||
 | 
					                    캐쉬{{ partnerRecommendation.ownCash }} 콤프{{
 | 
				
			||||||
 | 
					                      partnerRecommendation.ownComp
 | 
				
			||||||
 | 
					                    }}
 | 
				
			||||||
 | 
					                    쿠폰{{ partnerRecommendation.ownCoupon }}
 | 
				
			||||||
 | 
					                  </div>
 | 
				
			||||||
 | 
					                  <!-- gameMoney -->
 | 
				
			||||||
 | 
					                  <div class="hidden sm:block truncate">
 | 
				
			||||||
 | 
					                    {{ partnerRecommendation.gameMoney }}
 | 
				
			||||||
 | 
					                  </div>
 | 
				
			||||||
 | 
					                  <!-- casinoCash -->
 | 
				
			||||||
 | 
					                  <div class="hidden sm:block truncate">
 | 
				
			||||||
 | 
					                    <button mat-flat-button [color]="'primary'">
 | 
				
			||||||
 | 
					                      게임머니확인
 | 
				
			||||||
 | 
					                    </button>
 | 
				
			||||||
 | 
					                    <button mat-flat-button [color]="'primary'">
 | 
				
			||||||
 | 
					                      게임머니회수
 | 
				
			||||||
 | 
					                    </button>
 | 
				
			||||||
 | 
					                  </div>
 | 
				
			||||||
 | 
					                  <!-- todayComp -->
 | 
				
			||||||
 | 
					                  <div class="hidden sm:block truncate">
 | 
				
			||||||
 | 
					                    {{ partnerRecommendation.todayComp }}P
 | 
				
			||||||
 | 
					                  </div>
 | 
				
			||||||
 | 
					                  <!-- 총입출 -->
 | 
				
			||||||
 | 
					                  <div class="hidden sm:block truncate">
 | 
				
			||||||
 | 
					                    입금{{ partnerRecommendation.totalDeposit }} 출금{{
 | 
				
			||||||
 | 
					                      partnerRecommendation.totalWithdraw
 | 
				
			||||||
 | 
					                    }}
 | 
				
			||||||
 | 
					                    차익{{ partnerRecommendation.balance }}
 | 
				
			||||||
 | 
					                  </div>
 | 
				
			||||||
 | 
					                  <!-- log -->
 | 
				
			||||||
 | 
					                  <div class="hidden sm:block truncate">
 | 
				
			||||||
 | 
					                    가입{{ partnerRecommendation.registDate }} 최종{{
 | 
				
			||||||
 | 
					                      partnerRecommendation.finalSigninDate
 | 
				
			||||||
 | 
					                    }}
 | 
				
			||||||
 | 
					                    IP{{ partnerRecommendation.ip }}
 | 
				
			||||||
 | 
					                  </div>
 | 
				
			||||||
 | 
					                  <!-- state -->
 | 
				
			||||||
 | 
					                  <div class="hidden sm:block truncate">
 | 
				
			||||||
 | 
					                    {{ partnerRecommendation.state }}
 | 
				
			||||||
 | 
					                  </div>
 | 
				
			||||||
 | 
					                  <!-- 회원수 -->
 | 
				
			||||||
 | 
					                  <div class="hidden sm:block truncate">
 | 
				
			||||||
 | 
					                    {{ partnerRecommendation.memberCount }}
 | 
				
			||||||
 | 
					                  </div>
 | 
				
			||||||
 | 
					                  <!-- 비고 -->
 | 
				
			||||||
 | 
					                  <div class="hidden sm:block truncate">
 | 
				
			||||||
 | 
					                    <button mat-flat-button [color]="'primary'">
 | 
				
			||||||
 | 
					                      {{ partnerRecommendation.note }}
 | 
				
			||||||
 | 
					                    </button>
 | 
				
			||||||
 | 
					                  </div>
 | 
				
			||||||
 | 
					                </div>
 | 
				
			||||||
 | 
					              </ng-container>
 | 
				
			||||||
 | 
					            </ng-container>
 | 
				
			||||||
 | 
					          </div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          <mat-paginator
 | 
				
			||||||
 | 
					            class="sm:absolute sm:inset-x-0 sm:bottom-0 border-b sm:border-t sm:border-b-0 z-10 bg-gray-50 dark:bg-transparent"
 | 
				
			||||||
 | 
					            [ngClass]="{ 'pointer-events-none': isLoading }"
 | 
				
			||||||
 | 
					            [length]="pagination?.length"
 | 
				
			||||||
 | 
					            [pageIndex]="pagination?.page"
 | 
				
			||||||
 | 
					            [pageSize]="pagination?.size"
 | 
				
			||||||
 | 
					            [pageSizeOptions]="[5, 10, 25, 100]"
 | 
				
			||||||
 | 
					            [showFirstLastButtons]="true"
 | 
				
			||||||
 | 
					          ></mat-paginator>
 | 
				
			||||||
 | 
					        </ng-container>
 | 
				
			||||||
 | 
					      </ng-container>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      <ng-template #noPartnerRecommendation>
 | 
				
			||||||
 | 
					        <div
 | 
				
			||||||
 | 
					          class="p-8 sm:p-16 border-t text-4xl font-semibold tracking-tight text-center"
 | 
				
			||||||
 | 
					        >
 | 
				
			||||||
 | 
					          There are no partner recommendations!
 | 
				
			||||||
 | 
					        </div>
 | 
				
			||||||
 | 
					      </ng-template>
 | 
				
			||||||
 | 
					    </div>
 | 
				
			||||||
 | 
					  </div>
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
@ -0,0 +1,199 @@
 | 
				
			|||||||
 | 
					import {
 | 
				
			||||||
 | 
					  AfterViewInit,
 | 
				
			||||||
 | 
					  ChangeDetectionStrategy,
 | 
				
			||||||
 | 
					  ChangeDetectorRef,
 | 
				
			||||||
 | 
					  Component,
 | 
				
			||||||
 | 
					  OnDestroy,
 | 
				
			||||||
 | 
					  OnInit,
 | 
				
			||||||
 | 
					  ViewChild,
 | 
				
			||||||
 | 
					  ViewEncapsulation,
 | 
				
			||||||
 | 
					} from '@angular/core';
 | 
				
			||||||
 | 
					import {
 | 
				
			||||||
 | 
					  FormBuilder,
 | 
				
			||||||
 | 
					  FormControl,
 | 
				
			||||||
 | 
					  FormGroup,
 | 
				
			||||||
 | 
					  Validators,
 | 
				
			||||||
 | 
					} from '@angular/forms';
 | 
				
			||||||
 | 
					import { MatCheckboxChange } from '@angular/material/checkbox';
 | 
				
			||||||
 | 
					import { MatPaginator } from '@angular/material/paginator';
 | 
				
			||||||
 | 
					import { MatSort } from '@angular/material/sort';
 | 
				
			||||||
 | 
					import {
 | 
				
			||||||
 | 
					  debounceTime,
 | 
				
			||||||
 | 
					  map,
 | 
				
			||||||
 | 
					  merge,
 | 
				
			||||||
 | 
					  Observable,
 | 
				
			||||||
 | 
					  Subject,
 | 
				
			||||||
 | 
					  switchMap,
 | 
				
			||||||
 | 
					  takeUntil,
 | 
				
			||||||
 | 
					} from 'rxjs';
 | 
				
			||||||
 | 
					import { fuseAnimations } from '@fuse/animations';
 | 
				
			||||||
 | 
					import { FuseConfirmationService } from '@fuse/services/confirmation';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import { User } from '../../user/models/user';
 | 
				
			||||||
 | 
					import { PartnerRecommendation } from '../models/partner-recommendation';
 | 
				
			||||||
 | 
					import { PartnerRecommendationPagination } from '../models/partner-recommendation-pagination';
 | 
				
			||||||
 | 
					import { PartnerRecommendationService } from '../services/partner-recommendation.service';
 | 
				
			||||||
 | 
					import { Router } from '@angular/router';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@Component({
 | 
				
			||||||
 | 
					  selector: 'partner-recommendation-list',
 | 
				
			||||||
 | 
					  templateUrl: './list.component.html',
 | 
				
			||||||
 | 
					  styles: [
 | 
				
			||||||
 | 
					    /* language=SCSS */
 | 
				
			||||||
 | 
					    `
 | 
				
			||||||
 | 
					      .inventory-grid {
 | 
				
			||||||
 | 
					        grid-template-columns: 60px auto 40px;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        @screen sm {
 | 
				
			||||||
 | 
					          grid-template-columns: 60px 60px 60px 60px 60px 60px auto 60px;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        @screen md {
 | 
				
			||||||
 | 
					          grid-template-columns: 60px 60px 60px 60px 60px 60px auto 60px 60px;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        @screen lg {
 | 
				
			||||||
 | 
					          grid-template-columns: 60px 70px 70px 70px 70px 100px 60px 60px auto 60px 60px 60px 60px;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    `,
 | 
				
			||||||
 | 
					  ],
 | 
				
			||||||
 | 
					  encapsulation: ViewEncapsulation.None,
 | 
				
			||||||
 | 
					  changeDetection: ChangeDetectionStrategy.OnPush,
 | 
				
			||||||
 | 
					  animations: fuseAnimations,
 | 
				
			||||||
 | 
					})
 | 
				
			||||||
 | 
					export class ListComponent implements OnInit, AfterViewInit, OnDestroy {
 | 
				
			||||||
 | 
					  @ViewChild(MatPaginator) private _paginator!: MatPaginator;
 | 
				
			||||||
 | 
					  @ViewChild(MatSort) private _sort!: MatSort;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  partnerRecommendations$!: Observable<PartnerRecommendation[] | undefined>;
 | 
				
			||||||
 | 
					  users$!: Observable<User[] | undefined>;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  isLoading = false;
 | 
				
			||||||
 | 
					  searchInputControl = new FormControl();
 | 
				
			||||||
 | 
					  selectedPartnerRecommendation?: PartnerRecommendation;
 | 
				
			||||||
 | 
					  pagination?: PartnerRecommendationPagination;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  private _unsubscribeAll: Subject<any> = new Subject<any>();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					   * Constructor
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					  constructor(
 | 
				
			||||||
 | 
					    private _changeDetectorRef: ChangeDetectorRef,
 | 
				
			||||||
 | 
					    private _fuseConfirmationService: FuseConfirmationService,
 | 
				
			||||||
 | 
					    private _formBuilder: FormBuilder,
 | 
				
			||||||
 | 
					    private _partnerRecommendationService: PartnerRecommendationService,
 | 
				
			||||||
 | 
					    private router: Router
 | 
				
			||||||
 | 
					  ) {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // -----------------------------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					  // @ Lifecycle hooks
 | 
				
			||||||
 | 
					  // -----------------------------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					   * On init
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					  ngOnInit(): void {
 | 
				
			||||||
 | 
					    // Get the pagination
 | 
				
			||||||
 | 
					    this._partnerRecommendationService.pagination$
 | 
				
			||||||
 | 
					      .pipe(takeUntil(this._unsubscribeAll))
 | 
				
			||||||
 | 
					      .subscribe((pagination: PartnerRecommendationPagination | undefined) => {
 | 
				
			||||||
 | 
					        // Update the pagination
 | 
				
			||||||
 | 
					        this.pagination = pagination;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Mark for check
 | 
				
			||||||
 | 
					        this._changeDetectorRef.markForCheck();
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Get the products
 | 
				
			||||||
 | 
					    this.partnerRecommendations$ =
 | 
				
			||||||
 | 
					      this._partnerRecommendationService.partnerRecommendations$;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					   * After view init
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					  ngAfterViewInit(): void {
 | 
				
			||||||
 | 
					    if (this._sort && this._paginator) {
 | 
				
			||||||
 | 
					      // Set the initial sort
 | 
				
			||||||
 | 
					      this._sort.sort({
 | 
				
			||||||
 | 
					        id: 'name',
 | 
				
			||||||
 | 
					        start: 'asc',
 | 
				
			||||||
 | 
					        disableClear: true,
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      // Mark for check
 | 
				
			||||||
 | 
					      this._changeDetectorRef.markForCheck();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      // If the partnerRecommendation changes the sort order...
 | 
				
			||||||
 | 
					      this._sort.sortChange
 | 
				
			||||||
 | 
					        .pipe(takeUntil(this._unsubscribeAll))
 | 
				
			||||||
 | 
					        .subscribe(() => {
 | 
				
			||||||
 | 
					          // Reset back to the first page
 | 
				
			||||||
 | 
					          this._paginator.pageIndex = 0;
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      // Get products if sort or page changes
 | 
				
			||||||
 | 
					      merge(this._sort.sortChange, this._paginator.page)
 | 
				
			||||||
 | 
					        .pipe(
 | 
				
			||||||
 | 
					          switchMap(() => {
 | 
				
			||||||
 | 
					            this.isLoading = true;
 | 
				
			||||||
 | 
					            return this._partnerRecommendationService.getPartnerRecommendations(
 | 
				
			||||||
 | 
					              this._paginator.pageIndex,
 | 
				
			||||||
 | 
					              this._paginator.pageSize,
 | 
				
			||||||
 | 
					              this._sort.active,
 | 
				
			||||||
 | 
					              this._sort.direction
 | 
				
			||||||
 | 
					            );
 | 
				
			||||||
 | 
					          }),
 | 
				
			||||||
 | 
					          map(() => {
 | 
				
			||||||
 | 
					            this.isLoading = false;
 | 
				
			||||||
 | 
					          })
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					        .subscribe();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					   * On destroy
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					  ngOnDestroy(): void {
 | 
				
			||||||
 | 
					    // Unsubscribe from all subscriptions
 | 
				
			||||||
 | 
					    this._unsubscribeAll.next(null);
 | 
				
			||||||
 | 
					    this._unsubscribeAll.complete();
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // -----------------------------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					  // @ Public methods
 | 
				
			||||||
 | 
					  // -----------------------------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  viewUserDetail(id: string): void {
 | 
				
			||||||
 | 
					    let url: string = 'member/user/' + id;
 | 
				
			||||||
 | 
					    this.router.navigateByUrl(url);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  // -----------------------------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					  // @ Private methods
 | 
				
			||||||
 | 
					  // -----------------------------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					   * Create product
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					  __createProduct(): void {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					   * Toggle product details
 | 
				
			||||||
 | 
					   *
 | 
				
			||||||
 | 
					   * @param productId
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					  __toggleDetails(productId: string): void {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					   * Track by function for ngFor loops
 | 
				
			||||||
 | 
					   *
 | 
				
			||||||
 | 
					   * @param index
 | 
				
			||||||
 | 
					   * @param item
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					  __trackByFn(index: number, item: any): any {
 | 
				
			||||||
 | 
					    return item.id || index;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -0,0 +1,8 @@
 | 
				
			|||||||
 | 
					export interface PartnerRecommendationPagination {
 | 
				
			||||||
 | 
					  length: number;
 | 
				
			||||||
 | 
					  size: number;
 | 
				
			||||||
 | 
					  page: number;
 | 
				
			||||||
 | 
					  lastPage: number;
 | 
				
			||||||
 | 
					  startIndex: number;
 | 
				
			||||||
 | 
					  endIndex: number;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -0,0 +1,29 @@
 | 
				
			|||||||
 | 
					export interface PartnerRecommendation {
 | 
				
			||||||
 | 
					  id?: string;
 | 
				
			||||||
 | 
					  totalPartnerCount?: number;
 | 
				
			||||||
 | 
					  totalHoldingMoney?: number;
 | 
				
			||||||
 | 
					  totalComp?: number;
 | 
				
			||||||
 | 
					  total?: number;
 | 
				
			||||||
 | 
					  branchCount?: number;
 | 
				
			||||||
 | 
					  divisionCount?: number;
 | 
				
			||||||
 | 
					  officeCount?: number;
 | 
				
			||||||
 | 
					  storeCount?: number;
 | 
				
			||||||
 | 
					  memberCount?: number;
 | 
				
			||||||
 | 
					  nickname?: string;
 | 
				
			||||||
 | 
					  accountHolder?: string;
 | 
				
			||||||
 | 
					  phoneNumber?: string;
 | 
				
			||||||
 | 
					  calculateType?: string;
 | 
				
			||||||
 | 
					  ownCash?: number;
 | 
				
			||||||
 | 
					  ownComp?: number;
 | 
				
			||||||
 | 
					  ownCoupon?: number;
 | 
				
			||||||
 | 
					  gameMoney?: number;
 | 
				
			||||||
 | 
					  todayComp?: number;
 | 
				
			||||||
 | 
					  totalDeposit?: number;
 | 
				
			||||||
 | 
					  totalWithdraw?: number;
 | 
				
			||||||
 | 
					  balance?: number;
 | 
				
			||||||
 | 
					  registDate?: string;
 | 
				
			||||||
 | 
					  finalSigninDate?: string;
 | 
				
			||||||
 | 
					  ip?: string;
 | 
				
			||||||
 | 
					  state?: string;
 | 
				
			||||||
 | 
					  note?: string;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -0,0 +1,50 @@
 | 
				
			|||||||
 | 
					import { NgModule } from '@angular/core';
 | 
				
			||||||
 | 
					import { RouterModule } from '@angular/router';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import { MatButtonModule } from '@angular/material/button';
 | 
				
			||||||
 | 
					import { MatFormFieldModule } from '@angular/material/form-field';
 | 
				
			||||||
 | 
					import { MatIconModule } from '@angular/material/icon';
 | 
				
			||||||
 | 
					import { MatInputModule } from '@angular/material/input';
 | 
				
			||||||
 | 
					import { MatPaginatorModule } from '@angular/material/paginator';
 | 
				
			||||||
 | 
					import { MatProgressBarModule } from '@angular/material/progress-bar';
 | 
				
			||||||
 | 
					import { MatRippleModule } from '@angular/material/core';
 | 
				
			||||||
 | 
					import { MatSortModule } from '@angular/material/sort';
 | 
				
			||||||
 | 
					import { MatSelectModule } from '@angular/material/select';
 | 
				
			||||||
 | 
					import { MatTooltipModule } from '@angular/material/tooltip';
 | 
				
			||||||
 | 
					import { MatGridListModule } from '@angular/material/grid-list';
 | 
				
			||||||
 | 
					import { MatSlideToggleModule } from '@angular/material/slide-toggle';
 | 
				
			||||||
 | 
					import { MatRadioModule } from '@angular/material/radio';
 | 
				
			||||||
 | 
					import { MatCheckboxModule } from '@angular/material/checkbox';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import { TranslocoModule } from '@ngneat/transloco';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import { SharedModule } from 'app/shared/shared.module';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import { COMPONENTS } from './components';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import { partnerRecommendationRoutes } from './partner-recommendation.routing';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@NgModule({
 | 
				
			||||||
 | 
					  declarations: [COMPONENTS],
 | 
				
			||||||
 | 
					  imports: [
 | 
				
			||||||
 | 
					    TranslocoModule,
 | 
				
			||||||
 | 
					    SharedModule,
 | 
				
			||||||
 | 
					    RouterModule.forChild(partnerRecommendationRoutes),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    MatButtonModule,
 | 
				
			||||||
 | 
					    MatFormFieldModule,
 | 
				
			||||||
 | 
					    MatIconModule,
 | 
				
			||||||
 | 
					    MatInputModule,
 | 
				
			||||||
 | 
					    MatPaginatorModule,
 | 
				
			||||||
 | 
					    MatProgressBarModule,
 | 
				
			||||||
 | 
					    MatRippleModule,
 | 
				
			||||||
 | 
					    MatSortModule,
 | 
				
			||||||
 | 
					    MatSelectModule,
 | 
				
			||||||
 | 
					    MatTooltipModule,
 | 
				
			||||||
 | 
					    MatGridListModule,
 | 
				
			||||||
 | 
					    MatSlideToggleModule,
 | 
				
			||||||
 | 
					    MatRadioModule,
 | 
				
			||||||
 | 
					    MatCheckboxModule,
 | 
				
			||||||
 | 
					  ],
 | 
				
			||||||
 | 
					})
 | 
				
			||||||
 | 
					export class PartnerRecommendationModule {}
 | 
				
			||||||
@ -0,0 +1,24 @@
 | 
				
			|||||||
 | 
					import { Route } from '@angular/router';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import { ListComponent } from './components/list.component';
 | 
				
			||||||
 | 
					import { ViewComponent } from '../user/components/view.component';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import { PartnerRecommendationsResolver } from './resolvers/partner-recommendation.resolver';
 | 
				
			||||||
 | 
					import { UserResolver } from '../user/resolvers/user.resolver';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export const partnerRecommendationRoutes: Route[] = [
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    path: '',
 | 
				
			||||||
 | 
					    component: ListComponent,
 | 
				
			||||||
 | 
					    resolve: {
 | 
				
			||||||
 | 
					      partnerRecommendations: PartnerRecommendationsResolver,
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    path: ':id',
 | 
				
			||||||
 | 
					    component: ViewComponent,
 | 
				
			||||||
 | 
					    resolve: {
 | 
				
			||||||
 | 
					      users: UserResolver,
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					];
 | 
				
			||||||
@ -0,0 +1,91 @@
 | 
				
			|||||||
 | 
					import { Injectable } from '@angular/core';
 | 
				
			||||||
 | 
					import {
 | 
				
			||||||
 | 
					  ActivatedRouteSnapshot,
 | 
				
			||||||
 | 
					  Resolve,
 | 
				
			||||||
 | 
					  Router,
 | 
				
			||||||
 | 
					  RouterStateSnapshot,
 | 
				
			||||||
 | 
					} from '@angular/router';
 | 
				
			||||||
 | 
					import { catchError, Observable, throwError } from 'rxjs';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import { PartnerRecommendation } from '../models/partner-recommendation';
 | 
				
			||||||
 | 
					import { PartnerRecommendationPagination } from '../models/partner-recommendation-pagination';
 | 
				
			||||||
 | 
					import { PartnerRecommendationService } from '../services/partner-recommendation.service';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@Injectable({
 | 
				
			||||||
 | 
					  providedIn: 'root',
 | 
				
			||||||
 | 
					})
 | 
				
			||||||
 | 
					export class PartnerRecommendationResolver implements Resolve<any> {
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					   * Constructor
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					  constructor(
 | 
				
			||||||
 | 
					    private _partnerRecommendationService: PartnerRecommendationService,
 | 
				
			||||||
 | 
					    private _router: Router
 | 
				
			||||||
 | 
					  ) {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // -----------------------------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					  // @ Public methods
 | 
				
			||||||
 | 
					  // -----------------------------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					   * Resolver
 | 
				
			||||||
 | 
					   *
 | 
				
			||||||
 | 
					   * @param route
 | 
				
			||||||
 | 
					   * @param state
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					  resolve(
 | 
				
			||||||
 | 
					    route: ActivatedRouteSnapshot,
 | 
				
			||||||
 | 
					    state: RouterStateSnapshot
 | 
				
			||||||
 | 
					  ): Observable<PartnerRecommendation | undefined> {
 | 
				
			||||||
 | 
					    return this._partnerRecommendationService
 | 
				
			||||||
 | 
					      .getPartnerRecommendationById(route.paramMap.get('id'))
 | 
				
			||||||
 | 
					      .pipe(
 | 
				
			||||||
 | 
					        // Error here means the requested product is not available
 | 
				
			||||||
 | 
					        catchError((error) => {
 | 
				
			||||||
 | 
					          // Log the error
 | 
				
			||||||
 | 
					          console.error(error);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          // Get the parent url
 | 
				
			||||||
 | 
					          const parentUrl = state.url.split('/').slice(0, -1).join('/');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          // Navigate to there
 | 
				
			||||||
 | 
					          this._router.navigateByUrl(parentUrl);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          // Throw an error
 | 
				
			||||||
 | 
					          return throwError(error);
 | 
				
			||||||
 | 
					        })
 | 
				
			||||||
 | 
					      );
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@Injectable({
 | 
				
			||||||
 | 
					  providedIn: 'root',
 | 
				
			||||||
 | 
					})
 | 
				
			||||||
 | 
					export class PartnerRecommendationsResolver implements Resolve<any> {
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					   * Constructor
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					  constructor(
 | 
				
			||||||
 | 
					    private _partnerRecommendationService: PartnerRecommendationService
 | 
				
			||||||
 | 
					  ) {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // -----------------------------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					  // @ Public methods
 | 
				
			||||||
 | 
					  // -----------------------------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					   * Resolver
 | 
				
			||||||
 | 
					   *
 | 
				
			||||||
 | 
					   * @param route
 | 
				
			||||||
 | 
					   * @param state
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					  resolve(
 | 
				
			||||||
 | 
					    route: ActivatedRouteSnapshot,
 | 
				
			||||||
 | 
					    state: RouterStateSnapshot
 | 
				
			||||||
 | 
					  ): Observable<{
 | 
				
			||||||
 | 
					    pagination: PartnerRecommendationPagination;
 | 
				
			||||||
 | 
					    partnerRecommendations: PartnerRecommendation[];
 | 
				
			||||||
 | 
					  }> {
 | 
				
			||||||
 | 
					    return this._partnerRecommendationService.getPartnerRecommendations();
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -0,0 +1,168 @@
 | 
				
			|||||||
 | 
					import { Injectable } from '@angular/core';
 | 
				
			||||||
 | 
					import { HttpClient } from '@angular/common/http';
 | 
				
			||||||
 | 
					import {
 | 
				
			||||||
 | 
					  BehaviorSubject,
 | 
				
			||||||
 | 
					  filter,
 | 
				
			||||||
 | 
					  map,
 | 
				
			||||||
 | 
					  Observable,
 | 
				
			||||||
 | 
					  of,
 | 
				
			||||||
 | 
					  switchMap,
 | 
				
			||||||
 | 
					  take,
 | 
				
			||||||
 | 
					  tap,
 | 
				
			||||||
 | 
					  throwError,
 | 
				
			||||||
 | 
					} from 'rxjs';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import { PartnerRecommendation } from '../models/partner-recommendation';
 | 
				
			||||||
 | 
					import { PartnerRecommendationPagination } from '../models/partner-recommendation-pagination';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@Injectable({
 | 
				
			||||||
 | 
					  providedIn: 'root',
 | 
				
			||||||
 | 
					})
 | 
				
			||||||
 | 
					export class PartnerRecommendationService {
 | 
				
			||||||
 | 
					  // Private
 | 
				
			||||||
 | 
					  private __pagination = new BehaviorSubject<
 | 
				
			||||||
 | 
					    PartnerRecommendationPagination | undefined
 | 
				
			||||||
 | 
					  >(undefined);
 | 
				
			||||||
 | 
					  private __partnerRecommendation = new BehaviorSubject<
 | 
				
			||||||
 | 
					    PartnerRecommendation | undefined
 | 
				
			||||||
 | 
					  >(undefined);
 | 
				
			||||||
 | 
					  private __partnerRecommendations = new BehaviorSubject<
 | 
				
			||||||
 | 
					    PartnerRecommendation[] | undefined
 | 
				
			||||||
 | 
					  >(undefined);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					   * Constructor
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					  constructor(private _httpClient: HttpClient) {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // -----------------------------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					  // @ Accessors
 | 
				
			||||||
 | 
					  // -----------------------------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					   * Getter for pagination
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					  get pagination$(): Observable<PartnerRecommendationPagination | undefined> {
 | 
				
			||||||
 | 
					    return this.__pagination.asObservable();
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					   * Getter for partnerRecommendation
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					  get partnerRecommendation$(): Observable<PartnerRecommendation | undefined> {
 | 
				
			||||||
 | 
					    return this.__partnerRecommendation.asObservable();
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					   * Getter for partnerRecommendations
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					  get partnerRecommendations$(): Observable<
 | 
				
			||||||
 | 
					    PartnerRecommendation[] | undefined
 | 
				
			||||||
 | 
					  > {
 | 
				
			||||||
 | 
					    return this.__partnerRecommendations.asObservable();
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // -----------------------------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					  // @ Public methods
 | 
				
			||||||
 | 
					  // -----------------------------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					   * Get partnerRecommendations
 | 
				
			||||||
 | 
					   *
 | 
				
			||||||
 | 
					   *
 | 
				
			||||||
 | 
					   * @param page
 | 
				
			||||||
 | 
					   * @param size
 | 
				
			||||||
 | 
					   * @param sort
 | 
				
			||||||
 | 
					   * @param order
 | 
				
			||||||
 | 
					   * @param search
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					  getPartnerRecommendations(
 | 
				
			||||||
 | 
					    page: number = 0,
 | 
				
			||||||
 | 
					    size: number = 10,
 | 
				
			||||||
 | 
					    sort: string = 'name',
 | 
				
			||||||
 | 
					    order: 'asc' | 'desc' | '' = 'asc',
 | 
				
			||||||
 | 
					    search: string = ''
 | 
				
			||||||
 | 
					  ): Observable<{
 | 
				
			||||||
 | 
					    pagination: PartnerRecommendationPagination;
 | 
				
			||||||
 | 
					    partnerRecommendations: PartnerRecommendation[];
 | 
				
			||||||
 | 
					  }> {
 | 
				
			||||||
 | 
					    return this._httpClient
 | 
				
			||||||
 | 
					      .get<{
 | 
				
			||||||
 | 
					        pagination: PartnerRecommendationPagination;
 | 
				
			||||||
 | 
					        partnerRecommendations: PartnerRecommendation[];
 | 
				
			||||||
 | 
					      }>('api/apps/member/partner-recommendation/partner-recommendations', {
 | 
				
			||||||
 | 
					        params: {
 | 
				
			||||||
 | 
					          page: '' + page,
 | 
				
			||||||
 | 
					          size: '' + size,
 | 
				
			||||||
 | 
					          sort,
 | 
				
			||||||
 | 
					          order,
 | 
				
			||||||
 | 
					          search,
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					      })
 | 
				
			||||||
 | 
					      .pipe(
 | 
				
			||||||
 | 
					        tap((response) => {
 | 
				
			||||||
 | 
					          this.__pagination.next(response.pagination);
 | 
				
			||||||
 | 
					          this.__partnerRecommendations.next(response.partnerRecommendations);
 | 
				
			||||||
 | 
					        })
 | 
				
			||||||
 | 
					      );
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					   * Get product by id
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					  getPartnerRecommendationById(
 | 
				
			||||||
 | 
					    id: string | null
 | 
				
			||||||
 | 
					  ): Observable<PartnerRecommendation> {
 | 
				
			||||||
 | 
					    return this.__partnerRecommendations.pipe(
 | 
				
			||||||
 | 
					      take(1),
 | 
				
			||||||
 | 
					      map((partnerRecommendations) => {
 | 
				
			||||||
 | 
					        // Find the product
 | 
				
			||||||
 | 
					        const partnerRecommendation =
 | 
				
			||||||
 | 
					          partnerRecommendations?.find((item) => item.id === id) || undefined;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Update the product
 | 
				
			||||||
 | 
					        this.__partnerRecommendation.next(partnerRecommendation);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Return the product
 | 
				
			||||||
 | 
					        return partnerRecommendation;
 | 
				
			||||||
 | 
					      }),
 | 
				
			||||||
 | 
					      switchMap((product) => {
 | 
				
			||||||
 | 
					        if (!product) {
 | 
				
			||||||
 | 
					          return throwError('Could not found product with id of ' + id + '!');
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return of(product);
 | 
				
			||||||
 | 
					      })
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					   * Create product
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					  createPartnerRecommendation(): Observable<PartnerRecommendation> {
 | 
				
			||||||
 | 
					    return this.partnerRecommendations$.pipe(
 | 
				
			||||||
 | 
					      take(1),
 | 
				
			||||||
 | 
					      switchMap((partnerRecommendations) =>
 | 
				
			||||||
 | 
					        this._httpClient
 | 
				
			||||||
 | 
					          .post<PartnerRecommendation>(
 | 
				
			||||||
 | 
					            'api/apps/member/partner-recommendation/product',
 | 
				
			||||||
 | 
					            {}
 | 
				
			||||||
 | 
					          )
 | 
				
			||||||
 | 
					          .pipe(
 | 
				
			||||||
 | 
					            map((newPartnerRecommendation) => {
 | 
				
			||||||
 | 
					              // Update the partnerRecommendations with the new product
 | 
				
			||||||
 | 
					              if (!!partnerRecommendations) {
 | 
				
			||||||
 | 
					                this.__partnerRecommendations.next([
 | 
				
			||||||
 | 
					                  newPartnerRecommendation,
 | 
				
			||||||
 | 
					                  ...partnerRecommendations,
 | 
				
			||||||
 | 
					                ]);
 | 
				
			||||||
 | 
					              }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					              // Return the new product
 | 
				
			||||||
 | 
					              return newPartnerRecommendation;
 | 
				
			||||||
 | 
					            })
 | 
				
			||||||
 | 
					          )
 | 
				
			||||||
 | 
					      )
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -0,0 +1,3 @@
 | 
				
			|||||||
 | 
					import { ListComponent } from './list.component';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export const COMPONENTS = [ListComponent];
 | 
				
			||||||
@ -0,0 +1,356 @@
 | 
				
			|||||||
 | 
					<div
 | 
				
			||||||
 | 
					  class="sm:absolute sm:inset-0 flex flex-col flex-auto min-w-0 sm:overflow-hidden bg-card dark:bg-transparent"
 | 
				
			||||||
 | 
					>
 | 
				
			||||||
 | 
					  <!-- Header -->
 | 
				
			||||||
 | 
					  <div
 | 
				
			||||||
 | 
					    class="relative flex flex-col sm:flex-row flex-0 sm:items-center sm:justify-between py-8 px-6 md:px-8 border-b"
 | 
				
			||||||
 | 
					  >
 | 
				
			||||||
 | 
					    <!-- Loader -->
 | 
				
			||||||
 | 
					    <div class="absolute inset-x-0 bottom-0" *ngIf="isLoading">
 | 
				
			||||||
 | 
					      <mat-progress-bar [mode]="'indeterminate'"></mat-progress-bar>
 | 
				
			||||||
 | 
					    </div>
 | 
				
			||||||
 | 
					    <!-- Title -->
 | 
				
			||||||
 | 
					    <div class="text-4xl font-extrabold tracking-tight">매장</div>
 | 
				
			||||||
 | 
					    <!-- Actions -->
 | 
				
			||||||
 | 
					    <div class="flex shrink-0 items-center mt-6 sm:mt-0 sm:ml-4">
 | 
				
			||||||
 | 
					      <!-- Memo -->
 | 
				
			||||||
 | 
					      <!-- <mat-form-field>
 | 
				
			||||||
 | 
					        <ng-container *ngIf="partnerStores$ | async as partnerStores">
 | 
				
			||||||
 | 
					          <ng-container
 | 
				
			||||||
 | 
					            *ngFor="let partnerStore of partnerStores; trackBy: __trackByFn"
 | 
				
			||||||
 | 
					          >
 | 
				
			||||||
 | 
					            <div
 | 
				
			||||||
 | 
					              class="inventory-grid grid items-center gap-4 py-3 px-6 md:px-8 border-b"
 | 
				
			||||||
 | 
					            >
 | 
				
			||||||
 | 
					              <fieldset>
 | 
				
			||||||
 | 
					                총 파트너수:{{ partnerStore.totalPartnerCount }} 총 보유머니:{{
 | 
				
			||||||
 | 
					                  partnerStore.totalHoldingMoney
 | 
				
			||||||
 | 
					                }}
 | 
				
			||||||
 | 
					                총 콤프:{{ partnerStore.totalComp }} 총 합계:{{
 | 
				
			||||||
 | 
					                  partnerStore.total
 | 
				
			||||||
 | 
					                }}
 | 
				
			||||||
 | 
					              </fieldset>
 | 
				
			||||||
 | 
					            </div>
 | 
				
			||||||
 | 
					          </ng-container>
 | 
				
			||||||
 | 
					        </ng-container>
 | 
				
			||||||
 | 
					      </mat-form-field> -->
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      <!-- SelectBox -->
 | 
				
			||||||
 | 
					      <mat-form-field>
 | 
				
			||||||
 | 
					        <mat-select placeholder="리스트수">
 | 
				
			||||||
 | 
					          <mat-option value="40">40</mat-option>
 | 
				
			||||||
 | 
					          <mat-option value="60">60</mat-option>
 | 
				
			||||||
 | 
					          <mat-option value="80">80</mat-option>
 | 
				
			||||||
 | 
					          <mat-option value="100">100</mat-option>
 | 
				
			||||||
 | 
					        </mat-select>
 | 
				
			||||||
 | 
					      </mat-form-field>
 | 
				
			||||||
 | 
					      <mat-form-field>
 | 
				
			||||||
 | 
					        <mat-select placeholder="레벨">
 | 
				
			||||||
 | 
					          <mat-option value="level1">LV.1</mat-option>
 | 
				
			||||||
 | 
					          <mat-option value="level2">LV.2</mat-option>
 | 
				
			||||||
 | 
					          <mat-option value="level3">LV.3</mat-option>
 | 
				
			||||||
 | 
					          <mat-option value="level4">LV.4</mat-option>
 | 
				
			||||||
 | 
					        </mat-select>
 | 
				
			||||||
 | 
					      </mat-form-field>
 | 
				
			||||||
 | 
					      <mat-form-field>
 | 
				
			||||||
 | 
					        <mat-select placeholder="상태">
 | 
				
			||||||
 | 
					          <mat-option value="">정상</mat-option>
 | 
				
			||||||
 | 
					          <mat-option value="">대기</mat-option>
 | 
				
			||||||
 | 
					          <mat-option value="">탈퇴</mat-option>
 | 
				
			||||||
 | 
					          <mat-option value="">휴면</mat-option>
 | 
				
			||||||
 | 
					          <mat-option value="">블랙</mat-option>
 | 
				
			||||||
 | 
					          <mat-option value="">정지</mat-option>
 | 
				
			||||||
 | 
					        </mat-select>
 | 
				
			||||||
 | 
					      </mat-form-field>
 | 
				
			||||||
 | 
					      <mat-form-field>
 | 
				
			||||||
 | 
					        <mat-select placeholder="제한">
 | 
				
			||||||
 | 
					          <mat-option value="">카지노제한</mat-option>
 | 
				
			||||||
 | 
					          <mat-option value="">슬롯제한</mat-option>
 | 
				
			||||||
 | 
					        </mat-select>
 | 
				
			||||||
 | 
					      </mat-form-field>
 | 
				
			||||||
 | 
					      <mat-form-field>
 | 
				
			||||||
 | 
					        <mat-select placeholder="입금">
 | 
				
			||||||
 | 
					          <mat-option value="">계좌입금</mat-option>
 | 
				
			||||||
 | 
					        </mat-select>
 | 
				
			||||||
 | 
					      </mat-form-field>
 | 
				
			||||||
 | 
					      <mat-form-field>
 | 
				
			||||||
 | 
					        <mat-select placeholder="내용">
 | 
				
			||||||
 | 
					          <mat-option value="">카지노콤프</mat-option>
 | 
				
			||||||
 | 
					          <mat-option value="">슬롯콤프</mat-option>
 | 
				
			||||||
 | 
					          <mat-option value="">배팅콤프</mat-option>
 | 
				
			||||||
 | 
					          <mat-option value="">첫충콤프</mat-option>
 | 
				
			||||||
 | 
					        </mat-select>
 | 
				
			||||||
 | 
					      </mat-form-field>
 | 
				
			||||||
 | 
					      <!-- <mat-form-field>
 | 
				
			||||||
 | 
					        <mat-select placeholder="입금">
 | 
				
			||||||
 | 
					          <mat-option value="">계좌입금</mat-option>
 | 
				
			||||||
 | 
					        </mat-select>
 | 
				
			||||||
 | 
					      </mat-form-field>
 | 
				
			||||||
 | 
					      <mat-form-field>
 | 
				
			||||||
 | 
					        <mat-select placeholder="아이디">
 | 
				
			||||||
 | 
					          <mat-option value="">아이디</mat-option>
 | 
				
			||||||
 | 
					          <mat-option value="">닉네임</mat-option>
 | 
				
			||||||
 | 
					          <mat-option value="">이름</mat-option>
 | 
				
			||||||
 | 
					          <mat-option value="">사이트</mat-option>
 | 
				
			||||||
 | 
					          <mat-option value="">파트너수동지급</mat-option>
 | 
				
			||||||
 | 
					        </mat-select>
 | 
				
			||||||
 | 
					      </mat-form-field>
 | 
				
			||||||
 | 
					      <mat-form-field>
 | 
				
			||||||
 | 
					        <mat-select placeholder="가입일 정렬">
 | 
				
			||||||
 | 
					          <mat-option value="">가입일 정렬</mat-option>
 | 
				
			||||||
 | 
					          <mat-option value="">아이디 정렬</mat-option>
 | 
				
			||||||
 | 
					          <mat-option value="">닉네임 정렬</mat-option>
 | 
				
			||||||
 | 
					          <mat-option value="">캐쉬 정렬</mat-option>
 | 
				
			||||||
 | 
					          <mat-option value="">콤프 정렬</mat-option>
 | 
				
			||||||
 | 
					          <mat-option value="">쿠폰 정렬</mat-option>
 | 
				
			||||||
 | 
					          <mat-option value="">입금 정렬</mat-option>
 | 
				
			||||||
 | 
					          <mat-option value="">출금 정렬</mat-option>
 | 
				
			||||||
 | 
					          <mat-option value="">차익 정렬</mat-option>
 | 
				
			||||||
 | 
					        </mat-select>
 | 
				
			||||||
 | 
					      </mat-form-field>
 | 
				
			||||||
 | 
					      <mat-form-field>
 | 
				
			||||||
 | 
					        <mat-select placeholder="내림차순">
 | 
				
			||||||
 | 
					          <mat-option value="">내림차순</mat-option>
 | 
				
			||||||
 | 
					          <mat-option value="">오름차순</mat-option>
 | 
				
			||||||
 | 
					        </mat-select>
 | 
				
			||||||
 | 
					      </mat-form-field> -->
 | 
				
			||||||
 | 
					      <!-- Search -->
 | 
				
			||||||
 | 
					      <mat-form-field
 | 
				
			||||||
 | 
					        class="fuse-mat-dense fuse-mat-no-subscript fuse-mat-rounded min-w-64"
 | 
				
			||||||
 | 
					      >
 | 
				
			||||||
 | 
					        <mat-icon
 | 
				
			||||||
 | 
					          class="icon-size-5"
 | 
				
			||||||
 | 
					          matPrefix
 | 
				
			||||||
 | 
					          [svgIcon]="'heroicons_solid:search'"
 | 
				
			||||||
 | 
					        ></mat-icon>
 | 
				
			||||||
 | 
					        <input
 | 
				
			||||||
 | 
					          matInput
 | 
				
			||||||
 | 
					          [formControl]="searchInputControl"
 | 
				
			||||||
 | 
					          [autocomplete]="'off'"
 | 
				
			||||||
 | 
					          [placeholder]="'Search'"
 | 
				
			||||||
 | 
					        />
 | 
				
			||||||
 | 
					      </mat-form-field>
 | 
				
			||||||
 | 
					      <!-- Add user button -->
 | 
				
			||||||
 | 
					      <button
 | 
				
			||||||
 | 
					        class="ml-4"
 | 
				
			||||||
 | 
					        mat-flat-button
 | 
				
			||||||
 | 
					        [color]="'primary'"
 | 
				
			||||||
 | 
					        (click)="__createProduct()"
 | 
				
			||||||
 | 
					      >
 | 
				
			||||||
 | 
					        <!-- <mat-icon [svgIcon]="'heroicons_outline:plus'"></mat-icon> -->
 | 
				
			||||||
 | 
					        <span class="ml-2 mr-1">검색하기</span>
 | 
				
			||||||
 | 
					      </button>
 | 
				
			||||||
 | 
					      <button>엑셀저장</button>
 | 
				
			||||||
 | 
					      <button>카지노머니확인</button>
 | 
				
			||||||
 | 
					    </div>
 | 
				
			||||||
 | 
					  </div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  <!-- Main -->
 | 
				
			||||||
 | 
					  <div class="flex flex-auto overflow-hidden">
 | 
				
			||||||
 | 
					    <!-- Products list -->
 | 
				
			||||||
 | 
					    <div
 | 
				
			||||||
 | 
					      class="flex flex-col flex-auto sm:mb-18 overflow-hidden sm:overflow-y-auto"
 | 
				
			||||||
 | 
					    >
 | 
				
			||||||
 | 
					      <ng-container *ngIf="partnerStores$ | async as partnerStores">
 | 
				
			||||||
 | 
					        <ng-container *ngIf="partnerStores.length > 0; else noPartnerStore">
 | 
				
			||||||
 | 
					          <div class="grid">
 | 
				
			||||||
 | 
					            <!-- Header -->
 | 
				
			||||||
 | 
					            <div
 | 
				
			||||||
 | 
					              class="inventory-grid z-10 sticky top-0 grid gap-4 py-4 px-6 md:px-8 shadow text-md font-semibold text-secondary bg-gray-50 dark:bg-black dark:bg-opacity-5"
 | 
				
			||||||
 | 
					              matSort
 | 
				
			||||||
 | 
					              matSortDisableClear
 | 
				
			||||||
 | 
					            >
 | 
				
			||||||
 | 
					              <div class="hidden sm:block"><mat-checkbox></mat-checkbox></div>
 | 
				
			||||||
 | 
					              <div class="hidden sm:block">요율</div>
 | 
				
			||||||
 | 
					              <div class="hidden sm:block">상부트리</div>
 | 
				
			||||||
 | 
					              <div class="hidden sm:block">관리</div>
 | 
				
			||||||
 | 
					              <div class="hidden sm:block">매장수</div>
 | 
				
			||||||
 | 
					              <div class="hidden sm:block">회원수</div>
 | 
				
			||||||
 | 
					              <div class="hidden sm:block">아이디</div>
 | 
				
			||||||
 | 
					              <div class="hidden sm:block">닉네임</div>
 | 
				
			||||||
 | 
					              <div class="hidden sm:block">예금주</div>
 | 
				
			||||||
 | 
					              <div class="hidden sm:block">연락처</div>
 | 
				
			||||||
 | 
					              <div class="hidden sm:block">정산</div>
 | 
				
			||||||
 | 
					              <div class="hidden sm:block">보유금</div>
 | 
				
			||||||
 | 
					              <div class="hidden sm:block">게임중머니</div>
 | 
				
			||||||
 | 
					              <div class="hidden sm:block">카지노->캐쉬</div>
 | 
				
			||||||
 | 
					              <div class="hidden sm:block">금일콤프</div>
 | 
				
			||||||
 | 
					              <div class="hidden sm:block">총입출</div>
 | 
				
			||||||
 | 
					              <div class="hidden sm:block">로그</div>
 | 
				
			||||||
 | 
					              <div class="hidden sm:block">상태</div>
 | 
				
			||||||
 | 
					              <div class="hidden sm:block">회원수</div>
 | 
				
			||||||
 | 
					              <div class="hidden sm:block">비고</div>
 | 
				
			||||||
 | 
					            </div>
 | 
				
			||||||
 | 
					            <!-- Rows -->
 | 
				
			||||||
 | 
					            <ng-container *ngIf="partnerStores$ | async as partnerStores">
 | 
				
			||||||
 | 
					              <ng-container
 | 
				
			||||||
 | 
					                *ngFor="let partnerStore of partnerStores; trackBy: __trackByFn"
 | 
				
			||||||
 | 
					              >
 | 
				
			||||||
 | 
					                <div
 | 
				
			||||||
 | 
					                  class="inventory-grid grid items-center gap-4 py-3 px-6 md:px-8 border-b"
 | 
				
			||||||
 | 
					                >
 | 
				
			||||||
 | 
					                  <div class="hidden sm:block truncate">
 | 
				
			||||||
 | 
					                    <mat-checkbox></mat-checkbox>
 | 
				
			||||||
 | 
					                  </div>
 | 
				
			||||||
 | 
					                  <!-- rate -->
 | 
				
			||||||
 | 
					                  <div class="hidden sm:block truncate">
 | 
				
			||||||
 | 
					                    <button
 | 
				
			||||||
 | 
					                      mat-button
 | 
				
			||||||
 | 
					                      color="primary"
 | 
				
			||||||
 | 
					                      matTooltip="요율확인
 | 
				
			||||||
 | 
					                                카지노-바카라: 0%
 | 
				
			||||||
 | 
					                                카지노-룰렛: 0%
 | 
				
			||||||
 | 
					                                카지노-드레곤타이거: 0%
 | 
				
			||||||
 | 
					                                카지노-그외: 0%
 | 
				
			||||||
 | 
					                                슬롯: 0%
 | 
				
			||||||
 | 
					                                카지노루징: 0%
 | 
				
			||||||
 | 
					                                슬롯루징: 0%"
 | 
				
			||||||
 | 
					                    >
 | 
				
			||||||
 | 
					                      요율
 | 
				
			||||||
 | 
					                    </button>
 | 
				
			||||||
 | 
					                    <div class="hidden sm:block truncate">
 | 
				
			||||||
 | 
					                      <!-- 관리 -->
 | 
				
			||||||
 | 
					                      <button mat-flat-button [color]="'primary'">
 | 
				
			||||||
 | 
					                        <mat-form-field>
 | 
				
			||||||
 | 
					                          <mat-select placeholder="관리">
 | 
				
			||||||
 | 
					                            <mat-option value="">보유금지급/회수</mat-option>
 | 
				
			||||||
 | 
					                            <mat-option value="">수수료설정</mat-option>
 | 
				
			||||||
 | 
					                            <mat-option value="">콤프지급/회수</mat-option>
 | 
				
			||||||
 | 
					                            <mat-option value="">쿠폰머니지급/회수</mat-option>
 | 
				
			||||||
 | 
					                            <mat-option value="">쪽지보내기</mat-option>
 | 
				
			||||||
 | 
					                            <mat-option value="">베팅리스트</mat-option>
 | 
				
			||||||
 | 
					                            <mat-option value="">강제로그아웃</mat-option>
 | 
				
			||||||
 | 
					                          </mat-select>
 | 
				
			||||||
 | 
					                        </mat-form-field>
 | 
				
			||||||
 | 
					                      </button>
 | 
				
			||||||
 | 
					                    </div>
 | 
				
			||||||
 | 
					                  </div>
 | 
				
			||||||
 | 
					                  <!-- 매장수 -->
 | 
				
			||||||
 | 
					                  <div class="hidden sm:block truncate">
 | 
				
			||||||
 | 
					                    <button mat-flat-button [color]="'primary'">
 | 
				
			||||||
 | 
					                      {{ partnerStore.branchCount }}
 | 
				
			||||||
 | 
					                    </button>
 | 
				
			||||||
 | 
					                    <button mat-flat-button [color]="'primary'">
 | 
				
			||||||
 | 
					                      {{ partnerStore.divisionCount }}
 | 
				
			||||||
 | 
					                    </button>
 | 
				
			||||||
 | 
					                    <button mat-flat-button [color]="'primary'">
 | 
				
			||||||
 | 
					                      {{ partnerStore.officeCount }}
 | 
				
			||||||
 | 
					                    </button>
 | 
				
			||||||
 | 
					                    <button mat-flat-button [color]="'primary'">
 | 
				
			||||||
 | 
					                      {{ partnerStore.storeCount }}
 | 
				
			||||||
 | 
					                    </button>
 | 
				
			||||||
 | 
					                  </div>
 | 
				
			||||||
 | 
					                  <!-- 회원수 -->
 | 
				
			||||||
 | 
					                  <div class="hidden sm:block truncate">
 | 
				
			||||||
 | 
					                    <button mat-flat-button [color]="'primary'">
 | 
				
			||||||
 | 
					                      {{ partnerStore.memberCount }}
 | 
				
			||||||
 | 
					                    </button>
 | 
				
			||||||
 | 
					                  </div>
 | 
				
			||||||
 | 
					                  <!-- id -->
 | 
				
			||||||
 | 
					                  <ng-container *ngIf="users$ | async as users">
 | 
				
			||||||
 | 
					                    <ng-container
 | 
				
			||||||
 | 
					                      *ngFor="let user of users; trackBy: __trackByFn"
 | 
				
			||||||
 | 
					                    >
 | 
				
			||||||
 | 
					                      <div
 | 
				
			||||||
 | 
					                        class="hidden sm:block truncate"
 | 
				
			||||||
 | 
					                        (click)="viewUserDetail(user.id!)"
 | 
				
			||||||
 | 
					                      >
 | 
				
			||||||
 | 
					                        {{ partnerStore.id }}
 | 
				
			||||||
 | 
					                      </div>
 | 
				
			||||||
 | 
					                    </ng-container>
 | 
				
			||||||
 | 
					                  </ng-container>
 | 
				
			||||||
 | 
					                  <!-- nickname -->
 | 
				
			||||||
 | 
					                  <div class="hidden sm:block truncate">
 | 
				
			||||||
 | 
					                    {{ partnerStore.nickname }}
 | 
				
			||||||
 | 
					                  </div>
 | 
				
			||||||
 | 
					                  <!-- accountHolder -->
 | 
				
			||||||
 | 
					                  <div class="hidden sm:block truncate">
 | 
				
			||||||
 | 
					                    {{ partnerStore.accountHolder }}
 | 
				
			||||||
 | 
					                  </div>
 | 
				
			||||||
 | 
					                  <!-- 연락처 -->
 | 
				
			||||||
 | 
					                  <div class="hidden sm:block truncate">
 | 
				
			||||||
 | 
					                    {{ partnerStore.phoneNumber }}
 | 
				
			||||||
 | 
					                  </div>
 | 
				
			||||||
 | 
					                  <!-- 정산 -->
 | 
				
			||||||
 | 
					                  <div class="hidden sm:block truncate">
 | 
				
			||||||
 | 
					                    {{ partnerStore.calculateType }}
 | 
				
			||||||
 | 
					                  </div>
 | 
				
			||||||
 | 
					                  <!-- 보유금 -->
 | 
				
			||||||
 | 
					                  <div class="hidden sm:block truncate">
 | 
				
			||||||
 | 
					                    캐쉬{{ partnerStore.ownCash }} 콤프{{
 | 
				
			||||||
 | 
					                      partnerStore.ownComp
 | 
				
			||||||
 | 
					                    }}
 | 
				
			||||||
 | 
					                    쿠폰{{ partnerStore.ownCoupon }}
 | 
				
			||||||
 | 
					                  </div>
 | 
				
			||||||
 | 
					                  <!-- gameMoney -->
 | 
				
			||||||
 | 
					                  <div class="hidden sm:block truncate">
 | 
				
			||||||
 | 
					                    {{ partnerStore.gameMoney }}
 | 
				
			||||||
 | 
					                  </div>
 | 
				
			||||||
 | 
					                  <!-- casinoCash -->
 | 
				
			||||||
 | 
					                  <div class="hidden sm:block truncate">
 | 
				
			||||||
 | 
					                    <button mat-flat-button [color]="'primary'">
 | 
				
			||||||
 | 
					                      게임머니확인
 | 
				
			||||||
 | 
					                    </button>
 | 
				
			||||||
 | 
					                    <button mat-flat-button [color]="'primary'">
 | 
				
			||||||
 | 
					                      게임머니회수
 | 
				
			||||||
 | 
					                    </button>
 | 
				
			||||||
 | 
					                  </div>
 | 
				
			||||||
 | 
					                  <!-- todayComp -->
 | 
				
			||||||
 | 
					                  <div class="hidden sm:block truncate">
 | 
				
			||||||
 | 
					                    {{ partnerStore.todayComp }}P
 | 
				
			||||||
 | 
					                  </div>
 | 
				
			||||||
 | 
					                  <!-- 총입출 -->
 | 
				
			||||||
 | 
					                  <div class="hidden sm:block truncate">
 | 
				
			||||||
 | 
					                    입금{{ partnerStore.totalDeposit }} 출금{{
 | 
				
			||||||
 | 
					                      partnerStore.totalWithdraw
 | 
				
			||||||
 | 
					                    }}
 | 
				
			||||||
 | 
					                    차익{{ partnerStore.balance }}
 | 
				
			||||||
 | 
					                  </div>
 | 
				
			||||||
 | 
					                  <!-- log -->
 | 
				
			||||||
 | 
					                  <div class="hidden sm:block truncate">
 | 
				
			||||||
 | 
					                    가입{{ partnerStore.registDate }} 최종{{
 | 
				
			||||||
 | 
					                      partnerStore.finalSigninDate
 | 
				
			||||||
 | 
					                    }}
 | 
				
			||||||
 | 
					                    IP{{ partnerStore.ip }}
 | 
				
			||||||
 | 
					                  </div>
 | 
				
			||||||
 | 
					                  <!-- state -->
 | 
				
			||||||
 | 
					                  <div class="hidden sm:block truncate">
 | 
				
			||||||
 | 
					                    {{ partnerStore.state }}
 | 
				
			||||||
 | 
					                  </div>
 | 
				
			||||||
 | 
					                  <!-- 회원수 -->
 | 
				
			||||||
 | 
					                  <div class="hidden sm:block truncate">
 | 
				
			||||||
 | 
					                    {{ partnerStore.memberCount }}
 | 
				
			||||||
 | 
					                  </div>
 | 
				
			||||||
 | 
					                  <!-- 비고 -->
 | 
				
			||||||
 | 
					                  <div class="hidden sm:block truncate">
 | 
				
			||||||
 | 
					                    <button mat-flat-button [color]="'primary'">
 | 
				
			||||||
 | 
					                      {{ partnerStore.note }}
 | 
				
			||||||
 | 
					                    </button>
 | 
				
			||||||
 | 
					                  </div>
 | 
				
			||||||
 | 
					                </div>
 | 
				
			||||||
 | 
					              </ng-container>
 | 
				
			||||||
 | 
					            </ng-container>
 | 
				
			||||||
 | 
					          </div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          <mat-paginator
 | 
				
			||||||
 | 
					            class="sm:absolute sm:inset-x-0 sm:bottom-0 border-b sm:border-t sm:border-b-0 z-10 bg-gray-50 dark:bg-transparent"
 | 
				
			||||||
 | 
					            [ngClass]="{ 'pointer-events-none': isLoading }"
 | 
				
			||||||
 | 
					            [length]="pagination?.length"
 | 
				
			||||||
 | 
					            [pageIndex]="pagination?.page"
 | 
				
			||||||
 | 
					            [pageSize]="pagination?.size"
 | 
				
			||||||
 | 
					            [pageSizeOptions]="[5, 10, 25, 100]"
 | 
				
			||||||
 | 
					            [showFirstLastButtons]="true"
 | 
				
			||||||
 | 
					          ></mat-paginator>
 | 
				
			||||||
 | 
					        </ng-container>
 | 
				
			||||||
 | 
					      </ng-container>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      <ng-template #noPartnerStore>
 | 
				
			||||||
 | 
					        <div
 | 
				
			||||||
 | 
					          class="p-8 sm:p-16 border-t text-4xl font-semibold tracking-tight text-center"
 | 
				
			||||||
 | 
					        >
 | 
				
			||||||
 | 
					          There are no partner stores!
 | 
				
			||||||
 | 
					        </div>
 | 
				
			||||||
 | 
					      </ng-template>
 | 
				
			||||||
 | 
					    </div>
 | 
				
			||||||
 | 
					  </div>
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
@ -0,0 +1,198 @@
 | 
				
			|||||||
 | 
					import {
 | 
				
			||||||
 | 
					  AfterViewInit,
 | 
				
			||||||
 | 
					  ChangeDetectionStrategy,
 | 
				
			||||||
 | 
					  ChangeDetectorRef,
 | 
				
			||||||
 | 
					  Component,
 | 
				
			||||||
 | 
					  OnDestroy,
 | 
				
			||||||
 | 
					  OnInit,
 | 
				
			||||||
 | 
					  ViewChild,
 | 
				
			||||||
 | 
					  ViewEncapsulation,
 | 
				
			||||||
 | 
					} from '@angular/core';
 | 
				
			||||||
 | 
					import {
 | 
				
			||||||
 | 
					  FormBuilder,
 | 
				
			||||||
 | 
					  FormControl,
 | 
				
			||||||
 | 
					  FormGroup,
 | 
				
			||||||
 | 
					  Validators,
 | 
				
			||||||
 | 
					} from '@angular/forms';
 | 
				
			||||||
 | 
					import { MatCheckboxChange } from '@angular/material/checkbox';
 | 
				
			||||||
 | 
					import { MatPaginator } from '@angular/material/paginator';
 | 
				
			||||||
 | 
					import { MatSort } from '@angular/material/sort';
 | 
				
			||||||
 | 
					import {
 | 
				
			||||||
 | 
					  debounceTime,
 | 
				
			||||||
 | 
					  map,
 | 
				
			||||||
 | 
					  merge,
 | 
				
			||||||
 | 
					  Observable,
 | 
				
			||||||
 | 
					  Subject,
 | 
				
			||||||
 | 
					  switchMap,
 | 
				
			||||||
 | 
					  takeUntil,
 | 
				
			||||||
 | 
					} from 'rxjs';
 | 
				
			||||||
 | 
					import { fuseAnimations } from '@fuse/animations';
 | 
				
			||||||
 | 
					import { FuseConfirmationService } from '@fuse/services/confirmation';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import { User } from '../../user/models/user';
 | 
				
			||||||
 | 
					import { PartnerStore } from '../models/partner-store';
 | 
				
			||||||
 | 
					import { PartnerStorePagination } from '../models/partner-store-pagination';
 | 
				
			||||||
 | 
					import { PartnerStoreService } from '../services/partner-store.service';
 | 
				
			||||||
 | 
					import { Router } from '@angular/router';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@Component({
 | 
				
			||||||
 | 
					  selector: 'partner-store-list',
 | 
				
			||||||
 | 
					  templateUrl: './list.component.html',
 | 
				
			||||||
 | 
					  styles: [
 | 
				
			||||||
 | 
					    /* language=SCSS */
 | 
				
			||||||
 | 
					    `
 | 
				
			||||||
 | 
					      .inventory-grid {
 | 
				
			||||||
 | 
					        grid-template-columns: 60px auto 40px;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        @screen sm {
 | 
				
			||||||
 | 
					          grid-template-columns: 60px 60px 60px 60px 60px 60px auto 60px;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        @screen md {
 | 
				
			||||||
 | 
					          grid-template-columns: 60px 60px 60px 60px 60px 60px auto 60px 60px;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        @screen lg {
 | 
				
			||||||
 | 
					          grid-template-columns: 60px 70px 70px 70px 70px 100px 60px 60px auto 60px 60px 60px 60px;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    `,
 | 
				
			||||||
 | 
					  ],
 | 
				
			||||||
 | 
					  encapsulation: ViewEncapsulation.None,
 | 
				
			||||||
 | 
					  changeDetection: ChangeDetectionStrategy.OnPush,
 | 
				
			||||||
 | 
					  animations: fuseAnimations,
 | 
				
			||||||
 | 
					})
 | 
				
			||||||
 | 
					export class ListComponent implements OnInit, AfterViewInit, OnDestroy {
 | 
				
			||||||
 | 
					  @ViewChild(MatPaginator) private _paginator!: MatPaginator;
 | 
				
			||||||
 | 
					  @ViewChild(MatSort) private _sort!: MatSort;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  partnerStores$!: Observable<PartnerStore[] | undefined>;
 | 
				
			||||||
 | 
					  users$!: Observable<User[] | undefined>;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  isLoading = false;
 | 
				
			||||||
 | 
					  searchInputControl = new FormControl();
 | 
				
			||||||
 | 
					  selectedPartnerStore?: PartnerStore;
 | 
				
			||||||
 | 
					  pagination?: PartnerStorePagination;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  private _unsubscribeAll: Subject<any> = new Subject<any>();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					   * Constructor
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					  constructor(
 | 
				
			||||||
 | 
					    private _changeDetectorRef: ChangeDetectorRef,
 | 
				
			||||||
 | 
					    private _fuseConfirmationService: FuseConfirmationService,
 | 
				
			||||||
 | 
					    private _formBuilder: FormBuilder,
 | 
				
			||||||
 | 
					    private _partnerStoreService: PartnerStoreService,
 | 
				
			||||||
 | 
					    private router: Router
 | 
				
			||||||
 | 
					  ) {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // -----------------------------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					  // @ Lifecycle hooks
 | 
				
			||||||
 | 
					  // -----------------------------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					   * On init
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					  ngOnInit(): void {
 | 
				
			||||||
 | 
					    // Get the pagination
 | 
				
			||||||
 | 
					    this._partnerStoreService.pagination$
 | 
				
			||||||
 | 
					      .pipe(takeUntil(this._unsubscribeAll))
 | 
				
			||||||
 | 
					      .subscribe((pagination: PartnerStorePagination | undefined) => {
 | 
				
			||||||
 | 
					        // Update the pagination
 | 
				
			||||||
 | 
					        this.pagination = pagination;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Mark for check
 | 
				
			||||||
 | 
					        this._changeDetectorRef.markForCheck();
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Get the products
 | 
				
			||||||
 | 
					    this.partnerStores$ = this._partnerStoreService.partnerStores$;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					   * After view init
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					  ngAfterViewInit(): void {
 | 
				
			||||||
 | 
					    if (this._sort && this._paginator) {
 | 
				
			||||||
 | 
					      // Set the initial sort
 | 
				
			||||||
 | 
					      this._sort.sort({
 | 
				
			||||||
 | 
					        id: 'name',
 | 
				
			||||||
 | 
					        start: 'asc',
 | 
				
			||||||
 | 
					        disableClear: true,
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      // Mark for check
 | 
				
			||||||
 | 
					      this._changeDetectorRef.markForCheck();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      // If the partnerStore changes the sort order...
 | 
				
			||||||
 | 
					      this._sort.sortChange
 | 
				
			||||||
 | 
					        .pipe(takeUntil(this._unsubscribeAll))
 | 
				
			||||||
 | 
					        .subscribe(() => {
 | 
				
			||||||
 | 
					          // Reset back to the first page
 | 
				
			||||||
 | 
					          this._paginator.pageIndex = 0;
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      // Get products if sort or page changes
 | 
				
			||||||
 | 
					      merge(this._sort.sortChange, this._paginator.page)
 | 
				
			||||||
 | 
					        .pipe(
 | 
				
			||||||
 | 
					          switchMap(() => {
 | 
				
			||||||
 | 
					            this.isLoading = true;
 | 
				
			||||||
 | 
					            return this._partnerStoreService.getPartnerStores(
 | 
				
			||||||
 | 
					              this._paginator.pageIndex,
 | 
				
			||||||
 | 
					              this._paginator.pageSize,
 | 
				
			||||||
 | 
					              this._sort.active,
 | 
				
			||||||
 | 
					              this._sort.direction
 | 
				
			||||||
 | 
					            );
 | 
				
			||||||
 | 
					          }),
 | 
				
			||||||
 | 
					          map(() => {
 | 
				
			||||||
 | 
					            this.isLoading = false;
 | 
				
			||||||
 | 
					          })
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					        .subscribe();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					   * On destroy
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					  ngOnDestroy(): void {
 | 
				
			||||||
 | 
					    // Unsubscribe from all subscriptions
 | 
				
			||||||
 | 
					    this._unsubscribeAll.next(null);
 | 
				
			||||||
 | 
					    this._unsubscribeAll.complete();
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // -----------------------------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					  // @ Public methods
 | 
				
			||||||
 | 
					  // -----------------------------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  viewUserDetail(id: string): void {
 | 
				
			||||||
 | 
					    let url: string = 'member/user/' + id;
 | 
				
			||||||
 | 
					    this.router.navigateByUrl(url);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  // -----------------------------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					  // @ Private methods
 | 
				
			||||||
 | 
					  // -----------------------------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					   * Create product
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					  __createProduct(): void {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					   * Toggle product details
 | 
				
			||||||
 | 
					   *
 | 
				
			||||||
 | 
					   * @param productId
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					  __toggleDetails(productId: string): void {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					   * Track by function for ngFor loops
 | 
				
			||||||
 | 
					   *
 | 
				
			||||||
 | 
					   * @param index
 | 
				
			||||||
 | 
					   * @param item
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					  __trackByFn(index: number, item: any): any {
 | 
				
			||||||
 | 
					    return item.id || index;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -0,0 +1,8 @@
 | 
				
			|||||||
 | 
					export interface PartnerStorePagination {
 | 
				
			||||||
 | 
					  length: number;
 | 
				
			||||||
 | 
					  size: number;
 | 
				
			||||||
 | 
					  page: number;
 | 
				
			||||||
 | 
					  lastPage: number;
 | 
				
			||||||
 | 
					  startIndex: number;
 | 
				
			||||||
 | 
					  endIndex: number;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -0,0 +1,29 @@
 | 
				
			|||||||
 | 
					export interface PartnerStore {
 | 
				
			||||||
 | 
					  id?: string;
 | 
				
			||||||
 | 
					  totalPartnerCount?: number;
 | 
				
			||||||
 | 
					  totalHoldingMoney?: number;
 | 
				
			||||||
 | 
					  totalComp?: number;
 | 
				
			||||||
 | 
					  total?: number;
 | 
				
			||||||
 | 
					  branchCount?: number;
 | 
				
			||||||
 | 
					  divisionCount?: number;
 | 
				
			||||||
 | 
					  officeCount?: number;
 | 
				
			||||||
 | 
					  storeCount?: number;
 | 
				
			||||||
 | 
					  memberCount?: number;
 | 
				
			||||||
 | 
					  nickname?: string;
 | 
				
			||||||
 | 
					  accountHolder?: string;
 | 
				
			||||||
 | 
					  phoneNumber?: string;
 | 
				
			||||||
 | 
					  calculateType?: string;
 | 
				
			||||||
 | 
					  ownCash?: number;
 | 
				
			||||||
 | 
					  ownComp?: number;
 | 
				
			||||||
 | 
					  ownCoupon?: number;
 | 
				
			||||||
 | 
					  gameMoney?: number;
 | 
				
			||||||
 | 
					  todayComp?: number;
 | 
				
			||||||
 | 
					  totalDeposit?: number;
 | 
				
			||||||
 | 
					  totalWithdraw?: number;
 | 
				
			||||||
 | 
					  balance?: number;
 | 
				
			||||||
 | 
					  registDate?: string;
 | 
				
			||||||
 | 
					  finalSigninDate?: string;
 | 
				
			||||||
 | 
					  ip?: string;
 | 
				
			||||||
 | 
					  state?: string;
 | 
				
			||||||
 | 
					  note?: string;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -0,0 +1,50 @@
 | 
				
			|||||||
 | 
					import { NgModule } from '@angular/core';
 | 
				
			||||||
 | 
					import { RouterModule } from '@angular/router';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import { MatButtonModule } from '@angular/material/button';
 | 
				
			||||||
 | 
					import { MatFormFieldModule } from '@angular/material/form-field';
 | 
				
			||||||
 | 
					import { MatIconModule } from '@angular/material/icon';
 | 
				
			||||||
 | 
					import { MatInputModule } from '@angular/material/input';
 | 
				
			||||||
 | 
					import { MatPaginatorModule } from '@angular/material/paginator';
 | 
				
			||||||
 | 
					import { MatProgressBarModule } from '@angular/material/progress-bar';
 | 
				
			||||||
 | 
					import { MatRippleModule } from '@angular/material/core';
 | 
				
			||||||
 | 
					import { MatSortModule } from '@angular/material/sort';
 | 
				
			||||||
 | 
					import { MatSelectModule } from '@angular/material/select';
 | 
				
			||||||
 | 
					import { MatTooltipModule } from '@angular/material/tooltip';
 | 
				
			||||||
 | 
					import { MatGridListModule } from '@angular/material/grid-list';
 | 
				
			||||||
 | 
					import { MatSlideToggleModule } from '@angular/material/slide-toggle';
 | 
				
			||||||
 | 
					import { MatRadioModule } from '@angular/material/radio';
 | 
				
			||||||
 | 
					import { MatCheckboxModule } from '@angular/material/checkbox';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import { TranslocoModule } from '@ngneat/transloco';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import { SharedModule } from 'app/shared/shared.module';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import { COMPONENTS } from './components';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import { partnerStoreRoutes } from './partner-store.routing';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@NgModule({
 | 
				
			||||||
 | 
					  declarations: [COMPONENTS],
 | 
				
			||||||
 | 
					  imports: [
 | 
				
			||||||
 | 
					    TranslocoModule,
 | 
				
			||||||
 | 
					    SharedModule,
 | 
				
			||||||
 | 
					    RouterModule.forChild(partnerStoreRoutes),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    MatButtonModule,
 | 
				
			||||||
 | 
					    MatFormFieldModule,
 | 
				
			||||||
 | 
					    MatIconModule,
 | 
				
			||||||
 | 
					    MatInputModule,
 | 
				
			||||||
 | 
					    MatPaginatorModule,
 | 
				
			||||||
 | 
					    MatProgressBarModule,
 | 
				
			||||||
 | 
					    MatRippleModule,
 | 
				
			||||||
 | 
					    MatSortModule,
 | 
				
			||||||
 | 
					    MatSelectModule,
 | 
				
			||||||
 | 
					    MatTooltipModule,
 | 
				
			||||||
 | 
					    MatGridListModule,
 | 
				
			||||||
 | 
					    MatSlideToggleModule,
 | 
				
			||||||
 | 
					    MatRadioModule,
 | 
				
			||||||
 | 
					    MatCheckboxModule,
 | 
				
			||||||
 | 
					  ],
 | 
				
			||||||
 | 
					})
 | 
				
			||||||
 | 
					export class PartnerStoreModule {}
 | 
				
			||||||
@ -0,0 +1,24 @@
 | 
				
			|||||||
 | 
					import { Route } from '@angular/router';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import { ListComponent } from './components/list.component';
 | 
				
			||||||
 | 
					import { ViewComponent } from '../user/components/view.component';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import { PartnerStoresResolver } from './resolvers/partner-store.resolver';
 | 
				
			||||||
 | 
					import { UserResolver } from '../user/resolvers/user.resolver';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export const partnerStoreRoutes: Route[] = [
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    path: '',
 | 
				
			||||||
 | 
					    component: ListComponent,
 | 
				
			||||||
 | 
					    resolve: {
 | 
				
			||||||
 | 
					      partnerStores: PartnerStoresResolver,
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    path: ':id',
 | 
				
			||||||
 | 
					    component: ViewComponent,
 | 
				
			||||||
 | 
					    resolve: {
 | 
				
			||||||
 | 
					      users: UserResolver,
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					];
 | 
				
			||||||
@ -0,0 +1,89 @@
 | 
				
			|||||||
 | 
					import { Injectable } from '@angular/core';
 | 
				
			||||||
 | 
					import {
 | 
				
			||||||
 | 
					  ActivatedRouteSnapshot,
 | 
				
			||||||
 | 
					  Resolve,
 | 
				
			||||||
 | 
					  Router,
 | 
				
			||||||
 | 
					  RouterStateSnapshot,
 | 
				
			||||||
 | 
					} from '@angular/router';
 | 
				
			||||||
 | 
					import { catchError, Observable, throwError } from 'rxjs';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import { PartnerStore } from '../models/partner-store';
 | 
				
			||||||
 | 
					import { PartnerStorePagination } from '../models/partner-store-pagination';
 | 
				
			||||||
 | 
					import { PartnerStoreService } from '../services/partner-store.service';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@Injectable({
 | 
				
			||||||
 | 
					  providedIn: 'root',
 | 
				
			||||||
 | 
					})
 | 
				
			||||||
 | 
					export class PartnerStoreResolver implements Resolve<any> {
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					   * Constructor
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					  constructor(
 | 
				
			||||||
 | 
					    private _partnerStoreService: PartnerStoreService,
 | 
				
			||||||
 | 
					    private _router: Router
 | 
				
			||||||
 | 
					  ) {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // -----------------------------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					  // @ Public methods
 | 
				
			||||||
 | 
					  // -----------------------------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					   * Resolver
 | 
				
			||||||
 | 
					   *
 | 
				
			||||||
 | 
					   * @param route
 | 
				
			||||||
 | 
					   * @param state
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					  resolve(
 | 
				
			||||||
 | 
					    route: ActivatedRouteSnapshot,
 | 
				
			||||||
 | 
					    state: RouterStateSnapshot
 | 
				
			||||||
 | 
					  ): Observable<PartnerStore | undefined> {
 | 
				
			||||||
 | 
					    return this._partnerStoreService
 | 
				
			||||||
 | 
					      .getPartnerStoreById(route.paramMap.get('id'))
 | 
				
			||||||
 | 
					      .pipe(
 | 
				
			||||||
 | 
					        // Error here means the requested product is not available
 | 
				
			||||||
 | 
					        catchError((error) => {
 | 
				
			||||||
 | 
					          // Log the error
 | 
				
			||||||
 | 
					          console.error(error);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          // Get the parent url
 | 
				
			||||||
 | 
					          const parentUrl = state.url.split('/').slice(0, -1).join('/');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          // Navigate to there
 | 
				
			||||||
 | 
					          this._router.navigateByUrl(parentUrl);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          // Throw an error
 | 
				
			||||||
 | 
					          return throwError(error);
 | 
				
			||||||
 | 
					        })
 | 
				
			||||||
 | 
					      );
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@Injectable({
 | 
				
			||||||
 | 
					  providedIn: 'root',
 | 
				
			||||||
 | 
					})
 | 
				
			||||||
 | 
					export class PartnerStoresResolver implements Resolve<any> {
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					   * Constructor
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					  constructor(private _partnerStoreService: PartnerStoreService) {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // -----------------------------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					  // @ Public methods
 | 
				
			||||||
 | 
					  // -----------------------------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					   * Resolver
 | 
				
			||||||
 | 
					   *
 | 
				
			||||||
 | 
					   * @param route
 | 
				
			||||||
 | 
					   * @param state
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					  resolve(
 | 
				
			||||||
 | 
					    route: ActivatedRouteSnapshot,
 | 
				
			||||||
 | 
					    state: RouterStateSnapshot
 | 
				
			||||||
 | 
					  ): Observable<{
 | 
				
			||||||
 | 
					    pagination: PartnerStorePagination;
 | 
				
			||||||
 | 
					    partnerStores: PartnerStore[];
 | 
				
			||||||
 | 
					  }> {
 | 
				
			||||||
 | 
					    return this._partnerStoreService.getPartnerStores();
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -0,0 +1,158 @@
 | 
				
			|||||||
 | 
					import { Injectable } from '@angular/core';
 | 
				
			||||||
 | 
					import { HttpClient } from '@angular/common/http';
 | 
				
			||||||
 | 
					import {
 | 
				
			||||||
 | 
					  BehaviorSubject,
 | 
				
			||||||
 | 
					  filter,
 | 
				
			||||||
 | 
					  map,
 | 
				
			||||||
 | 
					  Observable,
 | 
				
			||||||
 | 
					  of,
 | 
				
			||||||
 | 
					  switchMap,
 | 
				
			||||||
 | 
					  take,
 | 
				
			||||||
 | 
					  tap,
 | 
				
			||||||
 | 
					  throwError,
 | 
				
			||||||
 | 
					} from 'rxjs';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import { PartnerStore } from '../models/partner-store';
 | 
				
			||||||
 | 
					import { PartnerStorePagination } from '../models/partner-store-pagination';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@Injectable({
 | 
				
			||||||
 | 
					  providedIn: 'root',
 | 
				
			||||||
 | 
					})
 | 
				
			||||||
 | 
					export class PartnerStoreService {
 | 
				
			||||||
 | 
					  // Private
 | 
				
			||||||
 | 
					  private __pagination = new BehaviorSubject<
 | 
				
			||||||
 | 
					    PartnerStorePagination | undefined
 | 
				
			||||||
 | 
					  >(undefined);
 | 
				
			||||||
 | 
					  private __partnerStore = new BehaviorSubject<PartnerStore | undefined>(
 | 
				
			||||||
 | 
					    undefined
 | 
				
			||||||
 | 
					  );
 | 
				
			||||||
 | 
					  private __partnerStores = new BehaviorSubject<PartnerStore[] | undefined>(
 | 
				
			||||||
 | 
					    undefined
 | 
				
			||||||
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					   * Constructor
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					  constructor(private _httpClient: HttpClient) {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // -----------------------------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					  // @ Accessors
 | 
				
			||||||
 | 
					  // -----------------------------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					   * Getter for pagination
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					  get pagination$(): Observable<PartnerStorePagination | undefined> {
 | 
				
			||||||
 | 
					    return this.__pagination.asObservable();
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					   * Getter for partnerStore
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					  get partnerStore$(): Observable<PartnerStore | undefined> {
 | 
				
			||||||
 | 
					    return this.__partnerStore.asObservable();
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					   * Getter for partnerStores
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					  get partnerStores$(): Observable<PartnerStore[] | undefined> {
 | 
				
			||||||
 | 
					    return this.__partnerStores.asObservable();
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // -----------------------------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					  // @ Public methods
 | 
				
			||||||
 | 
					  // -----------------------------------------------------------------------------------------------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					   * Get partnerStores
 | 
				
			||||||
 | 
					   *
 | 
				
			||||||
 | 
					   *
 | 
				
			||||||
 | 
					   * @param page
 | 
				
			||||||
 | 
					   * @param size
 | 
				
			||||||
 | 
					   * @param sort
 | 
				
			||||||
 | 
					   * @param order
 | 
				
			||||||
 | 
					   * @param search
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					  getPartnerStores(
 | 
				
			||||||
 | 
					    page: number = 0,
 | 
				
			||||||
 | 
					    size: number = 10,
 | 
				
			||||||
 | 
					    sort: string = 'name',
 | 
				
			||||||
 | 
					    order: 'asc' | 'desc' | '' = 'asc',
 | 
				
			||||||
 | 
					    search: string = ''
 | 
				
			||||||
 | 
					  ): Observable<{
 | 
				
			||||||
 | 
					    pagination: PartnerStorePagination;
 | 
				
			||||||
 | 
					    partnerStores: PartnerStore[];
 | 
				
			||||||
 | 
					  }> {
 | 
				
			||||||
 | 
					    return this._httpClient
 | 
				
			||||||
 | 
					      .get<{
 | 
				
			||||||
 | 
					        pagination: PartnerStorePagination;
 | 
				
			||||||
 | 
					        partnerStores: PartnerStore[];
 | 
				
			||||||
 | 
					      }>('api/apps/member/partner-store/partner-stores', {
 | 
				
			||||||
 | 
					        params: {
 | 
				
			||||||
 | 
					          page: '' + page,
 | 
				
			||||||
 | 
					          size: '' + size,
 | 
				
			||||||
 | 
					          sort,
 | 
				
			||||||
 | 
					          order,
 | 
				
			||||||
 | 
					          search,
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					      })
 | 
				
			||||||
 | 
					      .pipe(
 | 
				
			||||||
 | 
					        tap((response) => {
 | 
				
			||||||
 | 
					          this.__pagination.next(response.pagination);
 | 
				
			||||||
 | 
					          this.__partnerStores.next(response.partnerStores);
 | 
				
			||||||
 | 
					        })
 | 
				
			||||||
 | 
					      );
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					   * Get product by id
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					  getPartnerStoreById(id: string | null): Observable<PartnerStore> {
 | 
				
			||||||
 | 
					    return this.__partnerStores.pipe(
 | 
				
			||||||
 | 
					      take(1),
 | 
				
			||||||
 | 
					      map((partnerStores) => {
 | 
				
			||||||
 | 
					        // Find the product
 | 
				
			||||||
 | 
					        const partnerStore =
 | 
				
			||||||
 | 
					          partnerStores?.find((item) => item.id === id) || undefined;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Update the product
 | 
				
			||||||
 | 
					        this.__partnerStore.next(partnerStore);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Return the product
 | 
				
			||||||
 | 
					        return partnerStore;
 | 
				
			||||||
 | 
					      }),
 | 
				
			||||||
 | 
					      switchMap((product) => {
 | 
				
			||||||
 | 
					        if (!product) {
 | 
				
			||||||
 | 
					          return throwError('Could not found product with id of ' + id + '!');
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return of(product);
 | 
				
			||||||
 | 
					      })
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					   * Create product
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					  createPartnerStore(): Observable<PartnerStore> {
 | 
				
			||||||
 | 
					    return this.partnerStores$.pipe(
 | 
				
			||||||
 | 
					      take(1),
 | 
				
			||||||
 | 
					      switchMap((partnerStores) =>
 | 
				
			||||||
 | 
					        this._httpClient
 | 
				
			||||||
 | 
					          .post<PartnerStore>('api/apps/member/partner-store/product', {})
 | 
				
			||||||
 | 
					          .pipe(
 | 
				
			||||||
 | 
					            map((newPartnerStore) => {
 | 
				
			||||||
 | 
					              // Update the partnerStores with the new product
 | 
				
			||||||
 | 
					              if (!!partnerStores) {
 | 
				
			||||||
 | 
					                this.__partnerStores.next([newPartnerStore, ...partnerStores]);
 | 
				
			||||||
 | 
					              }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					              // Return the new product
 | 
				
			||||||
 | 
					              return newPartnerStore;
 | 
				
			||||||
 | 
					            })
 | 
				
			||||||
 | 
					          )
 | 
				
			||||||
 | 
					      )
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -78,24 +78,24 @@
 | 
				
			|||||||
              matSortDisableClear
 | 
					              matSortDisableClear
 | 
				
			||||||
            >
 | 
					            >
 | 
				
			||||||
              <div></div>
 | 
					              <div></div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="''">아이디</div>
 | 
					              <div class="hidden sm:block">아이디</div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="''">매장수</div>
 | 
					              <div class="hidden sm:block">매장수</div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="''">관리</div>
 | 
					              <div class="hidden sm:block">관리</div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="''">요율</div>
 | 
					              <div class="hidden sm:block">요율</div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="''">예금주</div>
 | 
					              <div class="hidden sm:block">예금주</div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="''">연락처</div>
 | 
					              <div class="hidden sm:block">연락처</div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="''">등급</div>
 | 
					              <div class="hidden sm:block">등급</div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="''">정산</div>
 | 
					              <div class="hidden sm:block">정산</div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="''">보유금</div>
 | 
					              <div class="hidden sm:block">보유금</div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="''">로그</div>
 | 
					              <div class="hidden sm:block">로그</div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="''">콤프</div>
 | 
					              <div class="hidden sm:block">콤프</div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="''">쿠폰</div>
 | 
					              <div class="hidden sm:block">쿠폰</div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="''">충전금</div>
 | 
					              <div class="hidden sm:block">충전금</div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="''">환전금</div>
 | 
					              <div class="hidden sm:block">환전금</div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="''">수익금</div>
 | 
					              <div class="hidden sm:block">수익금</div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="''">가입날짜</div>
 | 
					              <div class="hidden sm:block">가입날짜</div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="''">상태</div>
 | 
					              <div class="hidden sm:block">상태</div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="''">비고</div>
 | 
					              <div class="hidden sm:block">비고</div>
 | 
				
			||||||
              <!-- <div class="hidden md:block" [mat-sort-header]="'sku'">SKU</div>
 | 
					              <!-- <div class="hidden md:block" [mat-sort-header]="'sku'">SKU</div>
 | 
				
			||||||
              <div [mat-sort-header]="'name'">Name</div>
 | 
					              <div [mat-sort-header]="'name'">Name</div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="'price'">
 | 
					              <div class="hidden sm:block" [mat-sort-header]="'price'">
 | 
				
			||||||
 | 
				
			|||||||
@ -46,27 +46,15 @@
 | 
				
			|||||||
              <div class="hidden sm:block">예금주</div>
 | 
					              <div class="hidden sm:block">예금주</div>
 | 
				
			||||||
              <div class="hidden sm:block">레벨</div>
 | 
					              <div class="hidden sm:block">레벨</div>
 | 
				
			||||||
              <div class="hidden sm:block">정산종류</div>
 | 
					              <div class="hidden sm:block">정산종류</div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="'contact'">
 | 
					              <div class="hidden sm:block">연락처</div>
 | 
				
			||||||
                연락처
 | 
					              <div class="hidden sm:block">캐쉬</div>
 | 
				
			||||||
              </div>
 | 
					              <div class="hidden sm:block">콤프</div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="'cash'">캐쉬</div>
 | 
					              <div class="hidden sm:block">충전금</div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="'comp'">콤프</div>
 | 
					 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="'charge'">
 | 
					 | 
				
			||||||
                충전금
 | 
					 | 
				
			||||||
              </div>
 | 
					 | 
				
			||||||
              <div class="hidden sm:block">환전금</div>
 | 
					              <div class="hidden sm:block">환전금</div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="'revenue'">
 | 
					              <div class="hidden sm:block">수익금</div>
 | 
				
			||||||
                수익금
 | 
					              <div class="hidden sm:block">가입날짜</div>
 | 
				
			||||||
              </div>
 | 
					              <div class="hidden sm:block">최근접속일</div>
 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="'accession'">
 | 
					              <div class="hidden sm:block">상태</div>
 | 
				
			||||||
                가입날짜
 | 
					 | 
				
			||||||
              </div>
 | 
					 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="'final'">
 | 
					 | 
				
			||||||
                최근접속일
 | 
					 | 
				
			||||||
              </div>
 | 
					 | 
				
			||||||
              <div class="hidden sm:block" [mat-sort-header]="'state'">
 | 
					 | 
				
			||||||
                상태
 | 
					 | 
				
			||||||
              </div>
 | 
					 | 
				
			||||||
              <div class="hidden sm:block">쪽지</div>
 | 
					              <div class="hidden sm:block">쪽지</div>
 | 
				
			||||||
              <div class="hidden sm:block">최상부</div>
 | 
					              <div class="hidden sm:block">최상부</div>
 | 
				
			||||||
              <div class="hidden sm:block">직속</div>
 | 
					              <div class="hidden sm:block">직속</div>
 | 
				
			||||||
 | 
				
			|||||||
@ -11,6 +11,10 @@
 | 
				
			|||||||
  "Partner Branch": "Partner Branch",
 | 
					  "Partner Branch": "Partner Branch",
 | 
				
			||||||
  "Partner Division": "Partner Division",
 | 
					  "Partner Division": "Partner Division",
 | 
				
			||||||
  "Partner Office": "Partner Office",
 | 
					  "Partner Office": "Partner Office",
 | 
				
			||||||
 | 
					  "Partner Store": "Partner Store",
 | 
				
			||||||
 | 
					  "Partner Recommendation": "Partner Recommendation",
 | 
				
			||||||
 | 
					  "Coupon": "Coupon",
 | 
				
			||||||
 | 
					  "Coupon Moneylog": "Coupon Moneylog",
 | 
				
			||||||
  "Analytics": "Analytics",
 | 
					  "Analytics": "Analytics",
 | 
				
			||||||
  "Deposit": "Deposit",
 | 
					  "Deposit": "Deposit",
 | 
				
			||||||
  "Withdraw": "Withdraw",
 | 
					  "Withdraw": "Withdraw",
 | 
				
			||||||
 | 
				
			|||||||
@ -11,6 +11,10 @@
 | 
				
			|||||||
  "Partner Branch": "대본",
 | 
					  "Partner Branch": "대본",
 | 
				
			||||||
  "Partner Division": "부본",
 | 
					  "Partner Division": "부본",
 | 
				
			||||||
  "Partner Office": "총판",
 | 
					  "Partner Office": "총판",
 | 
				
			||||||
 | 
					  "Partner Store": "매장",
 | 
				
			||||||
 | 
					  "Partner Recommendation": "추천코드등록",
 | 
				
			||||||
 | 
					  "Coupon": "쿠폰발행리스트",
 | 
				
			||||||
 | 
					  "Coupon Moneylog": "쿠폰발행머니로그",
 | 
				
			||||||
  "Analytics": "Analytics",
 | 
					  "Analytics": "Analytics",
 | 
				
			||||||
  "Deposit": "입금관리",
 | 
					  "Deposit": "입금관리",
 | 
				
			||||||
  "Withdraw": "출금관리",
 | 
					  "Withdraw": "출금관리",
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user