forum.bitel.ru
http://forum.bitel.ru/

Автоматически проставить в CerberCrypt пакете дату закрытия.
http://forum.bitel.ru/viewtopic.php?f=15&t=8064
Страница 1 из 1

Автор:  iseed [ 22 май 2013, 11:11 ]
Заголовок сообщения:  Автоматически проставить в CerberCrypt пакете дату закрытия.

Доброго дня.

Информация о версии:
Клиент: вер. 5.2 сборка 1135 от 18.03.2013 20:13:26
os: Linux; java: OpenJDK 64-Bit Server VM, v.1.6.0_27

Собственно сабж.

Имеется договор, в нем подключен и настроен модуль CerberCrypt с следующей конфой:
---
#название пункта Web меню
web.menuItem1=Управление подпиской CerberCrypt
#web.menuItem1=Управление подпиской CerberCrypt
web.menuItem2=Виртуальный кинотеатр CerberCrypt
#web.menuItem2=Виртуальный кинотеатр CerberCrypt
#Проверка наличия каналов на пакете при добавлении новых каналов
#0 - проверки нет
#1 - проверка только при действии Открыть пакеты
#2 - проверка при действии Открыть пакеты и при открытии пакета через веб-статистику
#3 - проверка при действии Открыть пакеты, открытии пакета через веб-статистику и при добавлении пакета через клиента биллинга
cerbercrypt.cardpacket.addcheck=1
sa=ru.bitel.bgbilling.modules.cerbercrypt.server.CerbercryptServiceActivator
server.0.host=10.1.19.51
server.0.port=8100
server.0.login=<Login>
server.0.pswd=<Pass>
# сколько часов от суток "прощать" при блокировке
forgive.hours=2
error.mail=admc@mycentra.ru
#через запятую можно указать номера карт, подписку для которых обновлять не следует
ignore.cards=1,3
---

В личном кабинете выбираю Управление подпиской карт CerberCrypt. В нем выбираю карту и подключаемый пакет.
Посде добавления у пакета видна дата начала, но нет даты окончания. Подскажите какие настройки необходимы, чтобы пакет автоматически отключался через 30 дней? Те чтобы вместе с датой начала подставлялась и дата окончания действия пакета.

Автор:  dimOn [ 22 май 2013, 13:29 ]
Заголовок сообщения:  Re: Автоматически проставить в CerberCrypt пакете дату закры

асинхронное:
http://bgbilling.ru/v6.0/javadoc/ru/bit ... Event.html
просто изменять в БД при необходимости.

наверно, лучше синхронное:
http://bgbilling.ru/v6.0/javadoc/ru/bit ... Event.html
внутри ставите setProcessed и переопределяете штатную логику.
штатная такая:

Код:
CardPacket cardPacket = new CardPacket();
                         cardPacket.setContractId( cid );
                         cardPacket.setUsercardId( usercardId );
                         cardPacket.setPacketId( packetId );
                         cardPacket.setDateFrom( TimeUtils.convertCalendarToDate( date ) );
                         if( comment != null ) cardPacket.setComment( comment );
                         
                        // проверка периода пакета на невыход за пределы периода юзеркарты
                        if( ( cardPacket.getDateFrom() == null && userCard.getDate1() != null ) ||
                            ( cardPacket.getDateTo() == null && userCard.getDate2() != null ) ||   
                            ( cardPacket.getDateFrom() != null && userCard.getDate1() != null &&  TimeUtils.dateBefore( cardPacket.getDateFrom(), userCard.getDate1() ) ) ||
                            ( cardPacket.getDateTo() != null && userCard.getDate2() != null && TimeUtils.dateBefore( userCard.getDate2(), cardPacket.getDateTo() ) ) )
                        {
                            throw new BGMessageException( "Интервал пакета выходит за интервал карты" );
                        }
                       
                         try
                         {
                            cpm.openCardPackets( moduleSetup, cpm, packetMap, cid, usercardId,
                                                 Collections .singletonList( cardPacket ), now, true );

                            Event event = new SubscriptionChangedEvent( userID, mid, cid, userCard.getId(),
                                                                        SubscriptionChangedEvent.CHANGE_PLACE_WEB, SubscriptionChangedEvent.MODE_OPEN,
                                                                        cardPacket.getPacketId(), TimeUtils.convertCalendarToDate( date ) );
                            context.publishAfterCommit( event );
                              // Обновление подписки для этой карты, которую затронуло
                            // зависимые тоже обрабатываем
                            new UserCardManager( con, mid, User.USER_CONTRACT ).updateSubscribe( date.getTime(), cardPacket.getUsercardId(), true );
                         }
                         catch( BGMessageException e )
                         {
                            throw new BGMessageException( e.getMessage() );
                         }



очевидно, вам надо поставить ещё
cardPacket.setDateTo

SubscriptionChangedEvent можно не бросать, если не пользуетесь

Автор:  iseed [ 23 май 2013, 15:51 ]
Заголовок сообщения:  Re: Автоматически проставить в CerberCrypt пакете дату закры

