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' | ||||
|               ).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', | ||||
|         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 { MemberPartnerDivisionMockApi } from './apps/member/partner-division/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 { NavigationMockApi } from 'app/mock-api/common/navigation/api'; | ||||
| import { NotesMockApi } from 'app/mock-api/apps/notes/api'; | ||||
| @ -58,6 +62,10 @@ export const mockApiServices = [ | ||||
|   MemberPartnerBranchMockApi, | ||||
|   MemberPartnerDivisionMockApi, | ||||
|   MemberPartnerOfficeMockApi, | ||||
|   MemberPartnerStoreMockApi, | ||||
|   MemberPartnerRecommendationMockApi, | ||||
|   MemberCouponMockApi, | ||||
|   MemberCouponMoneylogMockApi, | ||||
|   MessagesMockApi, | ||||
|   NavigationMockApi, | ||||
|   NotesMockApi, | ||||
|  | ||||
| @ -85,55 +85,23 @@ | ||||
|               matSortDisableClear | ||||
|             > | ||||
|               <div></div> | ||||
|               <div class="hidden sm:block" [mat-sort-header]="'rank'">등급</div> | ||||
|               <div class="hidden sm:block" [mat-sort-header]="'level'"> | ||||
|                 레벨 | ||||
|               </div> | ||||
|               <div class="hidden sm:block" [mat-sort-header]="'id'">아이디</div> | ||||
|               <div class="hidden sm:block" [mat-sort-header]="'nickname'"> | ||||
|                 닉네임 | ||||
|               </div> | ||||
|               <div class="hidden sm:block" [mat-sort-header]="'paymentDue'"> | ||||
|                 입금예정금액 | ||||
|               </div> | ||||
|               <div class="hidden sm:block" [mat-sort-header]="'calculateType'"> | ||||
|                 정산종류 | ||||
|               </div> | ||||
|               <div class="hidden sm:block" [mat-sort-header]="'accountHolder'"> | ||||
|                 회원정보 | ||||
|               </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 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 md:block" [mat-sort-header]="'sku'">SKU</div> | ||||
|               <div [mat-sort-header]="'name'">Name</div> | ||||
|               <div class="hidden sm:block" [mat-sort-header]="'price'"> | ||||
|  | ||||
| @ -85,43 +85,19 @@ | ||||
|               matSortDisableClear | ||||
|             > | ||||
|               <div></div> | ||||
|               <div class="hidden sm:block" [mat-sort-header]="'rank'">등급</div> | ||||
|               <div class="hidden sm:block" [mat-sort-header]="'id'">아이디</div> | ||||
|               <div class="hidden sm:block" [mat-sort-header]="'nickname'"> | ||||
|                 닉네임 | ||||
|               </div> | ||||
|               <div class="hidden sm:block" [mat-sort-header]="'calculateType'"> | ||||
|                 정산종류 | ||||
|               </div> | ||||
|               <div class="hidden sm:block" [mat-sort-header]="'accountHolder'"> | ||||
|                 회원정보 | ||||
|               </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]="'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 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 md:block" [mat-sort-header]="'sku'">SKU</div> | ||||
|               <div [mat-sort-header]="'name'">Name</div> | ||||
|               <div class="hidden sm:block" [mat-sort-header]="'price'"> | ||||
|  | ||||
| @ -124,32 +124,16 @@ | ||||
|               matSortDisableClear | ||||
|             > | ||||
|               <div></div> | ||||
|               <div class="hidden sm:block" [mat-sort-header]="'highRank'"> | ||||
|                 상위 | ||||
|               </div> | ||||
|               <div class="hidden sm:block" [mat-sort-header]="'userInfo'"> | ||||
|                 유저 | ||||
|               </div> | ||||
|               <div class="hidden sm:block" [mat-sort-header]="'gameInfo'"> | ||||
|                 게임 | ||||
|               </div> | ||||
|               <div class="hidden sm:block" [mat-sort-header]="'form'">형식</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 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 md:block" [mat-sort-header]="'sku'">SKU</div> | ||||
|               <div [mat-sort-header]="'name'">Name</div> | ||||
|               <div class="hidden sm:block" [mat-sort-header]="'price'"> | ||||
|  | ||||
| @ -104,35 +104,17 @@ | ||||
|               matSortDisableClear | ||||
|             > | ||||
|               <div></div> | ||||
|               <div class="hidden sm:block" [mat-sort-header]="'highRank'"> | ||||
|                 상위 | ||||
|               </div> | ||||
|               <div class="hidden sm:block" [mat-sort-header]="'userInfo'"> | ||||
|                 유저 | ||||
|               </div> | ||||
|               <div class="hidden sm:block" [mat-sort-header]="'gameInfo'"> | ||||
|                 게임 | ||||
|               </div> | ||||
|               <div class="hidden sm:block" [mat-sort-header]="'form'">형식</div> | ||||
|               <div class="hidden sm:block" [mat-sort-header]="'money'"> | ||||
|                 금액 | ||||
|               </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 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 md:block" [mat-sort-header]="'sku'">SKU</div> | ||||
|               <div [mat-sort-header]="'name'">Name</div> | ||||
|               <div class="hidden sm:block" [mat-sort-header]="'price'"> | ||||
|  | ||||
| @ -132,38 +132,22 @@ | ||||
|               matSortDisableClear | ||||
|             > | ||||
|               <div></div> | ||||
|               <div class="hidden sm:block" [mat-sort-header]="'index'"> | ||||
|                 번호 | ||||
|               </div> | ||||
|               <div class="hidden sm:block" [mat-sort-header]="'division'"> | ||||
|                 구분 | ||||
|               </div> | ||||
|               <div class="hidden sm:block" [mat-sort-header]="'rank'">등급</div> | ||||
|               <div class="hidden sm:block" [mat-sort-header]="'id'">아이디</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]="'bettingProgress'" | ||||
|               > | ||||
|                 배팅진행내역 | ||||
|               </div> | ||||
|               <div class="hidden sm:block" [mat-sort-header]="'odds'"> | ||||
|                 배당률 | ||||
|               </div> | ||||
|               <div class="hidden sm:block" [mat-sort-header]="'bettingMoney'"> | ||||
|                 배팅액 | ||||
|               </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 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 md:block" [mat-sort-header]="'sku'">SKU</div> | ||||
|               <div [mat-sort-header]="'name'">Name</div> | ||||
|               <div class="hidden sm:block" [mat-sort-header]="'price'"> | ||||
|  | ||||
| @ -134,35 +134,17 @@ | ||||
|               matSortDisableClear | ||||
|             > | ||||
|               <div></div> | ||||
|               <div class="hidden sm:block" [mat-sort-header]="'highRank'"> | ||||
|                 상위 | ||||
|               </div> | ||||
|               <div class="hidden sm:block" [mat-sort-header]="'userInfo'"> | ||||
|                 유저 | ||||
|               </div> | ||||
|               <div class="hidden sm:block" [mat-sort-header]="'gameInfo'"> | ||||
|                 게임 | ||||
|               </div> | ||||
|               <div class="hidden sm:block" [mat-sort-header]="'form'">형식</div> | ||||
|               <div class="hidden sm:block" [mat-sort-header]="'money'"> | ||||
|                 금액 | ||||
|               </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 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 md:block" [mat-sort-header]="'sku'">SKU</div> | ||||
|               <div [mat-sort-header]="'name'">Name</div> | ||||
|               <div class="hidden sm:block" [mat-sort-header]="'price'"> | ||||
|  | ||||
| @ -129,39 +129,19 @@ | ||||
|               matSortDisableClear | ||||
|             > | ||||
|               <div class="hidden sm:block">요율</div> | ||||
|               <div class="hidden sm:block" [mat-sort-header]="'management'"> | ||||
|                 관리 | ||||
|               </div> | ||||
|               <div class="hidden sm:block" [mat-sort-header]="'id'">아이디</div> | ||||
|               <div class="hidden sm:block" [mat-sort-header]="'nickname'"> | ||||
|                 닉네임 | ||||
|               </div> | ||||
|               <div class="hidden sm:block" [mat-sort-header]="'accountHolder'"> | ||||
|                 예금주 | ||||
|               </div> | ||||
|               <div class="hidden sm:block" [mat-sort-header]="'contact'"> | ||||
|                 연락처 | ||||
|               </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 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="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">요율</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 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 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 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 class="hidden sm:block" [mat-sort-header]="''">회원수</div> | ||||
|               <div class="hidden sm:block" [mat-sort-header]="''">비고</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="partnerBranchs$ | async as partnerBranchs"> | ||||
|  | ||||
| @ -164,28 +164,24 @@ | ||||
|             > | ||||
|               <div class="hidden sm:block"><mat-checkbox></mat-checkbox></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 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 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 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 class="hidden sm:block" [mat-sort-header]="''">회원수</div> | ||||
|               <div class="hidden sm:block" [mat-sort-header]="''">비고</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="partnerDivisions$ | async as partnerDivisions"> | ||||
|  | ||||
| @ -164,28 +164,26 @@ | ||||
|             > | ||||
|               <div class="hidden sm:block"><mat-checkbox></mat-checkbox></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 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 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">상부트리</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" [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 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">금일콤프</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 | ||||
|  | ||||
| @ -162,28 +162,24 @@ | ||||
|             > | ||||
|               <div class="hidden sm:block"><mat-checkbox></mat-checkbox></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 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 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 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 class="hidden sm:block" [mat-sort-header]="''">회원수</div> | ||||
|               <div class="hidden sm:block" [mat-sort-header]="''">비고</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="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 | ||||
|             > | ||||
|               <div></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 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 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 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 class="hidden sm:block" [mat-sort-header]="''">상태</div> | ||||
|               <div class="hidden sm:block" [mat-sort-header]="''">비고</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 md:block" [mat-sort-header]="'sku'">SKU</div> | ||||
|               <div [mat-sort-header]="'name'">Name</div> | ||||
|               <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" [mat-sort-header]="'contact'"> | ||||
|                 연락처 | ||||
|               </div> | ||||
|               <div class="hidden sm:block" [mat-sort-header]="'cash'">캐쉬</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">콤프</div> | ||||
|               <div class="hidden sm:block">충전금</div> | ||||
|               <div class="hidden sm:block">환전금</div> | ||||
|               <div class="hidden sm:block" [mat-sort-header]="'revenue'"> | ||||
|                 수익금 | ||||
|               </div> | ||||
|               <div class="hidden sm:block" [mat-sort-header]="'accession'"> | ||||
|                 가입날짜 | ||||
|               </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> | ||||
|               <div class="hidden sm:block">직속</div> | ||||
|  | ||||
| @ -11,6 +11,10 @@ | ||||
|   "Partner Branch": "Partner Branch", | ||||
|   "Partner Division": "Partner Division", | ||||
|   "Partner Office": "Partner Office", | ||||
|   "Partner Store": "Partner Store", | ||||
|   "Partner Recommendation": "Partner Recommendation", | ||||
|   "Coupon": "Coupon", | ||||
|   "Coupon Moneylog": "Coupon Moneylog", | ||||
|   "Analytics": "Analytics", | ||||
|   "Deposit": "Deposit", | ||||
|   "Withdraw": "Withdraw", | ||||
|  | ||||
| @ -11,6 +11,10 @@ | ||||
|   "Partner Branch": "대본", | ||||
|   "Partner Division": "부본", | ||||
|   "Partner Office": "총판", | ||||
|   "Partner Store": "매장", | ||||
|   "Partner Recommendation": "추천코드등록", | ||||
|   "Coupon": "쿠폰발행리스트", | ||||
|   "Coupon Moneylog": "쿠폰발행머니로그", | ||||
|   "Analytics": "Analytics", | ||||
|   "Deposit": "입금관리", | ||||
|   "Withdraw": "출금관리", | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user