MT#11225 monthly lock rework, fraud_use_reseller_rates usage - rework of ngcp-auto-lock sql to use cdr instead of contract_balances - add fraud_use_reseller_rates option usage in ngcp-daily-lock, ngcp-auto-lock calculations - ngcp-daily-lock - locks if limit is equal to sum(cost)

Change-Id: I6740dffd89af0fdc8db0395530aea5f61a5c647e
changes/49/3949/1
Kirill Solomko 10 years ago
parent c845f572d7
commit 4ce2e06d06

@ -29,38 +29,40 @@ my $db = $o->{database};
# However, we select all account hits and manually check them later, as they # However, we select all account hits and manually check them later, as they
# can potentially override billing profile hits. # can potentially override billing profile hits.
my $a = $db->sql_get_all_arrayref(<<"!"); my $a = $db->sql_get_all_arrayref(<<"!");
SELECT 'profile_limit' as type, c.id, p.fraud_interval_lock, p.fraud_interval_notify, SELECT bpinfo.type, bpinfo.id,
b.cash_balance_interval, p.fraud_interval_limit IF (bpinfo.fraud_use_reseller_rates > 0, SUM(cdr.source_reseller_cost),
FROM contracts c, billing_profiles p, contract_balances b, billing_mappings bm, SUM(cdr.source_customer_cost)) as interval_cost,
products pr bpinfo.fraud_interval_limit, bpinfo.fraud_interval_lock, bpinfo.fraud_interval_notify
WHERE bm.id = (SELECT m.id FROM (
FROM billing_mappings m SELECT contracts.id, bp.fraud_use_reseller_rates,
WHERE ( m.start_date IS NULL CASE WHEN cfp.fraud_interval_limit > 0 THEN 'account_limit'
OR m.start_date <= now()) ELSE 'profile_limit' END as type,
AND ( m.end_date IS NULL IF (cfp.fraud_interval_limit > 0, cfp.fraud_interval_limit, bp.fraud_interval_limit) as fraud_interval_limit,
OR m.end_date >= now()) IF (cfp.fraud_interval_limit > 0, cfp.fraud_interval_lock, bp.fraud_interval_lock) as fraud_interval_lock,
AND m.contract_id = c.id IF (cfp.fraud_interval_limit > 0, cfp.fraud_interval_notify, bp.fraud_interval_notify) as fraud_interval_notify
ORDER BY m.start_date desc limit 1) FROM billing.contracts
AND p.id = bm.billing_profile_id JOIN billing.billing_profiles bp
AND pr.id = bm.product_id ON (bp.id =
(SELECT m.billing_profile_id
FROM billing.billing_mappings m
JOIN products pr ON pr.id = m.product_id
WHERE ((m.start_date IS NULL) OR (m.start_date <= NOW()))
AND ((m.end_date IS NULL) OR (m.end_date >= NOW()))
AND (m.contract_id = contracts.id)
AND (pr.class IN ('sipaccount', 'pbxaccount') OR pr.class IS NULL) AND (pr.class IN ('sipaccount', 'pbxaccount') OR pr.class IS NULL)
AND b.contract_id = c.id ORDER BY m.start_date DESC LIMIT 1
AND b.start <= now() )
AND b.end >= now() )
AND c.status = 'active' LEFT JOIN billing.contract_fraud_preferences cfp ON cfp.contract_id = contracts.id
AND p.fraud_interval_limit > 0 WHERE (contracts.status = 'active')
AND (p.fraud_interval_lock AND (cfp.fraud_interval_limit > 0 OR bp.fraud_interval_limit > 0)
OR p.fraud_interval_notify <> '') ) as bpinfo
AND b.cash_balance_interval >= p.fraud_interval_limit JOIN accounting.cdr ON cdr.source_account_id = bpinfo.id
UNION ALL WHERE cdr.start_time BETWEEN UNIX_TIMESTAMP(DATE_FORMAT(NOW(), '%Y-%m-01 00:00:00'))
SELECT 'account_limit' as type, c.id, afp.fraud_interval_lock, afp.fraud_interval_notify, AND UNIX_TIMESTAMP(DATE_FORMAT(NOW() + INTERVAL 1 MONTH, '%Y-%m-01 00:00:00'))-1
b.cash_balance_interval, afp.fraud_interval_limit GROUP BY bpinfo.id
FROM contracts c, contract_fraud_preferences afp, contract_balances b HAVING interval_cost >= fraud_interval_limit
WHERE b.contract_id = c.id AND (fraud_interval_lock > 0 OR fraud_interval_notify <> '')
AND afp.contract_id = c.id
AND b.start <= now()
AND b.end >= now()
AND c.status = 'active'
! !
my $x = {}; my $x = {};
@ -70,7 +72,7 @@ for my $e (@{ $a }) {
# if account limit hits and it has lock and/or notify, mark for action # if account limit hits and it has lock and/or notify, mark for action
if(defined $e->{fraud_interval_limit} and if(defined $e->{fraud_interval_limit} and
int($e->{cash_balance_interval}) >= int($e->{fraud_interval_limit}) and int($e->{interval_cost}) >= int($e->{fraud_interval_limit}) and
($e->{fraud_interval_lock} || $e->{fraud_interval_notify})) { ($e->{fraud_interval_lock} || $e->{fraud_interval_notify})) {
$x->{$e->{id}} = $e; $x->{$e->{id}} = $e;
@ -85,7 +87,7 @@ for my $e (@{ $a }) {
# if account or billing profile limit hits and it has lock and/or notify, # if account or billing profile limit hits and it has lock and/or notify,
# mark for action # mark for action
if(defined $e->{fraud_interval_limit} and if(defined $e->{fraud_interval_limit} and
int($e->{cash_balance_interval}) >= int($e->{fraud_interval_limit}) and int($e->{interval_cost}) >= int($e->{fraud_interval_limit}) and
($e->{fraud_interval_lock} || $e->{fraud_interval_notify})) { ($e->{fraud_interval_lock} || $e->{fraud_interval_notify})) {
$x->{$e->{id}} = $e; $x->{$e->{id}} = $e;
@ -108,7 +110,7 @@ for my $e (values %{ $x }) {
AND s.status != 'terminated' AND s.status != 'terminated'
! !
my $cur = sprintf('%.2f', $e->{cash_balance_interval} / 100); my $cur = sprintf('%.2f', $e->{interval_cost} / 100);
my $max = sprintf('%.2f', $e->{fraud_interval_limit} / 100); my $max = sprintf('%.2f', $e->{fraud_interval_limit} / 100);
my ($subject, $body); my ($subject, $body);

@ -26,10 +26,11 @@ my $db = $o->{database};
my $a = $db->sql_get_all_arrayref(<<"!"); my $a = $db->sql_get_all_arrayref(<<"!");
SELECT bpinfo.type, bpinfo.id, SELECT bpinfo.type, bpinfo.id,
SUM(cdr.source_customer_cost) as daily_cost, IF (bpinfo.fraud_use_reseller_rates > 0, SUM(cdr.source_reseller_cost),
SUM(cdr.source_customer_cost)) as daily_cost,
bpinfo.fraud_daily_limit, bpinfo.fraud_daily_lock, bpinfo.fraud_daily_notify bpinfo.fraud_daily_limit, bpinfo.fraud_daily_lock, bpinfo.fraud_daily_notify
FROM ( FROM (
SELECT contracts.id, SELECT contracts.id, bp.fraud_use_reseller_rates,
CASE WHEN cfp.fraud_daily_limit > 0 THEN 'account_limit' CASE WHEN cfp.fraud_daily_limit > 0 THEN 'account_limit'
ELSE 'profile_limit' END as type, ELSE 'profile_limit' END as type,
IF (cfp.fraud_daily_limit > 0, cfp.fraud_daily_limit, bp.fraud_daily_limit) as fraud_daily_limit, IF (cfp.fraud_daily_limit > 0, cfp.fraud_daily_limit, bp.fraud_daily_limit) as fraud_daily_limit,
@ -54,7 +55,7 @@ JOIN accounting.cdr ON cdr.source_account_id = bpinfo.id
WHERE cdr.start_time BETWEEN UNIX_TIMESTAMP(DATE_FORMAT(NOW(), '%Y-%m-%d 00:00:00')) WHERE cdr.start_time BETWEEN UNIX_TIMESTAMP(DATE_FORMAT(NOW(), '%Y-%m-%d 00:00:00'))
AND UNIX_TIMESTAMP(DATE_FORMAT(NOW(), '%Y-%m-%d 23:59:59')) AND UNIX_TIMESTAMP(DATE_FORMAT(NOW(), '%Y-%m-%d 23:59:59'))
GROUP BY bpinfo.id GROUP BY bpinfo.id
HAVING daily_cost > fraud_daily_limit HAVING daily_cost >= fraud_daily_limit
! !
my $x = {}; my $x = {};

Loading…
Cancel
Save