Change-Id: I77ab4698fade8e9af15db63fc143a5063727dd2achanges/97/4997/4
parent
84a4f74423
commit
50e273c2ab
@ -0,0 +1,150 @@
|
|||||||
|
package NGCP::Schema::Result::contract_fraud_events;
|
||||||
|
use Scalar::Util qw(blessed);
|
||||||
|
use base qw/DBIx::Class::Core/;
|
||||||
|
|
||||||
|
our $VERSION = '2.007';
|
||||||
|
|
||||||
|
__PACKAGE__->load_components(
|
||||||
|
"InflateColumn::DateTime",
|
||||||
|
"Helper::Row::ToJSON",
|
||||||
|
"+NGCP::Schema::InflateColumn::DateTime::EpochMicro",
|
||||||
|
);
|
||||||
|
__PACKAGE__->table_class('DBIx::Class::ResultSource::View');
|
||||||
|
__PACKAGE__->table("contract_fraud_events");
|
||||||
|
|
||||||
|
|
||||||
|
__PACKAGE__->add_columns(
|
||||||
|
"id",
|
||||||
|
{
|
||||||
|
data_type => "integer",
|
||||||
|
extra => { unsigned => 1 },
|
||||||
|
is_nullable => 0,
|
||||||
|
},
|
||||||
|
"reseller_id",
|
||||||
|
{
|
||||||
|
data_type => "integer",
|
||||||
|
extra => { unsigned => 1 },
|
||||||
|
is_nullable => 0,
|
||||||
|
},
|
||||||
|
"interval",
|
||||||
|
{
|
||||||
|
data_type => "varchar",
|
||||||
|
size => 64,
|
||||||
|
is_nullable => 0,
|
||||||
|
},
|
||||||
|
"type",
|
||||||
|
{
|
||||||
|
data_type => "varchar",
|
||||||
|
size => 64,
|
||||||
|
is_nullable => 0,
|
||||||
|
},
|
||||||
|
"interval_cost",
|
||||||
|
{
|
||||||
|
data_type => "decimal",
|
||||||
|
size => [14,6],
|
||||||
|
default_value => 0,
|
||||||
|
is_nullable => 0,
|
||||||
|
},
|
||||||
|
"interval_limit",
|
||||||
|
{
|
||||||
|
data_type => "decimal",
|
||||||
|
size => [14,6],
|
||||||
|
default_value => 0,
|
||||||
|
is_nullable => 0,
|
||||||
|
},
|
||||||
|
"interval_lock",
|
||||||
|
{
|
||||||
|
data_type => "tinyint",
|
||||||
|
is_nullable => 1,
|
||||||
|
extra => { unsigned => 1 },
|
||||||
|
},
|
||||||
|
"interval_notify",
|
||||||
|
{
|
||||||
|
data_type => "varchar",
|
||||||
|
size => 255,
|
||||||
|
is_nullable => 1,
|
||||||
|
},
|
||||||
|
"use_reseller_rates",
|
||||||
|
{
|
||||||
|
data_type => "tinyint",
|
||||||
|
is_nullable => 0,
|
||||||
|
extra => { unsigned => 1 },
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
__PACKAGE__->set_primary_key("id");
|
||||||
|
|
||||||
|
sub TO_JSON {
|
||||||
|
my ($self) = @_;
|
||||||
|
return {
|
||||||
|
map { blessed($_) && $_->isa('DateTime') ? $_->datetime : $_ } %{ $self->next::method }
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
__PACKAGE__->result_source_instance->is_virtual(1);
|
||||||
|
|
||||||
|
__PACKAGE__->result_source_instance->view_definition("
|
||||||
|
SELECT bpinfo.id, bpinfo.reseller_id, bpinfo.interval, bpinfo.type,
|
||||||
|
IF (bpinfo.fraud_use_reseller_rates > 0, SUM(cdr.source_reseller_cost),
|
||||||
|
SUM(cdr.source_customer_cost)) as interval_cost,
|
||||||
|
bpinfo.interval_limit,
|
||||||
|
bpinfo.interval_lock,
|
||||||
|
bpinfo.interval_notify,
|
||||||
|
bpinfo.fraud_use_reseller_rates as use_reseller_rates
|
||||||
|
FROM (
|
||||||
|
SELECT c.id, n.reseller_id, bp.fraud_use_reseller_rates, i.interval,
|
||||||
|
IF (i.interval = 'month',
|
||||||
|
IF (cfp.fraud_interval_limit > 0,
|
||||||
|
'account_limit', 'profile_limit'),
|
||||||
|
IF (cfp.fraud_daily_limit > 0,
|
||||||
|
'account_limit', 'profile_limit')
|
||||||
|
) AS type,
|
||||||
|
IF (i.interval = 'month',
|
||||||
|
IF (cfp.fraud_interval_limit > 0,
|
||||||
|
cfp.fraud_interval_limit, bp.fraud_interval_limit),
|
||||||
|
IF (cfp.fraud_daily_limit > 0,
|
||||||
|
cfp.fraud_daily_limit, bp.fraud_daily_limit)
|
||||||
|
) AS interval_limit,
|
||||||
|
IF (i.interval = 'month',
|
||||||
|
IF (cfp.fraud_interval_limit > 0,
|
||||||
|
cfp.fraud_interval_lock, bp.fraud_interval_lock),
|
||||||
|
IF (cfp.fraud_daily_lock > 0,
|
||||||
|
cfp.fraud_daily_lock, bp.fraud_daily_lock)
|
||||||
|
) AS interval_lock,
|
||||||
|
IF (i.interval = 'month',
|
||||||
|
IF (cfp.fraud_interval_limit > 0,
|
||||||
|
cfp.fraud_interval_notify, bp.fraud_interval_notify),
|
||||||
|
IF (cfp.fraud_daily_notify > 0,
|
||||||
|
cfp.fraud_daily_notify, bp.fraud_daily_notify)
|
||||||
|
) AS interval_notify
|
||||||
|
FROM (SELECT IF(? = 'month','month','day') AS 'interval') i,
|
||||||
|
billing.contracts c
|
||||||
|
INNER JOIN (
|
||||||
|
SELECT m.contract_id, m.billing_profile_id, MAX(m.start_date)
|
||||||
|
FROM billing.billing_mappings m
|
||||||
|
WHERE (m.start_date IS NULL OR m.start_date <= NOW())
|
||||||
|
AND (m.end_date IS NULL OR m.end_date >= NOW())
|
||||||
|
GROUP BY 1, 2
|
||||||
|
) bm ON bm.contract_id = c.id
|
||||||
|
JOIN billing.billing_profiles bp ON bp.id = bm.billing_profile_id
|
||||||
|
JOIN billing.contacts n ON n.id = c.contact_id
|
||||||
|
JOIN billing.resellers r ON r.id = n.reseller_id
|
||||||
|
LEFT JOIN billing.contract_fraud_preferences cfp ON cfp.contract_id = c.id
|
||||||
|
WHERE c.status = 'active'
|
||||||
|
HAVING interval_limit > 0
|
||||||
|
) as bpinfo
|
||||||
|
JOIN accounting.cdr ON cdr.source_account_id = bpinfo.id
|
||||||
|
WHERE CASE WHEN bpinfo.interval = 'month'
|
||||||
|
THEN cdr.start_time
|
||||||
|
BETWEEN UNIX_TIMESTAMP(DATE_FORMAT(NOW(), '%Y-%m-01 00:00:00'))
|
||||||
|
AND UNIX_TIMESTAMP(DATE_FORMAT(NOW() + INTERVAL 1 MONTH, '%Y-%m-01 00:00:00'))-1
|
||||||
|
ELSE cdr.start_time
|
||||||
|
BETWEEN UNIX_TIMESTAMP(DATE_FORMAT(NOW(), '%Y-%m-%d 00:00:00'))
|
||||||
|
AND UNIX_TIMESTAMP(DATE_FORMAT(NOW() + INTERVAL 1 DAY, '%Y-%m-%d 00:00:00'))-1
|
||||||
|
END
|
||||||
|
GROUP BY bpinfo.id
|
||||||
|
HAVING interval_cost >= interval_limit
|
||||||
|
");
|
||||||
|
|
||||||
|
1;
|
||||||
|
|
Loading…
Reference in new issue