diff --git a/lib/NGCP/Schema/Result/contract_fraud_events.pm b/lib/NGCP/Schema/Result/contract_fraud_events.pm new file mode 100644 index 00000000..3a56b334 --- /dev/null +++ b/lib/NGCP/Schema/Result/contract_fraud_events.pm @@ -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; +