Те это надо писать динамически подгружаемый класс расширять существующий?
Потом производить подмену cardPacket.setDateTo необходимым значением?
Если не трудно подскажите последовательность действия ...
Просто насколь я понимаю кроме как при создании пакета
---
CardPacket cardPacket = new CardPacket();
cardPacket.setContractId( cid );
cardPacket.setUsercardId( usercardId );
cardPacket.setPacketId( packetId );
cardPacket.setDateFrom( TimeUtils.convertCalendarToDate( date ) );
---
указать cardPacket.setDateTo более нигде нельзя?

Автор:  dimOn [ 23 май 2013, 15:59 ]
Заголовок сообщения:  Re: Автоматически проставить в CerberCrypt пакете дату закры

Нене, это обычные события, возникающие при открытии подписки (второе) и асинхронно уже после (первое). На них надо повесить скрипт. Старые скрипты на биншеле, либо новые на дин.коде. Лучше, конечно, на дин.коде писать. Но это не расширение существующего класса, просто обработка события и реализация там каких-то действий.

Автор:  iseed [ 24 май 2013, 15:04 ]
Заголовок сообщения:  Re: Автоматически проставить в CerberCrypt пакете дату закры

Те надо потом добавлять каждому пользователю как скрипт поведения? А есть возможность както глобально определить поведение. Те при каждом из подобных эвентов применяется правило?
Просто пока не понятно как лучше организовать такое...

Автор:  dimOn [ 24 май 2013, 15:29 ]
Заголовок сообщения:  Re: Автоматически проставить в CerberCrypt пакете дату закры

да, скрипты работают тока на договорах на которых повешены. для этого есть шаблоны договоров для новосозданных и групповое назначение уже на существующие.

глобально можно переопределить весь экшен, да. переписать на динкод его, отнаследовав старый. тогда события не при делах. будет просто вызываться дин.код вместо старого экшена. но я даже сходу не соображу как сделать то что вам надо, не вставляя весь код оригинального экшена (с добавлением одной этой вашей строки), а это плохой вариант.

но теоретически можно сделать так: отнаследовать старый веб-экшен, там перегрузить doAction вначале вызвать super.doAction а в конце каким-то образом уже добавленный недавно в БД картпакет снова отапдейтить нужной вам датой.

Автор:  iseed [ 27 май 2013, 11:40 ]
Заголовок сообщения:  Re: Автоматически проставить в CerberCrypt пакете дату закры

Подсобите если не трудно с реализацией??? Уже 4 день моск кипит.

1) Насколь я понимаю надо обьявить что при данном эвенте выполняется данный скрипт.
Собственно как? В документации никак не показано, а на форуме уже собственно сами скрипты, а не то что необходимо отписать в конфигурации чтобы вызвать функцию.

2) Создать функцию типа:
---
import bitel.billing.server.util.*;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;import bitel.billing.server.contract.bean.*;
import bitel.billing.server.tariff.*;
import bitel.billing.common.KernelConst;
import bitel.billing.server.script.bean.event.*;
import ru.bitel.common.sql.ConnectionSet;

public void onEvent( event, setup, con, conSlave )
{
int conid = event.getContractId();
String query = "update `card_packet_7`
set `date2`=from_unixtime(unix_timestamp()+3600*24*30)
where `id` =
(select id from
(SELECT cp.id as id
FROM `contract` c
join `card_packet_7` cp on (c.id=cp.cid)
join `packet_7` p7 on (cp.pid=p7.id)
where c.title = " + conid +"
order by cp.date1 desc
limit 1) as `tmp`)
";
PreparedStatement ps = con.prepareStatement(query);
ps.executeQuery();
}
---

Автор:  dimOn [ 27 май 2013, 12:28 ]
Заголовок сообщения:  Re: Автоматически проставить в CerberCrypt пакете дату закры

iseed писал(а):
1) Насколь я понимаю надо обьявить что при данном эвенте выполняется данный скрипт.
Собственно как? В документации никак не показано, а на форуме уже собственно сами скрипты, а не то что необходимо отписать в конфигурации чтобы вызвать функцию.

Как так, целая глава про это всё:
http://bgbilling.ru/v5.2/doc/ch02.html

Автор:  iseed [ 28 май 2013, 09:08 ]
Заголовок сообщения:  Re: Автоматически проставить в CerberCrypt пакете дату закры

К сожалению в статье много непонятного.
1) В статье на странице http://bgbilling.ru/v5.2/doc/ch02s03s03.html
Указаны [Скрипты BGBS] и [Классы Java]
В скриптах BGBS находятся только опредустановленые события среди которых нету привязки к ru.bitel.bgbilling.modules.cerbercrypt.server.event.ChangePacketSubscriptionEvent
Ближайшие по смысле эвенты там [Перед открытием пакета].
Пробовал создать обработку на этот эвент чтото типа:
---
import bitel.billing.server.util.*;
import java.io.*;
import java.util.*;
import javax.activation.DataSource;
import ru.bitel.bgbilling.common.BGException;
import ru.bitel.bgbilling.plugins.dispatch.common.bean.Contact;
import ru.bitel.bgbilling.plugins.dispatch.server.sender.Sender;

