Ув. разработчики, интересует возможность, стоимость и сроки доработки API модуля NPAY 5.2
Я уже приводил код для определения размера абонплаты и режима списания:
Код:
package ru.ttk.billing.event.GlobalScript;
import bitel.billing.common.TimeUtils;
import bitel.billing.server.npay.bean.ServiceObject;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Calendar;
import java.util.Collections;
import java.util.List;
import ru.bitel.bgbilling.kernel.script.server.dev.GlobalScriptBase;
import ru.bitel.bgbilling.kernel.tariff.tree.server.TariffModuleTree;
import ru.bitel.bgbilling.kernel.tariff.tree.server.TariffModuleTreeSet;
import ru.bitel.bgbilling.kernel.tariff.tree.server.TariffModuleTreeSetDao;
import ru.bitel.bgbilling.modules.npay.tariff.server.NPayTariffContext;
import ru.bitel.bgbilling.modules.npay.tariff.server.NPayTariffRequest;
import ru.bitel.bgbilling.server.util.Setup;
import ru.bitel.common.Preferences;
import ru.bitel.common.model.Period;
import ru.bitel.common.sql.ConnectionSet;
/**
 *
 * @author lda
 */
public class test extends GlobalScriptBase{
    
    @Override
    public void execute( Setup setup, ConnectionSet connectionSet )
            throws Exception{
        int cid = 79343;
        int mid = 7;
        Calendar dt = TimeUtils.clear_HOUR_MIN_MIL_SEC(Calendar.getInstance());
        Calendar startMonth = TimeUtils.getStartMonth( dt );
        Calendar endMonth = TimeUtils.getEndMonth( dt );      
        int daysInMonth = startMonth.getActualMaximum( Calendar.DAY_OF_MONTH );
        Connection con = connectionSet.getConnection();
        Connection conSlave = connectionSet.getSlaveConnection();
        try {        
            TariffModuleTreeSetDao tariffModuleTreeSetDao = new TariffModuleTreeSetDao( con );
            Preferences moduleSetup = setup.getModuleSetup( mid );
            
            NPayTariffContext context  = new NPayTariffContext( moduleSetup, con, mid, startMonth, endMonth, endMonth, String.valueOf(cid), null );
            context.setPrecalcOpenPeriod( new Period( TimeUtils.convertCalendarToDate( startMonth ), null ) );
            
            String query = 
                "SELECT cid, sid, col, emid, eid " + 
                "FROM npay_service_object_" + mid + " " + 
                "WHERE (date1 IS NULL OR date1<=?) AND (date2 IS NULL OR date2>=?) ";
            query += " AND cid IN (" + cid + ")";
            query += " ORDER BY cid, sid";
            PreparedStatement ps = conSlave.prepareStatement( query );
            ps.setDate( 1, TimeUtils.convertCalendarToSqlDate( dt ) );
            ps.setDate( 2, TimeUtils.convertCalendarToSqlDate( dt ) );
            ResultSet rs = ps.executeQuery();
            while( rs.next() ){
                    ServiceObject serviceObject = new ServiceObject();
                    serviceObject.setContractId( rs.getInt( 1 ) );
                    serviceObject.setServiceId( rs.getInt( 2 ) );
                    serviceObject.setDate1( TimeUtils.convertCalendarToDate(startMonth ));
                    serviceObject.setDate2( TimeUtils.convertCalendarToDate(endMonth ) );
                    serviceObject.setCol( rs.getInt( 3 ) );
                    serviceObject.setEntityMid( rs.getInt( 4 ) );
                    serviceObject.setEntityId( rs.getInt( 5 ) );
                    
                    int emid = serviceObject.getEntityMid();
                    int eid = serviceObject.getEntityId();
                    int col = serviceObject.getCol();
                    int sid = serviceObject.getServiceId();
                    
                    Calendar serviceStart = TimeUtils.convertDateToCalendar( serviceObject.getDate1() );
                    Calendar serviceEnd = TimeUtils.convertDateToCalendar( serviceObject.getDate2() );
                    
                    Calendar date1 = (Calendar)serviceStart.clone();
                    Calendar date2 = (Calendar)serviceEnd.clone();
                    
                    TariffModuleTreeSet tts = tariffModuleTreeSetDao.getTariffTreeSetForDay(cid, dt, "npay", mid, emid, eid);
                    for( TariffModuleTreeSet.Entry tariffPeriod : tts.entries() ){
                        List<NPayTariffRequest.NPayServiceCost> serviceCostList = Collections.singletonList( new NPayTariffRequest.NPayServiceCost( sid, serviceStart, serviceEnd, date1, date2, col ) );
                        NPayTariffRequest req = new NPayTariffRequest( mid, cid, sid );
                        req.setInfoEnable( true );
                        req.setConnectionSet( connectionSet );
                        req.setAccountingMonthDays( daysInMonth );
                        req.setTime( date1 );
                        req.setServiceCost( sid,  serviceCostList);
                        final TariffModuleTree tree = tariffPeriod.getTree();
                        tree.execute( req, context );
                        if( req.isAccepted() ){
                            boolean isDayMode = req.toString().indexOf("Day mode") != -1;
                            for( NPayTariffRequest.NPayServiceCost serviceCost : req.getServiceCostList() ){
                                print("cost="+serviceCost.cost);
                                print("isDayMode="+isDayMode);
                            }
                        }
                    }
            }            
            ps.close();
            tariffModuleTreeSetDao.freeResources();
        }catch( Exception e ){
            e.printStackTrace();
        }
    }
}
Нам требуется:
1. Получать размер абонплаты напрямую из тарифа, а не так как сейчас. 
Сейчас для получения размера абонплаты приходится указывать, что тариф и услуга действуют весь месяц и договор активен весь месяц.
2. Режим списания.
3. Если режим списания дневной, то требуется раскладка по дням, в какой день, какая сумма была списана.
2 и 3 пункт у Вас уже есть в req.toString(), но к сожалению в текстовом виде.
Новый функционал можно добавить в NPayTariffRequest.NPayServiceCost serviceCost