Lead Radar: исходный код
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
commit
9749da5ae7
201 files changed
+97685
No files matched your search
@@ -0,0 +1,51 @@
|
||||
import { expectedCommission, toUsd, type CommissionKey, type CommissionRule, type CommissionSettings, type Currency } from '@lr/shared';
|
||||
|
||||
/**
|
||||
* Комиссия для карточки: условие (своё или из настроек компании) и ожидаемая сумма.
|
||||
* `custom` — агент поменял условие в этой карточке.
|
||||
*/
|
||||
export function commissionView(
|
||||
settings: CommissionSettings | undefined,
|
||||
key: CommissionKey,
|
||||
own: CommissionRule | null,
|
||||
price: number | null | undefined,
|
||||
currency: string | null | undefined,
|
||||
) {
|
||||
const rule = own ?? settings?.[key] ?? null;
|
||||
return { rule, custom: Boolean(own), expected: expectedCommission(rule, price, currency as Currency | null) };
|
||||
}
|
||||
|
||||
/** Условие в записи истории: «percent:2.5», «fixed:1000:USD», «mixed:200:USD:2»; null — как в настройках компании. */
|
||||
export const ruleCode = (rule: CommissionRule | null | undefined): string | null =>
|
||||
!rule
|
||||
? null
|
||||
: rule.mode === 'percent'
|
||||
? `percent:${rule.value}`
|
||||
: rule.mode === 'fixed'
|
||||
? `fixed:${rule.value}:${rule.currency}`
|
||||
: `mixed:${rule.fixed ?? 0}:${rule.currency}:${rule.value}`;
|
||||
|
||||
/**
|
||||
* На сколько процентов изменилась ожидаемая сумма комиссии: 50 % → 35 % от той же цены — это −30 %.
|
||||
* Если цены нет, но оба условия — проценты, считаем по самим процентам. null — сравнить нечего.
|
||||
*/
|
||||
export function commissionDelta(
|
||||
before: CommissionRule | null | undefined,
|
||||
after: CommissionRule | null | undefined,
|
||||
price: number | null | undefined,
|
||||
currency: string | null | undefined,
|
||||
): number | null {
|
||||
const a = expectedCommission(before, price, currency as Currency | null);
|
||||
const b = expectedCommission(after, price, currency as Currency | null);
|
||||
let from: number | null = a ? toUsd(a.amount, a.currency) : null;
|
||||
let to: number | null = b ? toUsd(b.amount, b.currency) : null;
|
||||
if ((from === null || to === null) && before?.mode === 'percent' && after?.mode === 'percent') {
|
||||
from = before.value;
|
||||
to = after.value;
|
||||
}
|
||||
if (from === null || to === null || !(from > 0)) return null;
|
||||
return Math.round(((to - from) / from) * 1000) / 10;
|
||||
}
|
||||
|
||||
/** Поле text записи истории: «<условие компании при сбросе>|<изменение суммы в процентах>». */
|
||||
export const commissionNote = (settingsCode: string | null, delta: number | null) => `${settingsCode ?? ''}|${delta ?? ''}`;
|
||||
Reference in new issue
Block a user