parent
42b46bc478
commit
76f1799b22
@ -1,4 +1,4 @@
|
||||
import {OrderStatus, Page, PageCode} from "./interface/data";
|
||||
import {OrderStatus, Page, PageCode, lvlPeriod} from "./interface/data";
|
||||
|
||||
export const PageList: Page[] = [
|
||||
{
|
||||
@ -64,4 +64,30 @@ export const orderStatuses: OrderStatus = {
|
||||
'OnWay': 'В пути',
|
||||
'Delivered': 'Выполнен',
|
||||
'Closed': 'Выполнен',
|
||||
};
|
||||
};
|
||||
|
||||
export const lvlPeriods: lvlPeriod[] = [
|
||||
{
|
||||
percent: 3,
|
||||
start: 0,
|
||||
end: 1600,
|
||||
color: '#f2c94c'
|
||||
},
|
||||
{
|
||||
percent: 6,
|
||||
start: 1601,
|
||||
end: 3600,
|
||||
color: '#f2994a'
|
||||
},
|
||||
{
|
||||
percent: 10,
|
||||
start: 3601,
|
||||
end: 8600,
|
||||
color: '#6fcf97'
|
||||
},
|
||||
{
|
||||
percent: 15,
|
||||
start: 8601,
|
||||
color: '#6fcf97'
|
||||
},
|
||||
]
|
||||
@ -1,170 +1,179 @@
|
||||
|
||||
|
||||
export enum PageCode {
|
||||
Auth,
|
||||
Orders,
|
||||
BonusProgram,
|
||||
RefSystem,
|
||||
UserData
|
||||
Auth,
|
||||
Orders,
|
||||
BonusProgram,
|
||||
RefSystem,
|
||||
UserData,
|
||||
}
|
||||
|
||||
|
||||
export interface Page {
|
||||
code: PageCode;
|
||||
component?: any;
|
||||
name: string;
|
||||
description?: string;
|
||||
getMethod?: string;
|
||||
resName?: string;
|
||||
onSideBar: boolean
|
||||
code: PageCode;
|
||||
component?: any;
|
||||
name: string;
|
||||
description?: string;
|
||||
getMethod?: string;
|
||||
resName?: string;
|
||||
onSideBar: boolean;
|
||||
}
|
||||
|
||||
export interface UserDataForm {
|
||||
first_name: string;
|
||||
birthdate: string;
|
||||
gender: string;
|
||||
first_name: string;
|
||||
birthdate: string;
|
||||
gender: string;
|
||||
}
|
||||
|
||||
export interface BonusProgramAccount {
|
||||
BonusProgramName: string;
|
||||
BonusProgramTypeID: string;
|
||||
CardNumber: number;
|
||||
Bonuses: number;
|
||||
HoldedBonuses: number;
|
||||
BonusProgramAccounts: BonusProgramAccount[];
|
||||
DateBonusBurn: string;
|
||||
_links: any[];
|
||||
_embedded: any;
|
||||
BonusProgramName: string;
|
||||
BonusProgramTypeID: string;
|
||||
CardNumber: number;
|
||||
Bonuses: number;
|
||||
HoldedBonuses: number;
|
||||
BonusProgramAccounts: BonusProgramAccount[];
|
||||
DateBonusBurn: string;
|
||||
_links: any[];
|
||||
_embedded: any;
|
||||
}
|
||||
|
||||
export interface Purchase {
|
||||
PurchaseId?: string;
|
||||
CustomerId?: string;
|
||||
PurchaseDate: string;
|
||||
PurchaseState?: number;
|
||||
CardNumber?: number;
|
||||
Address?: string
|
||||
CheckSummary?: number
|
||||
BonusSummary?: number
|
||||
ID: string;
|
||||
Transactions: Transaction[];
|
||||
IsSingleTransaction?: boolean;
|
||||
PurchaseId?: string;
|
||||
CustomerId?: string;
|
||||
PurchaseDate: string;
|
||||
PurchaseState?: number;
|
||||
CardNumber?: number;
|
||||
Address?: string;
|
||||
CheckSummary?: number;
|
||||
BonusSummary?: number;
|
||||
ID: string;
|
||||
Transactions: Transaction[];
|
||||
IsSingleTransaction?: boolean;
|
||||
transactionCreateDate?: string;
|
||||
transactionType?: 'CancelPayFromWallet' | 'PayFromWallet' | 'RefillWallet';
|
||||
transactionSum: number;
|
||||
orderSum?: number;
|
||||
}
|
||||
|
||||
export interface Transaction {
|
||||
User: string;
|
||||
Purchase: string;
|
||||
Date: string;
|
||||
Value: number;
|
||||
TransactionType: number;
|
||||
UserBonusesSnapshot: number;
|
||||
BonusPercent: number;
|
||||
DateActiveBonus: string;
|
||||
AccountBonus: string;
|
||||
Bonus: string;
|
||||
ID:string;
|
||||
HasPurchase?:boolean;
|
||||
User: string;
|
||||
Purchase: string;
|
||||
Date: string;
|
||||
Value: number;
|
||||
TransactionType: number;
|
||||
UserBonusesSnapshot: number;
|
||||
BonusPercent: number;
|
||||
DateActiveBonus: string;
|
||||
AccountBonus: string;
|
||||
Bonus: string;
|
||||
ID: string;
|
||||
HasPurchase?: boolean;
|
||||
}
|
||||
|
||||
export interface OrderStatus{
|
||||
[key: string]: string;
|
||||
export interface OrderStatus {
|
||||
[key: string]: string;
|
||||
}
|
||||
|
||||
export interface lvlPeriod {
|
||||
percent: number;
|
||||
start: number;
|
||||
end?: number;
|
||||
color: string;
|
||||
}
|
||||
|
||||
export interface DeliveryType {
|
||||
cost: number;
|
||||
title: string;
|
||||
id: number;
|
||||
cost: number;
|
||||
title: string;
|
||||
id: number;
|
||||
}
|
||||
|
||||
export interface AcceptedOrder {
|
||||
id: number;
|
||||
status: string;
|
||||
currency_symbol: string;
|
||||
id: number;
|
||||
status: string;
|
||||
currency_symbol: string;
|
||||
total: number;
|
||||
address: {
|
||||
city: string;
|
||||
street: string;
|
||||
house: number;
|
||||
flat: number;
|
||||
};
|
||||
payment_method: string;
|
||||
shipping: {
|
||||
name: string;
|
||||
total: number;
|
||||
address: {
|
||||
city: string;
|
||||
street: string;
|
||||
house: number;
|
||||
flat: number;
|
||||
};
|
||||
payment_method: string;
|
||||
shipping: {
|
||||
name: string;
|
||||
total: number;
|
||||
};
|
||||
date_created: string;
|
||||
items: OrderProduct[]
|
||||
};
|
||||
date_created: string;
|
||||
items: OrderProduct[];
|
||||
}
|
||||
|
||||
export interface Product{
|
||||
id: number;
|
||||
name: string;
|
||||
price: string;
|
||||
image_url: string;
|
||||
image_gallery: string[];
|
||||
category_id: number;
|
||||
description?: string;
|
||||
stock_status: string;
|
||||
currency_symbol: string;
|
||||
modifier_data: Modifier[];
|
||||
short_description?: string;
|
||||
guid?: string;
|
||||
export interface Product {
|
||||
id: number;
|
||||
name: string;
|
||||
price: string;
|
||||
image_url: string;
|
||||
image_gallery: string[];
|
||||
category_id: number;
|
||||
description?: string;
|
||||
stock_status: string;
|
||||
currency_symbol: string;
|
||||
modifier_data: Modifier[];
|
||||
short_description?: string;
|
||||
guid?: string;
|
||||
}
|
||||
|
||||
export interface Modifier{
|
||||
id: number;
|
||||
name: string;
|
||||
category_type: string;
|
||||
minimum_options: number;
|
||||
maximum_options: number;
|
||||
global_categories: string;
|
||||
required: number;
|
||||
options: Option[];
|
||||
allOptions?: Option[];
|
||||
export interface Modifier {
|
||||
id: number;
|
||||
name: string;
|
||||
category_type: string;
|
||||
minimum_options: number;
|
||||
maximum_options: number;
|
||||
global_categories: string;
|
||||
required: number;
|
||||
options: Option[];
|
||||
allOptions?: Option[];
|
||||
}
|
||||
|
||||
export interface Option{
|
||||
id: number;
|
||||
name: string;
|
||||
price: string;
|
||||
prechecked: string;
|
||||
active?: boolean;
|
||||
export interface Option {
|
||||
id: number;
|
||||
name: string;
|
||||
price: string;
|
||||
prechecked: string;
|
||||
active?: boolean;
|
||||
}
|
||||
|
||||
export interface OrderProduct{
|
||||
id: number;
|
||||
amount: number;
|
||||
name: string;
|
||||
price: number;
|
||||
modifiers: {
|
||||
[name: string]: OrderModifier[]
|
||||
}
|
||||
export interface OrderProduct {
|
||||
id: number;
|
||||
amount: number;
|
||||
name: string;
|
||||
price: number;
|
||||
modifiers: {
|
||||
[name: string]: OrderModifier[];
|
||||
};
|
||||
}
|
||||
|
||||
export interface OrderModifier{
|
||||
name: string;
|
||||
id: number;
|
||||
price: number;
|
||||
export interface OrderModifier {
|
||||
name: string;
|
||||
id: number;
|
||||
price: number;
|
||||
}
|
||||
|
||||
export interface DeliveryData {
|
||||
paymentMethod: PaymentMethod;
|
||||
deliveryDate: Date | null;
|
||||
deliveryType: DeliveryType | null;
|
||||
persons: number;
|
||||
comment: string;
|
||||
paymentMethod: PaymentMethod;
|
||||
deliveryDate: Date | null;
|
||||
deliveryType: DeliveryType | null;
|
||||
persons: number;
|
||||
comment: string;
|
||||
}
|
||||
|
||||
export interface PaymentMethod {
|
||||
type: string;
|
||||
label: string;
|
||||
type: string;
|
||||
label: string;
|
||||
}
|
||||
|
||||
export interface UserData {
|
||||
first_name: string | null;
|
||||
last_name: string | null;
|
||||
street: string | null;
|
||||
house: string | null;
|
||||
flat: string | null;
|
||||
city: string;
|
||||
phone: string | null;
|
||||
}
|
||||
first_name: string | null;
|
||||
last_name: string | null;
|
||||
street: string | null;
|
||||
house: string | null;
|
||||
flat: string | null;
|
||||
city: string;
|
||||
phone: string | null;
|
||||
}
|
||||
|
||||
@ -1,162 +1,198 @@
|
||||
<app-navbar title="Карта гостя" (backEvent)="logout()"></app-navbar>
|
||||
|
||||
<ng-container
|
||||
*ngTemplateOutlet="appTpl; context: { user: customerInfo | async }"
|
||||
></ng-container>
|
||||
|
||||
<ng-template #appTpl let-user="user">
|
||||
<div class="guest-card">
|
||||
<div class="guest-card__qr" (click)="qrCodeClick()">
|
||||
<div class="guest-card">
|
||||
<div class="guest-card__qr" (click)="qrCodeClick()">
|
||||
<ng-container *ngIf="customerInfo">
|
||||
<qr-code
|
||||
*ngIf="user; else spinner"
|
||||
[value]="user?.customer_info?.phone.substr(2) || 'Данные не найдены'"
|
||||
[value]="customerInfo?.phone.substr(2) || 'Данные не найдены'"
|
||||
[margin]="0"
|
||||
[size]="qrCodeSize"
|
||||
errorCorrectionLevel="M"
|
||||
></qr-code>
|
||||
</div>
|
||||
<div class="guest-card__user-description">
|
||||
Текущий баланс бонусов:
|
||||
<span *ngIf="user">
|
||||
{{
|
||||
getBalanceAmount(user?.customer_info?.walletBalances)
|
||||
}}
|
||||
бонусов</span
|
||||
>
|
||||
</div>
|
||||
<app-accordion header="Условия начисления бонусов">
|
||||
<p>
|
||||
Расчет начисления бонусов - 10% от суммы покупок за период с
|
||||
11.01.2023г. по 31.03.2023 г.
|
||||
</p>
|
||||
<p>
|
||||
За период с 11.01.2023г. по 31.03.2023 г. сумма ваших покупок составила
|
||||
3700 руб.
|
||||
</p>
|
||||
<p>Начисляемый бонус 10% от суммы покупок</p>
|
||||
</app-accordion>
|
||||
<app-accordion header="Условия «оплаты» покупки бонусами">
|
||||
<p>
|
||||
Участник может использовать Бонусы для «оплаты» до 100% стоимости любой
|
||||
покупки.
|
||||
</p>
|
||||
<p>
|
||||
Списание Бонусов происходит из расчета 1:1 (один Бонус дает скидку 1
|
||||
российский рубль / 1 тенге / 1 белорусский рубль. Скидка,
|
||||
предоставляемая Участнику при списании Бонусов, уменьшает цену товаров в
|
||||
заказе в соответствии с условиями ПЛ.
|
||||
</p>
|
||||
<p>
|
||||
Для списания Бонусов Участник должен попросить об этом в кофе-баре сети
|
||||
«COFFEE LIKE» кассира до момента пробития фискального чека, после чего
|
||||
им будет проверена возможность списания Бонусов.
|
||||
</p>
|
||||
<p>
|
||||
Для всех Участников возможно списание без использования мобильного
|
||||
приложения.
|
||||
</p>
|
||||
<p>Полученные Бонусы не подлежат обмену на денежные средства.</p>
|
||||
</app-accordion>
|
||||
<app-accordion header="Особые условия">
|
||||
<p>
|
||||
Начисленные на счет бонусы сгорают по прошествии 90 дней с момента
|
||||
совершения последней покупки с начислением или списанием бонусов.
|
||||
</p>
|
||||
|
||||
<ul>
|
||||
Возврат покупки, за которую бонусы были начислены:
|
||||
<li>
|
||||
В случае, если бонусов на счету достаточно для списания, бонусы
|
||||
списываются в полном ранее начисленном за возвращаемый товар объеме.
|
||||
</li>
|
||||
<li>
|
||||
В случае, если бонусов на счету недостаточно, формируется минусовой
|
||||
баланс.
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<ul>
|
||||
Возврат покупки, которая была оплачена бонусами:
|
||||
<li>
|
||||
В случае предъявления Участником кассового или товарного чека, сумма
|
||||
бонусов, списанная для оплаты возвращаемого товара, зачисляется на
|
||||
счет участника.
|
||||
</li>
|
||||
<li>
|
||||
В случае возврата товара с применением оплаты бонусами, клиенту
|
||||
возвращается денежная сумма в размере, внесенном Участником в оплату
|
||||
товара при покупке, за вычетом суммы, оплаченной бонусами.
|
||||
</li>
|
||||
</ul>
|
||||
</app-accordion>
|
||||
|
||||
<div class="guest-card__purchases-description">
|
||||
Сумма ваших покупок за период с 01.04.2023г. - <span>1200 руб.</span>
|
||||
</div>
|
||||
<app-accordion header="Узнать % начисляемых бонусов">
|
||||
<p>
|
||||
Начисление Бонусных баллов происходит по дифференцированной шкале в
|
||||
зависимости от уровня:
|
||||
</p>
|
||||
|
||||
<ul>
|
||||
<span style="color: #f2c94c">Уровень 1</span>
|
||||
<li>Сумма покупок за предыдущий период 0-1600 руб.</li>
|
||||
<li>Начисляемый бонус 3% от суммы покупки</li>
|
||||
</ul>
|
||||
<br />
|
||||
<ul>
|
||||
<span style="color: #f2994a">Уровень 2</span>
|
||||
<li>Сумма покупок за предыдущий период 1601-3600 руб.</li>
|
||||
<li>Начисляемый бонус 6% от суммы покупки</li>
|
||||
</ul>
|
||||
<br />
|
||||
<ul>
|
||||
<span style="color: #6fcf97">Уровень 3</span>
|
||||
<li>Сумма покупок за предыдущий период 3601-8600 руб.</li>
|
||||
<li>Начисляемый бонус 10% от суммы покупки</li>
|
||||
</ul>
|
||||
<br />
|
||||
<ul>
|
||||
<span style="color: #6fcf97">Уровень 4</span>
|
||||
<li>Сумма покупок за предыдущий период — от 8601 руб.</li>
|
||||
<li>Начисляемый бонус, в % от суммы покупки - 15%</li>
|
||||
</ul>
|
||||
</app-accordion>
|
||||
|
||||
<div class="guest-card__level-info">
|
||||
<h2>
|
||||
До следующего уровня за период с 01.04.2023 по 30.06.2023г осталось
|
||||
совершить покупки на 401 рублей
|
||||
</h2>
|
||||
<input
|
||||
type="range"
|
||||
[(ngModel)]="discountLevel"
|
||||
[min]="3"
|
||||
[max]="6"
|
||||
[step]="0.1"
|
||||
[ngStyle]="{
|
||||
'background-size': ((discountLevel - 3) / (6 - 3)) * 100 + '% 100%'
|
||||
}"
|
||||
/>
|
||||
|
||||
<p class="show-more">Узнать условия начисления бонусов</p>
|
||||
</div>
|
||||
<hr />
|
||||
<app-last-order></app-last-order>
|
||||
<hr />
|
||||
<app-invite-friends></app-invite-friends>
|
||||
<hr />
|
||||
<div class="guest-card__download-app">
|
||||
<img src="/assets/download-app.svg" alt="Скачай приложение" />
|
||||
</div>
|
||||
<a class="guest-card__loyalty-program" routerLink="loyalty-program"
|
||||
>Подробнее о правилах <br />
|
||||
Программы лояльности</a
|
||||
</ng-container>
|
||||
<ng-container *ngIf="!customerInfo">
|
||||
<ng-container
|
||||
*ngTemplateOutlet="spinner; context: { $implicit: 85 }"
|
||||
></ng-container>
|
||||
</ng-container>
|
||||
</div>
|
||||
<div class="guest-card__user-description">
|
||||
Текущий баланс бонусов:
|
||||
<span *ngIf="customerInfo">
|
||||
{{ getBalanceAmount(customerInfo?.walletBalances) }}
|
||||
бонусов</span
|
||||
>
|
||||
</div>
|
||||
</ng-template>
|
||||
<span id="bonuses-condition"></span>
|
||||
<app-accordion header="Условия начисления бонусов">
|
||||
<p>
|
||||
Расчет начисления бонусов - 10% от суммы покупок за период с 11.01.2023г.
|
||||
по 31.03.2023 г.
|
||||
</p>
|
||||
<p>
|
||||
За период с 11.01.2023г. по 31.03.2023 г. сумма ваших покупок составила
|
||||
3700 руб.
|
||||
</p>
|
||||
<p>Начисляемый бонус 10% от суммы покупок</p>
|
||||
</app-accordion>
|
||||
<app-accordion header="Условия «оплаты» покупки бонусами">
|
||||
<p>
|
||||
Участник может использовать Бонусы для «оплаты» до 100% стоимости любой
|
||||
покупки.
|
||||
</p>
|
||||
<p>
|
||||
Списание Бонусов происходит из расчета 1:1 (один Бонус дает скидку 1
|
||||
российский рубль / 1 тенге / 1 белорусский рубль. Скидка, предоставляемая
|
||||
Участнику при списании Бонусов, уменьшает цену товаров в заказе в
|
||||
соответствии с условиями ПЛ.
|
||||
</p>
|
||||
<p>
|
||||
Для списания Бонусов Участник должен попросить об этом в кофе-баре сети
|
||||
«COFFEE LIKE» кассира до момента пробития фискального чека, после чего им
|
||||
будет проверена возможность списания Бонусов.
|
||||
</p>
|
||||
<p>
|
||||
Для всех Участников возможно списание без использования мобильного
|
||||
приложения.
|
||||
</p>
|
||||
<p>Полученные Бонусы не подлежат обмену на денежные средства.</p>
|
||||
</app-accordion>
|
||||
<app-accordion header="Особые условия">
|
||||
<p>
|
||||
Начисленные на счет бонусы сгорают по прошествии 90 дней с момента
|
||||
совершения последней покупки с начислением или списанием бонусов.
|
||||
</p>
|
||||
|
||||
<ng-template #spinner>
|
||||
<mat-spinner></mat-spinner>
|
||||
<ul>
|
||||
Возврат покупки, за которую бонусы были начислены:
|
||||
<li>
|
||||
В случае, если бонусов на счету достаточно для списания, бонусы
|
||||
списываются в полном ранее начисленном за возвращаемый товар объеме.
|
||||
</li>
|
||||
<li>
|
||||
В случае, если бонусов на счету недостаточно, формируется минусовой
|
||||
баланс.
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<ul>
|
||||
Возврат покупки, которая была оплачена бонусами:
|
||||
<li>
|
||||
В случае предъявления Участником кассового или товарного чека, сумма
|
||||
бонусов, списанная для оплаты возвращаемого товара, зачисляется на счет
|
||||
участника.
|
||||
</li>
|
||||
<li>
|
||||
В случае возврата товара с применением оплаты бонусами, клиенту
|
||||
возвращается денежная сумма в размере, внесенном Участником в оплату
|
||||
товара при покупке, за вычетом суммы, оплаченной бонусами.
|
||||
</li>
|
||||
</ul>
|
||||
</app-accordion>
|
||||
|
||||
<div
|
||||
class="guest-card__purchases-description"
|
||||
[ngStyle]="{
|
||||
display: purchaseData.$loading ? 'grid' : 'block'
|
||||
}"
|
||||
>
|
||||
Сумма ваших покупок за период с
|
||||
{{ purchaseData.currentPeriod[0].format("DD.MM.yyyyг.") }} -
|
||||
<span *ngIf="!purchaseData.$loading"
|
||||
>{{ purchaseData.currentAmount }} руб.</span
|
||||
>
|
||||
<ng-container *ngIf="purchaseData.$loading">
|
||||
<ng-container
|
||||
*ngTemplateOutlet="spinner; context: { $implicit: 24 }"
|
||||
></ng-container>
|
||||
</ng-container>
|
||||
</div>
|
||||
<app-accordion header="Узнать % начисляемых бонусов">
|
||||
<p>
|
||||
Начисление Бонусных баллов происходит по дифференцированной шкале в
|
||||
зависимости от уровня:
|
||||
</p>
|
||||
|
||||
<ng-container
|
||||
*ngFor="let item of lvlPeriods; let index = index; let last = last"
|
||||
>
|
||||
<ng-container *ngIf="!last">
|
||||
<ul>
|
||||
<span [style]="{ color: item.color }">Уровень {{ index + 1 }}</span>
|
||||
<li>
|
||||
Сумма покупок за предыдущий период {{ item.start }}-{{ item.end }}
|
||||
руб.
|
||||
</li>
|
||||
<li>Начисляемый бонус {{ item.percent }}% от суммы покупки</li>
|
||||
</ul>
|
||||
<br />
|
||||
</ng-container>
|
||||
<ng-container *ngIf="last">
|
||||
<ul>
|
||||
<span [style]="{ color: item.color }">Уровень {{ index + 1 }}</span>
|
||||
<li>Сумма покупок за предыдущий период — от {{ item.start }} руб.</li>
|
||||
<li>Начисляемый бонус, в % от суммы покупки - {{ item.percent }}%</li>
|
||||
</ul>
|
||||
</ng-container>
|
||||
</ng-container>
|
||||
</app-accordion>
|
||||
|
||||
<div class="guest-card__level-info">
|
||||
<ng-container *ngIf="!purchaseData.$loading">
|
||||
<ng-container *ngIf="currentLvlPeriod.end">
|
||||
<h2>
|
||||
До следующего уровня за период с
|
||||
{{ purchaseData.currentPeriod[0].format("DD.MM.yyyyг") }} по
|
||||
{{ purchaseData.currentPeriod[1].format("DD.MM.yyyyг") }}
|
||||
осталось совершить покупки на {{ currentLvlPeriod.end - (purchaseData.currentAmount || 0) + 1 }} рублей
|
||||
</h2>
|
||||
<input
|
||||
type="range"
|
||||
[value]="purchaseData.currentAmount"
|
||||
[min]="currentLvlPeriod.start"
|
||||
[max]="currentLvlPeriod.end"
|
||||
[step]="0.01"
|
||||
disabled="true"
|
||||
[ngStyle]="{
|
||||
'background-size': ((purchaseData.currentAmount! - currentLvlPeriod.start) / (currentLvlPeriod.end - currentLvlPeriod.start + 1)) * 100 + '% 100%'
|
||||
}"
|
||||
/>
|
||||
</ng-container>
|
||||
<ng-container *ngIf="!currentLvlPeriod.end">
|
||||
<h2>
|
||||
У Вас последний уровень бонусной программы. Процент начисляемых бонусов: {{currentLvlPeriod.percent}}%
|
||||
</h2>
|
||||
</ng-container>
|
||||
</ng-container>
|
||||
<ng-container *ngIf="purchaseData.$loading">
|
||||
<ng-container
|
||||
*ngTemplateOutlet="spinner; context: { $implicit: 48 }"
|
||||
></ng-container>
|
||||
</ng-container>
|
||||
|
||||
<p class="show-more">
|
||||
<a href="#bonuses-condition">
|
||||
Узнать условия начисления бонусов
|
||||
</a>
|
||||
</p>
|
||||
</div>
|
||||
<hr />
|
||||
<app-last-order
|
||||
[lastOrder]="lastPurchase"
|
||||
[loading]="purchaseData.$loading"
|
||||
></app-last-order>
|
||||
<hr />
|
||||
<app-invite-friends></app-invite-friends>
|
||||
<hr />
|
||||
<div class="guest-card__download-app">
|
||||
<img src="/assets/download-app.svg" alt="Скачай приложение" />
|
||||
</div>
|
||||
<a class="guest-card__loyalty-program" routerLink="loyalty-program"
|
||||
>Подробнее о правилах <br />
|
||||
Программы лояльности</a
|
||||
>
|
||||
</div>
|
||||
|
||||
<ng-template #spinner let-diameter>
|
||||
<mat-spinner [strokeWidth]="3" [diameter]="diameter"></mat-spinner>
|
||||
</ng-template>
|
||||
|
||||
@ -62,6 +62,7 @@
|
||||
font-size: 16px;
|
||||
line-height: 19px;
|
||||
letter-spacing: -0.5px;
|
||||
grid-template-columns: calc(100% - 24px) 24px;
|
||||
|
||||
span {
|
||||
color: #219653;
|
||||
@ -70,6 +71,9 @@
|
||||
|
||||
&__level-info {
|
||||
padding: 36px;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
|
||||
h2 {
|
||||
font-style: normal;
|
||||
@ -152,7 +156,10 @@
|
||||
font-size: 12px;
|
||||
line-height: 16px;
|
||||
text-align: center;
|
||||
color: #28af49;
|
||||
a {
|
||||
text-decoration: none;
|
||||
color: #28af49;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -7,9 +7,21 @@ import { CookiesService } from 'src/app/services/cookies.service';
|
||||
import { WpJsonService } from 'src/app/services/wp-json.service';
|
||||
import { environment } from 'src/environments/environment';
|
||||
import moment from 'moment';
|
||||
import { Purchase, lvlPeriod } from 'src/app/interface/data';
|
||||
import { lvlPeriods } from 'src/app/app.constants';
|
||||
|
||||
interface Moment extends moment.Moment {}
|
||||
|
||||
export interface IPurchaseData {
|
||||
currentPeriod: Moment[];
|
||||
lastPeriod: Moment[];
|
||||
lastPurchases: Purchase[];
|
||||
currentPurchases: Purchase[];
|
||||
lastAmount?: number;
|
||||
currentAmount?: number;
|
||||
$loading: boolean;
|
||||
}
|
||||
|
||||
@Component({
|
||||
selector: 'app-guest-card',
|
||||
templateUrl: './guest-card.component.html',
|
||||
@ -18,10 +30,35 @@ interface Moment extends moment.Moment {}
|
||||
export class GuestCardComponent implements OnInit {
|
||||
public qrCodeSize: number = 85;
|
||||
private isQrCodeClicked: boolean = false;
|
||||
public customerInfo!: Observable<any>;
|
||||
public purchases!: Observable<any>;
|
||||
public customerInfo!: any;
|
||||
public purchases!: Purchase[];
|
||||
public lastPurchase!: Purchase;
|
||||
public purchaseData: IPurchaseData = {
|
||||
currentPeriod: [],
|
||||
lastPeriod: [],
|
||||
lastPurchases: [],
|
||||
currentPurchases: [],
|
||||
$loading: true,
|
||||
get currentAmount():number {
|
||||
// const amount = this.currentPurchases.reduce((accumulator, currentValue) => {
|
||||
// if (currentValue.transactionType !== 'PayFromWallet') return 0;
|
||||
// return accumulator + currentValue.transactionSum;
|
||||
// }, 0);
|
||||
// return amount * -1
|
||||
return 8601
|
||||
},
|
||||
get lastAmount():number {
|
||||
const amount = this.lastPurchases.reduce((accumulator, currentValue) => {
|
||||
if (currentValue.transactionType !== 'PayFromWallet') return 0;
|
||||
return accumulator + currentValue.transactionSum;
|
||||
}, 0);
|
||||
return amount * -1
|
||||
}
|
||||
};
|
||||
|
||||
public discountLevel: number = 4.2;
|
||||
public lvlPeriods: lvlPeriod[] = lvlPeriods;
|
||||
public currentLvlPeriod!: lvlPeriod;
|
||||
|
||||
constructor(
|
||||
private _bottomSheet: MatBottomSheet,
|
||||
@ -32,13 +69,44 @@ export class GuestCardComponent implements OnInit {
|
||||
|
||||
ngOnInit(): void {
|
||||
const token = this.cookiesService.getItem('token');
|
||||
this.customerInfo = this.wpJsonService.getCustomerInfo(
|
||||
environment.systemId,
|
||||
token || '',
|
||||
environment.icardProxy
|
||||
);
|
||||
this.purchases = this.getPurchases();
|
||||
this.purchases.subscribe((value) => console.log(value));
|
||||
this.getCurrentQuarterOfYear();
|
||||
this.wpJsonService
|
||||
.getCustomerInfo(
|
||||
environment.systemId,
|
||||
token || '',
|
||||
environment.icardProxy
|
||||
)
|
||||
.subscribe({
|
||||
next: (value) => {
|
||||
this.customerInfo = value.customer_info;
|
||||
this.getPurchases().subscribe((value) => {
|
||||
this.purchases = value[this.customerInfo?.id].filter(
|
||||
(purchase: Purchase) =>
|
||||
[
|
||||
'PayFromWallet',
|
||||
'CancelPayFromWallet',
|
||||
'RefillWallet',
|
||||
].includes(purchase.transactionType || '')
|
||||
);
|
||||
this.lastPurchase = value[this.customerInfo?.id].filter(
|
||||
(purchase: Purchase) =>
|
||||
[
|
||||
'PayFromWallet',
|
||||
].includes(purchase.transactionType || '')
|
||||
)[0]
|
||||
|
||||
this.purchaseData.lastPurchases = this.purchases.filter((value: Purchase) => {
|
||||
return moment(value.transactionCreateDate).isBetween(this.purchaseData.lastPeriod[0], this.purchaseData.lastPeriod[1])
|
||||
})
|
||||
this.purchaseData.currentPurchases = this.purchases.filter((value: Purchase) => {
|
||||
return moment(value.transactionCreateDate).isBetween(this.purchaseData.currentPeriod[0], this.purchaseData.currentPeriod[1])
|
||||
})
|
||||
const currentAmount = this.purchaseData.currentAmount || 0
|
||||
this.currentLvlPeriod = this.lvlPeriods.find((item) => item.start <= currentAmount && currentAmount <= (item.end || Infinity))!
|
||||
this.purchaseData.$loading = false;
|
||||
});
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
qrCodeClick() {
|
||||
@ -63,26 +131,50 @@ export class GuestCardComponent implements OnInit {
|
||||
}
|
||||
|
||||
getPurchases(
|
||||
start: Date | Moment = moment().startOf('month'),
|
||||
start: Date | Moment = moment().subtract(1, 'months').startOf('month'),
|
||||
end: Date | Moment = moment()
|
||||
): Observable<any> {
|
||||
const token = this.cookiesService.getItem('token');
|
||||
const delta = moment(end).diff(moment(start), 'days');
|
||||
return this.wpJsonService.getTransactionsInfo(
|
||||
return this.wpJsonService.getTransactions(
|
||||
environment.systemId,
|
||||
token ?? '',
|
||||
environment.icardProxy
|
||||
);
|
||||
}
|
||||
|
||||
getCurrentQuarterOfYear() {
|
||||
const quarters = [
|
||||
[
|
||||
moment().subtract(1, 'years').endOf('year').subtract(3, 'months'),
|
||||
moment().subtract(1, 'years').endOf('year'),
|
||||
],
|
||||
[moment().startOf('year'), moment().startOf('year').add(3, 'months')],
|
||||
[
|
||||
moment().startOf('year').add(3, 'months'),
|
||||
moment().startOf('year').add(6, 'months'),
|
||||
],
|
||||
[
|
||||
moment().startOf('year').add(6, 'months'),
|
||||
moment().startOf('year').add(9, 'months'),
|
||||
],
|
||||
[
|
||||
moment().startOf('year').add(9, 'months'),
|
||||
moment().startOf('year').add(12, 'months'),
|
||||
],
|
||||
];
|
||||
|
||||
for (let i = 0; i < 4; i++) {
|
||||
if (moment().isBetween(quarters[i][0], quarters[i][1])) {
|
||||
this.purchaseData.lastPeriod = quarters[i - 1];
|
||||
this.purchaseData.currentPeriod = quarters[i];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
getBalanceAmount(loyaltyPrograms: any[]) {
|
||||
console.log(loyaltyPrograms);
|
||||
|
||||
return loyaltyPrograms.reduce(
|
||||
(accumulator, currentValue) => {
|
||||
return accumulator + currentValue.balance
|
||||
},
|
||||
0
|
||||
);
|
||||
return loyaltyPrograms.reduce((accumulator, currentValue) => {
|
||||
return accumulator + currentValue.balance;
|
||||
}, 0);
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user