public void onEvent( event, setup, con, conSlave )
{
PrintWriter zzz = null;
zzz = new PrintWriter(new FileOutputStream("/home/asd/asd.log"));
zzz.println("asd");
zzz.close();
}
--
Соотвественно при добавлении пакета в карточку абонента - файлик не появляется.
Скрипт к абоненту подключил.

Если смотреть [Классы Java] то там надо создавать новый класс расширяя существующий.
При создании нового в перечне класса нужный мне отсутствует.
Если создать класс ru.bitel.bgbilling.modules.cerbercrypt.server.event.OpenPacketSubscriptionEvent
и добавить в код
---
package ru.bitel.bgbilling.modules.cerbercrypt.server.event;

import ru.bitel.bgbilling.kernel.event.Event;
import ru.bitel.bgbilling.kernel.script.server.dev.EventScriptBase;
import ru.bitel.bgbilling.server.util.Setup;
import ru.bitel.common.sql.ConnectionSet;
import java.io.*;
import java.util.*;

public class OpenPacketSubscriptionEvent
extends EventScriptBase
{
@Override
public void onEvent( Event event1, Setup setup2, ConnectionSet connectionSet3 )
throws Exception
{
PrintWriter zzz = null;
zzz = new PrintWriter(new FileOutputStream("/home/asd/asd.log"));
zzz.println("asd");
zzz.close();
}

}
---
Соответсвенно эвент при создании из личного кабинета также не сработал ...

Куда копать то? Подскажи о великий учитель !

Автор:  dimOn [ 28 май 2013, 12:13 ]
Заголовок сообщения:  Re: Автоматически проставить в CerberCrypt пакете дату закры

И там и там можно использовать только существующие события, разумеется. Должны быть доступны для обеих способов.

ru.bitel.bgbilling.modules.cerbercrypt.server.event.SubscriptionChangedEvent -- Изменение подписки карты
ru.bitel.bgbilling.modules.cerbercrypt.server.event.OpenPacketSubscriptionEvent -- Перед открытием пакета

Автор:  dimOn [ 28 май 2013, 12:15 ]
Заголовок сообщения:  Re: Автоматически проставить в CerberCrypt пакете дату закры

Цитата:
Соотвественно при добавлении пакета в карточку абонента - файлик не появляется.

Так-то речь была, вроде, про личный кабинет, а из клиента не работает. Это же написано и по ссылке на явадок про это событие (дал выше).

Автор:  dimOn [ 28 май 2013, 12:47 ]
Заголовок сообщения:  Re: Автоматически проставить в CerberCrypt пакете дату закры

Не очень понятно. Если у вас эти события есть в BGBS но нету в дин.классах, значит, неправильно обновление прошло (когда-то давно).
Переставьте заново модуль с "!", перед этим почистите кеш выполненных запросов:
http://bgbilling.ru/v5.2/doc/ch01s13.html

Если у вас нет выбора класса, который реализует, значит, не от того отнаследовались. Называть всё равно как, не обязательно OpenPacketSubscriptionEvent, тем более не надо в таком же пакете.

Автор:  iseed [ 28 май 2013, 15:38 ]
Заголовок сообщения:  Re: Автоматически проставить в CerberCrypt пакете дату закры

Посыпаю голову пеплом - галчонок не на том эвенте был ...

Добавляю пакет естественно из личного кабинета пользвоателя.

В типовом [Скрипты BGBS] есть событие 'Перед открытием пакета'.
На него скрипта вешал, он срабатывает. Но пробелма в том что мне нужно не перед открытием, а после открытия - те после добавления в бд записи о тарифе.
Не подскажете как можно так сделать?

Сюдя по методам евентов OpenPacketSubscriptionEvent и ChangePacketSubscriptionEvent
в них ввобще нету метода который параметром к себе имеет дату закрытия.
OpenPacketSubscriptionEvent
public OpenPacketSubscriptionEvent(int userId,
int mid,
int cid,
ru.bitel.bgbilling.modules.cerbercrypt.common.bean.UserCard userCard,
ru.bitel.bgbilling.modules.cerbercrypt.common.bean.Packet packet,
java.util.Date fromDate)
public ChangePacketSubscriptionEvent(int userId,
int moduleId,
int contractId,
ru.bitel.bgbilling.modules.cerbercrypt.common.bean.UserCard userCard,
ru.bitel.bgbilling.modules.cerbercrypt.common.bean.Packet packet,
java.util.Date fromDate)

Вложения:
Снимок экрана.png
Снимок экрана.png [ 83.92 КБ | Просмотров: 10162 ]

Страница 1 из 1 Часовой пояс: UTC + 5 часов [ Летнее время ]
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/