Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- long start = System.currentTimeMillis();
- // Всего лишь алиасы
- final Contract contract = object;
- final Subject subject = contract.client;
- // Используется для удобства
- final Person person;
- if (subject instanceof Person) { person = (Person) subject;
- } else { person = null; }
- // Берем презентменты за 2 месяца
- final DateTime from = DateTime.valueOf(params.get("from").replace("T"," ")); // включительно
- //final DateTime to = Timing.addMonth(DateTime.valueOf(params.get("to").replace("T"," ")), 1);
- final DateTime to = DateTime.valueOf(params.get("to").replace("T"," "));
- final DateTime minTime = DateTime.valueOf(params.get("minPresentmentTime").replace("T"," "));
- // Колонки для отчета хранятся в параметре пакетной процедуры
- final ArrStr columns = ArrStr.fromValAsStr(params.get("report"));
- // batch.createTime используем это время для выбора курса
- // добавить сумму в рублях в отчет в формате PDF
- class Tran
- {
- boolean isCashBack = false;
- boolean isReversal = false;
- Tran tran;
- Int mccId;
- Contract finContract;
- Token token;
- Int tokenId;
- Str cardPan;
- Int acctId;
- Num acctAmt;
- Str acctNumber;
- Num baseAmt;
- Str cardProductTitle;
- Str issContactTypeTitle;
- // todo CardProductTitle
- // todo IssiContactTypeTitle
- // Конструктор копирования
- Tran(Tran tran) {
- //Trace.event("tran", Radix::Arte::EventSource:UserFunc);
- this.tran = tran.tran;
- this.mccId = tran.mccId;
- this.token = tran.token;
- this.tokenId = tran.tokenId;
- this.cardPan = tran.cardPan;
- this.acctId = tran.acctId;
- this.acctNumber = tran.acctNumber;
- this.acctAmt = tran.acctAmt;
- this.baseAmt = tran.baseAmt; // если baseAmt из другого Tran - копируем с тем же знаком
- this.finContract = tran.finContract;
- this.isCashBack = tran.isCashBack;
- this.isReversal = tran.isReversal;
- this.cardProductTitle = tran.cardProductTitle;
- this.issContactTypeTitle = tran.issContactTypeTitle;
- }
- // Конструктор на основе текущего состояния курсора
- Tran(CashBack_PostingsBySubjectCursor cur) {
- //Trace.event("tran2", Radix::Arte::EventSource:UserFunc);
- this.tran = cur.tran;
- this.mccId = cur.mccId;
- this.token = cur.token;
- this.tokenId = cur.token.id;
- this.cardPan = cur.crdPan;
- this.acctId = cur.acctId;
- this.acctNumber = cur.acctNumber;
- this.acctAmt = (-1) * cur.acctAmt; // если берем из курсора - правим знак
- this.baseAmt = (-1) * cur.baseAmt;
- this.finContract = cur.contractFin;
- this.isCashBack = (cur.period == null ? false : true); // если null, значит обычная транзакция
- this.isReversal = cur.isReversal.booleanValue();
- this.cardProductTitle = cur.tran.custCard.cardProductRef.title;
- this.issContactTypeTitle = cur.tran.custCard.contractType.title;
- }
- // Преобразование Tran в строковый тип (для трассы и прочего)
- @Override
- public Str toString() {
- return this.getString(" ");
- }
- // Функция, которая используется в выводе выше
- public Str getString(Str delim) {
- return person.lastName + " " + person.firstName + delim
- + tran.id + delim
- + tran.regTime + delim
- + mccId + delim
- + baseAmt + delim
- + tran.regTime + delim
- + (isCashBack ? "CB" : "") + delim
- + "\n";
- }
- }
- // Наследуемся от обычной транзакции
- class CashBackTran extends Tran
- {
- CashBack_Period rules;
- CashBack_Params params;
- Num rate, cbAmt, cbAmtCcy;
- Num minTurnover, maxCashBack;
- Num cbSum = 0, cbSumCcy = 0;
- Str textTemplate;
- CashBackTran(Tran tran, CashBack_PostingsBySubjectCursor cur) {
- // TODO: Кидать исключение, если, на самом деле, это не КБ транзакция
- super(tran);
- //Trace.event("CashBackTran", Radix::Arte::EventSource:UserFunc);
- // Помним: берем другой Tran - знак не меняем!
- this.rules = cur.period;
- if (this.rules != null) {
- this.params = getParams(); // мб null
- //if (this.rules == null) {
- //}
- this.maxCashBack = (params.maxPayment == null ? Num.ZERO : params.maxPayment);
- this.minTurnover = (params.turnoverAmt == null ? Num.ZERO : params.turnoverAmt);
- //this.rate = (params.percent == null ? Num.ZERO : params.percent); // мб null
- this.rate = params.percent;
- this.cbAmtCcy = getCashBackAmtCcy(); // мб null
- this.cbAmt = getCashBackAmt(); // мб null
- this.isCashBack = true; // уже не надо
- this.textTemplate = (rules.categoryText == null ? "" : rules.categoryText);
- if (this.params == null) {
- throw new NullPointerException("params is null");
- }
- if (this.maxCashBack == null) {
- throw new NullPointerException("maxCashBack is null");
- }
- if (this.minTurnover == null) {
- throw new NullPointerException("minTurnover is null");
- }
- }
- }
- CashBack_Params getParams() {
- for(CashBack_Params params : rules.getParams()){
- return params;
- }
- return null;
- }
- Num getCashBackAmt() {
- return (baseAmt * (rate / 100)).setScale(2, java.math.RoundingMode.HALF_UP);
- //Num cbInCcy = (baseAmt * (rate / 100)).setScale(2, java.math.RoundingMode.HALF_UP);
- /*try {
- RateGroup rateGroup = RateGroup.loadByPK(1, false);
- return (rateGroup.convertClient(tran.operDay, tran.operDay, Currency.get(810), Currency.get(tran.custCcy), cbAmtCcy)).setScale(2, java.math.RoundingMode.HALF_UP);
- } catch (Exception e) { Trace.event("КБ. Ошибка при конвертации валюты", Radix::Arte::EventSource:TestCase); };
- return Num.ZERO;*/
- }
- // считаем кэшбэк ещё и в валюте
- Num getCashBackAmtCcy() {
- return (acctAmt * (rate / 100)).setScale(2, java.math.RoundingMode.HALF_UP);
- }
- Str getCashBackProduct() {
- return (rules != null ?
- rules.neyva__CashBack_Actions.rid + (rules.neyva__CashBack_Actions.variant != null ? "~" + rules.neyva__CashBack_Actions.variant : "") : "-");
- }
- // Преобразование CashBackTran в строковый тип (для трассы и прочего)
- @Override
- public Str toString() {
- return this.getString(" ");
- }
- // Функция, которая используется в выводе выше
- public Str getString(Str delim) {
- return person.lastName + " " + person.firstName + delim
- //+ (isCashBack ? "TRUE" : "FALSE") + delim
- + tran.id + delim
- + tran.regTime + delim
- + tran.localTime + delim
- + mccId + delim
- + baseAmt + delim
- + rate + "% " + delim
- + cbAmt + delim
- + tran.regTime + delim
- + getCashBackProduct() + delim
- + "\n";
- }
- // Функция, которая формирует строку для отчета
- public Str getCSV() {
- StringBuilder sbCSV = new StringBuilder();
- for(Str column : columns){
- switch(column){
- case "TranId": sbCSV.append(tran.id); break;
- case "Acct": sbCSV.append(acctNumber); break;
- case "TranRegTime": sbCSV.append(tran.regTime); break;
- case "TranOperDay": sbCSV.append(tran.operDay); break;
- case "TranLocalTime": sbCSV.append(tran.origTime); break;
- case "CashBackProduct": sbCSV.append((rules != null ? rules.neyva__CashBack_Actions.rid + (rules.neyva__CashBack_Actions.variant != null ? "~" + rules.neyva__CashBack_Actions.variant : "") : "-")); break;
- case "CardProductTitle": sbCSV.append(cardProductTitle); break; // done CardProductTitle
- case "IssContactTypeTitle": sbCSV.append(issContactTypeTitle); break; // done IssiContactTypeTitle
- case "PAN": sbCSV.append(cardPan); break;
- case "MCC": sbCSV.append(mccId); break; // done MccOrig
- case "BaseAmt": sbCSV.append(baseAmt); break;
- case "AcctAmt": sbCSV.append(acctAmt); break;
- case "Ccy": sbCSV.append(finContract.mainCcy); break; // done acct ccy
- case "Rate": sbCSV.append(rate); break;
- case "MaxPayment": sbCSV.append(maxCashBack); break;
- case "MinTurnover": sbCSV.append(minTurnover); break;
- case "CB_Amt": sbCSV.append(cbAmt); break;
- case "CB_AmtCcy": sbCSV.append(cbAmtCcy); break;
- case "CB_Sum": sbCSV.append(cbSum); break;
- case "CB_SumCcy": sbCSV.append(cbSumCcy); break;
- case "PersonTitle": sbCSV.append("(" + subject.calcTitle()); break;
- default: sbCSV.append(column);
- }
- sbCSV.append(";");
- }
- return sbCSV.toString();
- }
- }
- class Account
- {
- Contract contract;
- Num cbAmt;
- Num cbAmtPrev;
- Num cbAmtCcy = 0;
- Num cbAmtCcyPrev = 0;
- Num delta;
- Num deltaCcy;
- java.util.List<Tran> cbTrans = new java.util.ArrayList<Tran>(); // операции за текущий период
- java.util.List<Tran> cbTransPrev = new java.util.ArrayList<Tran>(); // операции за прошлый период
- Account() {
- //Trace.event("Account", Radix::Arte::EventSource:UserFunc);
- this.cbAmt = 0;
- this.cbAmtPrev = 0;
- this.delta = 0;
- this.cbAmtCcy = 0;
- this.cbAmtPrev = 0;
- this.deltaCcy = 0;
- }
- @Override
- public String toString() {
- StringBuilder sbTrans = new StringBuilder();
- //-----------------------------------------------------------
- sbTrans.append("ТРАНЗАКЦИИ ЗА ТЕКУЩИЙ ПЕРИОД:").append("\n");
- for (Tran tran : cbTrans) {
- sbTrans.append(tran);
- }
- sbTrans.append(cbAmt).append("\n");
- sbTrans.append("\n");
- //-----------------------------------------------------------
- sbTrans.append("ТРАНЗАКЦИИ ЗА ПРОШЛЫЙ ПЕРИОД:").append("\n");
- for (Tran tran : cbTransPrev) {
- sbTrans.append(tran);
- }
- sbTrans.append(cbAmtPrev).append("\n");
- sbTrans.append("\n");
- //-----------------------------------------------------------
- sbTrans.append("ДЕЛЬТА КБ: ").append(cbAmt).append(" - ").append(cbAmtPrev).append(" = ").append(delta).append("\n");
- //-----------------------------------------------------------
- return sbTrans.toString();
- }
- }
- class Card
- {
- Int tokenId;
- Token token;
- Num turnover = 0;
- CashBack_Period rules;
- CashBack_Params params;
- Num minTurnover, maxCashBack;
- Str textTemplate;
- Num cbRest = 0; // остаток КБ, который клиент способен получить
- java.util.HashMap<Int,Account> accts = new java.util.HashMap<Int,Account>();
- java.util.List<Tran> trans = new java.util.ArrayList<Tran>(); // список всех операций по карте
- java.util.List<CashBackTran> cbTrans = new java.util.ArrayList<CashBackTran>(); // список операций, связанных с КБ
- Card(Token token) {
- this.tokenId = token.id;
- this.token = token;
- }
- // Любая транзакция (учет оборота)
- void addTran(Tran tran) {
- // исключаем реверсы без оригинальных транзакций
- boolean correctReverse = false;
- if (tran.isReversal) {
- for (CashBackTran cbTran : cbTrans) {
- if (tran.tran.prevReversedTran != null && tran.tran.prevReversedTran.id.equals(cbTran.tran.id)) {
- correctReverse = true;
- break;
- }
- }
- if (!correctReverse) { // игнорим, игнорим, игнорим!
- return;
- }
- }
- trans.add(tran);
- turnover += tran.baseAmt;
- }
- // Транзакция кэшбэка
- void addCbTran(CashBackTran tran, UserAttrsStorageHandler storage) { // передавать storage - это ужасно, нарушаем ООП ;(
- // исключаем реверсы без оригинальных транзакций
- boolean correctReverse = false;
- if (tran.isReversal) {
- for (CashBackTran cbTran : cbTrans) {
- if (tran.tran.prevReversedTran != null && tran.tran.prevReversedTran.id.equals(cbTran.tran.id)) {
- correctReverse = true;
- break;
- }
- }
- if (!correctReverse) { // игнорим, игнорим, игнорим!
- return;
- }
- }
- // если счет из транзакции встречается впервые, добавляем его
- if (!accts.containsKey(tran.acctId)) {
- accts.put(tran.acctId, new Account());
- }
- // Закидываем транзакцию по карте в нужый счет, суммируем выплаты
- Account acct = accts.get(tran.acctId);
- if (tran.isCashBack) {
- if (tran.tran.origTime.compareTo(from) >= 0 && tran.tran.origTime.compareTo(minTime) < 0) {
- acct.contract = tran.finContract;
- acct.cbTransPrev.add(tran); // добавляем транзакции в счет (за прошлый период)
- acct.cbAmtPrev += tran.cbAmt;
- acct.cbAmtCcyPrev += tran.cbAmtCcy; // валюта
- //tran.cbSum = cbAmtPrev;
- }
- if (tran.tran.origTime.compareTo(from) >= 0 && tran.tran.origTime.compareTo(to) < 0) {
- acct.contract = tran.finContract;
- acct.cbTrans.add(tran); // добавляем транзакции в счет (за текущий период)
- acct.cbAmt += tran.cbAmt;
- acct.cbAmtCcy += tran.cbAmtCcy;
- tran.cbSum = acct.cbAmt;
- /*if (tran.cbSum > tran.maxCashBack) {
- DateTime now = Timing.getCurrentLocalTime();
- tran.cbSum = tran.maxCashBack;
- try {
- tran.cbSumCcy = tran.finContract.inst.baseRateGroup.convertClient(now, now, Currency.get(810), Currency.get(acct.contract.mainCcy), tran.maxCashBack);
- } catch (Exception e) {};
- }*/
- storage.setStr("Tran_" + tran.tran.id, tran.getCSV()); // для отчета
- }
- }
- cbTrans.add(tran);
- }
- // Рассчитываем сумму выплаты, учитывая перепривязки счетов,
- // максимально возможный КБ и то, что выплаты происходят два раза в месяц
- void calcDelta() {
- for (Account acct : accts.values()) {
- if (cbRest <= 0 && maxCashBack != 0) { // если остаток КБ исчерпан, выплаты прекращаем
- return;
- }
- acct.delta = (acct.cbAmt - acct.cbAmtPrev).max(Num.ZERO); // зануление дельты при отрицательном значении
- acct.deltaCcy = (acct.cbAmtCcy - acct.cbAmtCcyPrev).max(Num.ZERO);
- Trace.event("cbAmtCcy " + acct.cbAmtCcy + " cbAmtCcyPrev " + acct.cbAmtCcyPrev, Radix::Arte::EventSource:TestCase);
- // если выплаты КБ не ограничены, то не используем cbRest
- if (maxCashBack != 0) {
- if (cbRest < acct.delta) {
- //Trace.warning("CB REST " + cbRest + " < ACCT.DELTA " + acct.delta, Radix::Arte::EventSource:TestCase);
- acct.delta = cbRest;
- DateTime now = Timing.getCurrentLocalTime(); // поменять 'now' на время запуска пакетной процедуры
- try {
- acct.deltaCcy = acct.contract.inst.baseRateGroup.convertClient(now, now, Currency.get(810), Currency.get(acct.contract.mainCcy), cbRest);
- acct.deltaCcy = acct.deltaCcy.setScale(2, java.math.RoundingMode.HALF_UP);
- } catch (Exception e) {};
- }
- cbRest -= acct.delta; // остаток КБ уменьшается при каждой выплате
- }
- }
- }
- // Когда уже все транзакции добавлены, получаем параметры КБ для определенной карты
- void calcRulesAndParams() {
- //if (cbTrans != null && !cbTrans.isEmpty()) {
- rules = cbTrans.get(0).rules;
- textTemplate = rules.categoryText;
- for (CashBack_Params p : rules.getParams()) {
- params = p;
- minTurnover = (params.turnoverAmt == null ? Num.ZERO : params.turnoverAmt);
- maxCashBack = (params.maxPayment == null ? Num.ZERO : params.maxPayment);
- cbRest = maxCashBack;
- break;
- }
- // }
- }
- /*if (rules != null && params != null) {
- return;
- }
- if (cbTrans != null && !cbTrans.isEmpty() && cbTrans.size() >= 1) {
- boolean equal = true;
- if (cbTrans.size() > 1) {
- for (int i=1; i<cbTrans.size(); ++i) {
- equal = (cbTrans.get(i).rules.id == cbTrans.get(i-1).rules.id);
- if (!equal) { break; }
- }
- }
- if (equal) {
- this.rules = cbTrans.get(0).rules;
- for (CashBack_Params p : rules.getParams()) {
- params = p;
- minTurnover = (params.turnoverAmt == null ? Num.ZERO : params.turnoverAmt);
- maxCashBack = (params.maxPayment == null ? Num.ZERO : params.maxPayment);
- cbRest = maxCashBack;
- //Trace.warning("Макс. кэшбэк: " + maxCashBack.toString(), Radix::Arte::EventSource:TestCase);
- //Trace.warning("Мин. оборот: " + minTurnover.toString(), Radix::Arte::EventSource:TestCase);
- break;
- }
- }
- }*/
- // Достигнут ли минимальный оборот
- boolean isMinTurnover() {
- if (minTurnover != null) {
- return turnover >= minTurnover;
- }
- return false;
- }
- // Для корректной работы HashSet (не понадобилось, но на всякий случай оставил):
- /*@Override
- public boolean equals(Object obj) {
- // не можем сравнивать с null, не можем сравнивать с другими классами
- if (obj == null || obj.getClass() != this.getClass()) {
- return false;
- }
- Card c = (Card) obj;
- return tokenId.equals(c.tokenId);
- }*/
- /*@Override
- public int hashCode() {
- return tokenId.hashCode();
- }*/
- @Override
- public Str toString() {
- StringBuilder sbTrans = new StringBuilder();
- //-----------------------------------------------------------
- sbTrans.append("ВСЕ ТРАНЗАКЦИИ ПО КАРТЕ: (").append(trans.size()).append("): ").append("\n");
- //-----------------------------------------------------------
- sbTrans.append("ОБОРОТ: ").append(turnover).append("\n");
- for (Tran tran : trans) {
- sbTrans.append(tran);
- }
- sbTrans.append("\n");
- //-----------------------------------------------------------
- sbTrans.append("ВСЕ ТРАНЗАКЦИИ ПО КАРТЕ, СВЯЗАННЫЕ С КБ: (").append(cbTrans.size()).append("): ").append("\n");
- for (Tran cbTran : cbTrans) {
- sbTrans.append(cbTran);
- }
- sbTrans.append("\n");
- //-----------------------------------------------------------
- sbTrans.append("СЧЕТА").append("\n");
- for (Account acct : accts.values()) {
- sbTrans.append("- ").append(acct).append("\n");
- }
- sbTrans.append("\n");
- //-----------------------------------------------------------
- return tokenId.toString() + " " + sbTrans.toString();
- }
- }
- class Client
- {
- boolean ignore = true; // будем игнорить клиента, если у него нет КБ транзакций
- TypesXsd:JobRequest jobs = null;
- TranXsd:Request rqG = null;
- java.util.List<Tran> trans = new java.util.ArrayList<Tran>(); // список всех транзакций
- java.util.HashMap<Int, Card> cards = new java.util.HashMap<Int, Card>(); // карты клиента
- void fillTrans() {
- jobs = TypesXsd:JobRequest.Factory.newInstance();
- rqG = jobs.addNewTran();
- addJobTran(); // групповая транзакции
- addUserAttrs(); // Rid клиента и его ФИО
- UserAttrsStorageHandler storage = new UserAttrsStorageHandler(); // для отчета
- try(CashBack_PostingsBySubjectCursor cur = CashBack_PostingsBySubjectCursor.open(from, Timing.addMonth(to, 1), subject.id)) {
- //try(CashBack_PostingsBySubjectCursor cur = CashBack_PostingsBySubjectCursor.open(from, to, subject.id)) {
- while(cur.next()) {
- //if(cur.tranId == 170705000058848913l)
- // Trace.event(""+cur.tranId + " period:" + cur.period + " params:" + cur.params, Radix::Arte::EventSource:UserFunc);
- // Берем презентменты за два месяца, а авторизации (используем LocalTime) только за один
- //if(cur.LocalTime != null && cur.LocalTime.compareTo(from) >= 0 && cur.LocalTime.compareTo(Timing.addMonth(to, -1)) < 0) {
- if(cur.LocalTime != null && cur.LocalTime.compareTo(from) >= 0 && cur.LocalTime.compareTo(to) < 0) {
- //if (cur.baseAmt*(-1) <= 0) { // игнорируем возвраты
- //continue;
- //}
- //if (cur.token.status == Tx::Tokens::TokenStatus:Closed) { // игнорим закрытые карты
- // continue;
- //}
- if (cur.contractFin.status == Tx::Contracts::Status:Closed || cur.contractFin.status == Tx::Contracts::Status:Finished) { // игнорим только закрытые счета, карты не игнорим
- continue;
- }
- Tran tran = new Tran(cur);
- trans.add(tran); // добавляем транзакцию клиенту
- if (!cards.containsKey(cur.token.id)) { // добавляем транзакцию в карту
- cards.put(cur.token.id, new Card(cur.token));
- }
- Card c = cards.get(cur.token.id);
- c.addTran(tran); // транзакция для расчета оборота
- if (cur.period != null) {
- ignore = false; // не игнорим такого клиента
- CashBackTran cbTran = new CashBackTran(tran, cur);
- c.addCbTran(cbTran, storage); // транзакция для КБ
- }
- }
- }
- }
- // Уходим, если нет КБ транзакций
- if (ignore) { return; }
- jobs.addNewAttrs().set(storage.getVals()); // данные для отчета
- // На этом этапе всё сформировано
- for (Card card : cards.values()) {
- if (card.cbTrans != null && !card.cbTrans.isEmpty()) {
- card.calcRulesAndParams(); // считаем minTurnover, maxCashBack
- card.calcDelta(); // считаем сумму выплаты, учитывая cbRest
- addCashBackRequest(card); // запрос транзакции выплаты КБ
- }
- }
- }
- void addJobTran() {
- rqG.Kind = Tx::Tran::TranKind:Group;
- rqG.OperDay = Timing.getCurrentLocalDate();
- rqG.ProcessorInstId = 1;
- rqG.OriginatorInstId = 1;
- rqG.LifePhase = Tx::Tran::LifePhase:Single;
- rqG.CategoryText = "Возврат CashBack клиенту ";
- rqG.addNewSpecific().addNewGroup();
- }
- void addCashBackRequest(Card card) {
- Str title = "Возврат денежных средств по карте \"" + ((Card)card.token).cardProductRef.title + "\"";
- // Выплачиваем только если есть минимальный оборот по карте
- if (card.isMinTurnover()) {
- // Проходимся по всем счетам
- for (Account acct : card.accts.values()) {
- if (acct.delta != 0 && acct.deltaCcy != 0) {
- rqG.Specific.Group.addNewTran().addNewRequest().set(
- CashBack::rqCashBack(
- card.textTemplate,
- acct.contract,
- acct.delta,
- acct.deltaCcy,
- //acct.contract.mainCcy,
- from,
- to,
- ((Card)card.token).maskedPan
- )
- );
- }
- }
- }
- }
- void addUserAttrs() {
- rqG.addNewUserAttrs();
- //-----------------------------------------------
- TypesXsd:ParamValue pvG = null;
- //-----------------------------------------------
- pvG = rqG.ensureUserAttrs().addNewParamValue();
- pvG.Rid = "subjectRid";
- pvG.Val = subject.rid;
- //-----------------------------------------------
- pvG = rqG.ensureUserAttrs().addNewParamValue();
- pvG.Rid = "subjectFio";
- pvG.Val = subject.calcSubjectTitle();
- }
- // Формируем список всех транзакций для КБ в определенный промежуток времени
- Client(DateTime from, DateTime to) {
- fillTrans();
- }
- @Override
- public String toString() {
- StringBuilder sb = new StringBuilder();
- //-----------------------------------------------
- sb.append("ВСЕ ТРАНЗАКЦИИ (").append(trans.size()).append("): ").append("\n");
- for (Tran tran : trans) {
- sb.append(tran);
- }
- sb.append("\n");
- //-----------------------------------------------
- for (Card card : cards.values()) {
- sb.append(card).append(" ");
- }
- sb.append("\n");
- //-----------------------------------------------
- return sb.toString();
- }
- }
- Client client = new Client(from, to);
- //Trace.warning(client.toString(), Radix::Arte::EventSource:TestCase);
- //long end = System.currentTimeMillis();
- //long time = end - start;
- //Trace.warning("Время выполнения: " + time + " ms", Radix::Arte::EventSource:TestCase);
- //Trace.warning("Карты: " + client, Radix::Arte::EventSource:TestCase);
- return (client.ignore ? null : client.jobs);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement