Advertisement
Guest User

Untitled

a guest
Oct 18th, 2017
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 29.44 KB | None | 0 0
  1. long start = System.currentTimeMillis();
  2.  
  3. // Всего лишь алиасы
  4. final Contract contract = object;          
  5. final Subject subject = contract.client;  
  6.  
  7. // Используется для удобства
  8. final Person person;
  9. if (subject instanceof Person) { person = (Person) subject;
  10. } else { person = null; }
  11.  
  12. // Берем презентменты за 2 месяца
  13. final DateTime from = DateTime.valueOf(params.get("from").replace("T"," "));   // включительно
  14. //final DateTime to = Timing.addMonth(DateTime.valueOf(params.get("to").replace("T"," ")), 1);        
  15. final DateTime to = DateTime.valueOf(params.get("to").replace("T"," "));
  16. final DateTime minTime = DateTime.valueOf(params.get("minPresentmentTime").replace("T"," "));
  17.  
  18. // Колонки для отчета хранятся в параметре пакетной процедуры
  19. final ArrStr columns = ArrStr.fromValAsStr(params.get("report"));
  20.  
  21.  
  22.  
  23. // batch.createTime используем это время для выбора курса
  24. // добавить сумму в рублях в отчет в формате PDF
  25.  
  26.  
  27.  
  28. class Tran
  29. {
  30.     boolean isCashBack = false;
  31.     boolean isReversal = false;
  32.    
  33.     Tran tran;
  34.     Int mccId;
  35.    
  36.     Contract finContract;
  37.  
  38.     Token token;
  39.     Int tokenId;
  40.     Str cardPan;
  41.    
  42.     Int acctId;
  43.     Num acctAmt;
  44.     Str acctNumber;
  45.     Num baseAmt;
  46.    
  47.     Str cardProductTitle;
  48.     Str issContactTypeTitle;
  49.    
  50.     // todo CardProductTitle
  51.     // todo IssiContactTypeTitle
  52.  
  53.     // Конструктор копирования
  54.     Tran(Tran tran) {
  55.         //Trace.event("tran", Radix::Arte::EventSource:UserFunc);
  56.         this.tran = tran.tran;
  57.         this.mccId = tran.mccId;
  58.         this.token = tran.token;
  59.         this.tokenId = tran.tokenId;
  60.         this.cardPan = tran.cardPan;
  61.        
  62.         this.acctId = tran.acctId;
  63.         this.acctNumber = tran.acctNumber;
  64.         this.acctAmt = tran.acctAmt;
  65.         this.baseAmt = tran.baseAmt;         // если baseAmt из другого Tran - копируем с тем же знаком
  66.         this.finContract = tran.finContract;
  67.  
  68.         this.isCashBack = tran.isCashBack;
  69.         this.isReversal = tran.isReversal;
  70.        
  71.         this.cardProductTitle = tran.cardProductTitle;
  72.         this.issContactTypeTitle = tran.issContactTypeTitle;
  73.     }
  74.    
  75.     // Конструктор на основе текущего состояния курсора
  76.     Tran(CashBack_PostingsBySubjectCursor cur) {
  77.         //Trace.event("tran2", Radix::Arte::EventSource:UserFunc);
  78.         this.tran = cur.tran;
  79.         this.mccId = cur.mccId;
  80.         this.token = cur.token;
  81.         this.tokenId = cur.token.id;
  82.         this.cardPan = cur.crdPan;
  83.        
  84.         this.acctId = cur.acctId;
  85.         this.acctNumber = cur.acctNumber;
  86.         this.acctAmt = (-1) * cur.acctAmt;     // если берем из курсора - правим знак
  87.         this.baseAmt = (-1) * cur.baseAmt;
  88.         this.finContract = cur.contractFin;
  89.        
  90.         this.isCashBack = (cur.period == null ? false : true);   // если null, значит обычная транзакция
  91.         this.isReversal = cur.isReversal.booleanValue();
  92.        
  93.         this.cardProductTitle = cur.tran.custCard.cardProductRef.title;
  94.         this.issContactTypeTitle = cur.tran.custCard.contractType.title;
  95.     }
  96.    
  97.     // Преобразование Tran в строковый тип (для трассы и прочего)
  98.     @Override
  99.     public Str toString() {
  100.         return this.getString(" ");
  101.     }
  102.    
  103.     // Функция, которая используется в выводе выше
  104.     public Str getString(Str delim) {
  105.         return person.lastName + " " + person.firstName + delim
  106.             + tran.id + delim
  107.             + tran.regTime + delim
  108.             + mccId + delim
  109.             + baseAmt + delim
  110.             + tran.regTime + delim
  111.             + (isCashBack ? "CB" : "") + delim
  112.             + "\n";
  113.     }
  114.  
  115. }
  116.  
  117.  
  118. // Наследуемся от обычной транзакции
  119. class CashBackTran extends Tran
  120. {    
  121.     CashBack_Period rules;
  122.     CashBack_Params params;
  123.    
  124.     Num rate, cbAmt, cbAmtCcy;
  125.     Num minTurnover, maxCashBack;
  126.     Num cbSum = 0, cbSumCcy = 0;
  127.     Str textTemplate;
  128.    
  129.     CashBackTran(Tran tran, CashBack_PostingsBySubjectCursor cur) {
  130.         // TODO: Кидать исключение, если, на самом деле, это не КБ транзакция
  131.         super(tran);
  132.         //Trace.event("CashBackTran", Radix::Arte::EventSource:UserFunc);
  133.         // Помним: берем другой Tran - знак не меняем!
  134.        
  135.         this.rules = cur.period;
  136.         if (this.rules != null) {
  137.             this.params = getParams(); // мб null
  138.             //if (this.rules == null) {
  139.                
  140.             //}
  141.            
  142.             this.maxCashBack = (params.maxPayment == null ? Num.ZERO : params.maxPayment);
  143.             this.minTurnover = (params.turnoverAmt == null ? Num.ZERO : params.turnoverAmt);
  144.             //this.rate = (params.percent == null ? Num.ZERO : params.percent);  // мб null
  145.             this.rate = params.percent;
  146.             this.cbAmtCcy = getCashBackAmtCcy();  // мб null
  147.             this.cbAmt = getCashBackAmt();  // мб null
  148.             this.isCashBack = true;   // уже не надо
  149.             this.textTemplate = (rules.categoryText == null ? "" : rules.categoryText);
  150.            
  151.             if (this.params == null) {
  152.                 throw new NullPointerException("params is null");
  153.             }
  154.             if (this.maxCashBack == null) {
  155.                 throw new NullPointerException("maxCashBack is null");
  156.             }
  157.             if (this.minTurnover == null) {
  158.                 throw new NullPointerException("minTurnover is null");
  159.             }
  160.         }
  161.     }
  162.    
  163.     CashBack_Params getParams() {
  164.         for(CashBack_Params params : rules.getParams()){
  165.             return params;
  166.         }
  167.         return null;
  168.     }
  169.  
  170.     Num getCashBackAmt() {
  171.         return (baseAmt * (rate / 100)).setScale(2, java.math.RoundingMode.HALF_UP);
  172.         //Num cbInCcy = (baseAmt * (rate / 100)).setScale(2, java.math.RoundingMode.HALF_UP);
  173.         /*try {
  174.             RateGroup rateGroup = RateGroup.loadByPK(1, false);
  175.             return (rateGroup.convertClient(tran.operDay, tran.operDay, Currency.get(810), Currency.get(tran.custCcy), cbAmtCcy)).setScale(2, java.math.RoundingMode.HALF_UP);
  176.         } catch (Exception e) { Trace.event("КБ. Ошибка при конвертации валюты", Radix::Arte::EventSource:TestCase); };
  177.         return Num.ZERO;*/
  178.     }
  179.    
  180.     // считаем кэшбэк ещё и в валюте
  181.     Num getCashBackAmtCcy() {
  182.         return (acctAmt * (rate / 100)).setScale(2, java.math.RoundingMode.HALF_UP);
  183.     }
  184.    
  185.     Str getCashBackProduct() {
  186.         return (rules != null ?
  187.             rules.neyva__CashBack_Actions.rid + (rules.neyva__CashBack_Actions.variant != null ? "~" + rules.neyva__CashBack_Actions.variant : "") : "-");
  188.     }
  189.    
  190.     // Преобразование CashBackTran в строковый тип (для трассы и прочего)
  191.     @Override
  192.     public Str toString() {
  193.         return this.getString(" ");
  194.     }
  195.    
  196.     // Функция, которая используется в выводе выше
  197.     public Str getString(Str delim) {
  198.         return person.lastName + " " + person.firstName + delim
  199.             //+ (isCashBack ? "TRUE" : "FALSE") + delim
  200.             + tran.id + delim
  201.             + tran.regTime + delim
  202.             + tran.localTime + delim
  203.             + mccId + delim
  204.             + baseAmt + delim
  205.             + rate + "% " + delim
  206.             + cbAmt + delim
  207.             + tran.regTime + delim
  208.             + getCashBackProduct() + delim
  209.             + "\n";
  210.     }
  211.    
  212.     // Функция, которая формирует строку для отчета
  213.     public Str getCSV() {
  214.         StringBuilder sbCSV = new StringBuilder();
  215.         for(Str column : columns){
  216.             switch(column){
  217.                 case "TranId":           sbCSV.append(tran.id);         break;
  218.                 case "Acct":             sbCSV.append(acctNumber);      break;
  219.                 case "TranRegTime":      sbCSV.append(tran.regTime);    break;
  220.                 case "TranOperDay":      sbCSV.append(tran.operDay);    break;
  221.                 case "TranLocalTime":    sbCSV.append(tran.origTime);  break;
  222.                 case "CashBackProduct":  sbCSV.append((rules != null ? rules.neyva__CashBack_Actions.rid + (rules.neyva__CashBack_Actions.variant != null ? "~" + rules.neyva__CashBack_Actions.variant : "") : "-"));    break;
  223.                 case "CardProductTitle":      sbCSV.append(cardProductTitle);  break;        // done CardProductTitle
  224.                 case "IssContactTypeTitle":   sbCSV.append(issContactTypeTitle);  break;    // done IssiContactTypeTitle
  225.                 case "PAN":              sbCSV.append(cardPan);         break;
  226.                 case "MCC":              sbCSV.append(mccId);      break;            // done MccOrig  
  227.                 case "BaseAmt":          sbCSV.append(baseAmt);             break;
  228.                 case "AcctAmt":          sbCSV.append(acctAmt);             break;
  229.                 case "Ccy":              sbCSV.append(finContract.mainCcy); break;        // done acct ccy
  230.                 case "Rate":             sbCSV.append(rate);                break;
  231.                 case "MaxPayment":       sbCSV.append(maxCashBack);         break;
  232.                 case "MinTurnover":      sbCSV.append(minTurnover);         break;
  233.                 case "CB_Amt":           sbCSV.append(cbAmt);               break;
  234.                 case "CB_AmtCcy":        sbCSV.append(cbAmtCcy);               break;
  235.                 case "CB_Sum":           sbCSV.append(cbSum);               break;
  236.                 case "CB_SumCcy":           sbCSV.append(cbSumCcy);               break;
  237.                 case "PersonTitle":      sbCSV.append("(" + subject.calcTitle());             break;
  238.                 default:                 sbCSV.append(column);
  239.             }
  240.             sbCSV.append(";");
  241.         }
  242.         return sbCSV.toString();
  243.     }
  244. }
  245.  
  246.  
  247.  
  248. class Account
  249. {
  250.     Contract contract;
  251.     Num cbAmt;
  252.     Num cbAmtPrev;
  253.    
  254.     Num cbAmtCcy = 0;
  255.     Num cbAmtCcyPrev = 0;
  256.    
  257.     Num delta;
  258.     Num deltaCcy;
  259.    
  260.     java.util.List<Tran> cbTrans = new java.util.ArrayList<Tran>();   // операции за текущий период
  261.     java.util.List<Tran> cbTransPrev = new java.util.ArrayList<Tran>();   // операции за прошлый период
  262.    
  263.     Account() {
  264.         //Trace.event("Account", Radix::Arte::EventSource:UserFunc);
  265.         this.cbAmt = 0;
  266.         this.cbAmtPrev = 0;
  267.         this.delta = 0;
  268.        
  269.         this.cbAmtCcy = 0;
  270.         this.cbAmtPrev = 0;
  271.         this.deltaCcy = 0;
  272.     }
  273.    
  274.     @Override
  275.     public String toString() {
  276.         StringBuilder sbTrans = new StringBuilder();
  277.         //-----------------------------------------------------------
  278.         sbTrans.append("ТРАНЗАКЦИИ ЗА ТЕКУЩИЙ ПЕРИОД:").append("\n");
  279.         for (Tran tran : cbTrans) {
  280.             sbTrans.append(tran);
  281.         }
  282.         sbTrans.append(cbAmt).append("\n");
  283.         sbTrans.append("\n");
  284.  
  285.         //-----------------------------------------------------------
  286.         sbTrans.append("ТРАНЗАКЦИИ ЗА ПРОШЛЫЙ ПЕРИОД:").append("\n");
  287.         for (Tran tran : cbTransPrev) {
  288.             sbTrans.append(tran);
  289.         }
  290.         sbTrans.append(cbAmtPrev).append("\n");
  291.         sbTrans.append("\n");
  292.         //-----------------------------------------------------------
  293.         sbTrans.append("ДЕЛЬТА КБ: ").append(cbAmt).append(" - ").append(cbAmtPrev).append(" = ").append(delta).append("\n");
  294.         //-----------------------------------------------------------
  295.         return sbTrans.toString();
  296.     }
  297. }
  298.  
  299.  
  300.  
  301. class Card
  302. {
  303.     Int tokenId;
  304.     Token token;
  305.     Num turnover = 0;
  306.    
  307.     CashBack_Period rules;
  308.     CashBack_Params params;
  309.     Num minTurnover, maxCashBack;
  310.     Str textTemplate;
  311.    
  312.     Num cbRest = 0;     // остаток КБ, который клиент способен получить
  313.    
  314.     java.util.HashMap<Int,Account> accts = new java.util.HashMap<Int,Account>();
  315.    
  316.     java.util.List<Tran> trans = new java.util.ArrayList<Tran>();   // список всех операций по карте
  317.     java.util.List<CashBackTran> cbTrans = new java.util.ArrayList<CashBackTran>();   // список операций, связанных с КБ
  318.    
  319.     Card(Token token) {
  320.         this.tokenId = token.id;
  321.         this.token = token;  
  322.     }
  323.    
  324.     // Любая транзакция (учет оборота)
  325.     void addTran(Tran tran) {
  326.         // исключаем реверсы без оригинальных транзакций
  327.         boolean correctReverse = false;
  328.         if (tran.isReversal) {
  329.             for (CashBackTran cbTran : cbTrans) {
  330.                 if (tran.tran.prevReversedTran != null && tran.tran.prevReversedTran.id.equals(cbTran.tran.id)) {
  331.                     correctReverse = true;
  332.                     break;
  333.                 }
  334.             }
  335.             if (!correctReverse) {   // игнорим, игнорим, игнорим!
  336.                 return;
  337.             }
  338.         }
  339.          
  340.         trans.add(tran);
  341.         turnover += tran.baseAmt;
  342.     }
  343.    
  344.     // Транзакция кэшбэка
  345.     void addCbTran(CashBackTran tran, UserAttrsStorageHandler storage) {    // передавать storage - это ужасно, нарушаем ООП ;(
  346.         // исключаем реверсы без оригинальных транзакций
  347.         boolean correctReverse = false;
  348.         if (tran.isReversal) {
  349.             for (CashBackTran cbTran : cbTrans) {
  350.                 if (tran.tran.prevReversedTran != null && tran.tran.prevReversedTran.id.equals(cbTran.tran.id)) {
  351.                     correctReverse = true;
  352.                     break;
  353.                 }
  354.             }
  355.             if (!correctReverse) {   // игнорим, игнорим, игнорим!
  356.                 return;
  357.             }
  358.         }
  359.        
  360.         // если счет из транзакции встречается впервые, добавляем его
  361.         if (!accts.containsKey(tran.acctId)) {
  362.             accts.put(tran.acctId, new Account());      
  363.         }
  364.        
  365.         // Закидываем транзакцию по карте в нужый счет, суммируем выплаты
  366.         Account acct = accts.get(tran.acctId);
  367.         if (tran.isCashBack) {
  368.             if (tran.tran.origTime.compareTo(from) >= 0 && tran.tran.origTime.compareTo(minTime) < 0) {
  369.                 acct.contract = tran.finContract;
  370.                 acct.cbTransPrev.add(tran);           // добавляем транзакции в счет (за прошлый период)
  371.                
  372.                 acct.cbAmtPrev += tran.cbAmt;
  373.                 acct.cbAmtCcyPrev += tran.cbAmtCcy;  // валюта
  374.                 //tran.cbSum = cbAmtPrev;
  375.             }
  376.             if (tran.tran.origTime.compareTo(from) >= 0 && tran.tran.origTime.compareTo(to) < 0) {
  377.                 acct.contract = tran.finContract;
  378.                 acct.cbTrans.add(tran);               // добавляем транзакции в счет (за текущий период)
  379.                
  380.                 acct.cbAmt += tran.cbAmt;
  381.                 acct.cbAmtCcy += tran.cbAmtCcy;
  382.                
  383.                 tran.cbSum = acct.cbAmt;
  384.                 /*if (tran.cbSum > tran.maxCashBack) {
  385.                     DateTime now = Timing.getCurrentLocalTime();
  386.                     tran.cbSum = tran.maxCashBack;
  387.                     try {
  388.                         tran.cbSumCcy = tran.finContract.inst.baseRateGroup.convertClient(now, now, Currency.get(810), Currency.get(acct.contract.mainCcy), tran.maxCashBack);
  389.                     } catch (Exception e) {};
  390.                 }*/
  391.                
  392.                 storage.setStr("Tran_" + tran.tran.id, tran.getCSV());   // для отчета
  393.             }
  394.         }
  395.         cbTrans.add(tran);
  396.     }
  397.  
  398.     // Рассчитываем сумму выплаты, учитывая перепривязки счетов,
  399.     // максимально возможный КБ и то, что выплаты происходят два раза в месяц
  400.     void calcDelta() {
  401.         for (Account acct : accts.values()) {
  402.             if (cbRest <= 0 && maxCashBack != 0) {      // если остаток КБ исчерпан, выплаты прекращаем
  403.                 return;
  404.             }
  405.             acct.delta = (acct.cbAmt - acct.cbAmtPrev).max(Num.ZERO);    // зануление дельты при отрицательном значении
  406.             acct.deltaCcy = (acct.cbAmtCcy - acct.cbAmtCcyPrev).max(Num.ZERO);
  407.             Trace.event("cbAmtCcy " + acct.cbAmtCcy + " cbAmtCcyPrev " + acct.cbAmtCcyPrev, Radix::Arte::EventSource:TestCase);
  408.            
  409.             // если выплаты КБ не ограничены, то не используем cbRest
  410.             if (maxCashBack != 0) {
  411.                 if (cbRest < acct.delta) {
  412.                     //Trace.warning("CB REST " + cbRest +  " < ACCT.DELTA " + acct.delta, Radix::Arte::EventSource:TestCase);
  413.                     acct.delta = cbRest;
  414.                     DateTime now = Timing.getCurrentLocalTime();   // поменять 'now' на время запуска пакетной процедуры
  415.                     try {
  416.                         acct.deltaCcy = acct.contract.inst.baseRateGroup.convertClient(now, now, Currency.get(810), Currency.get(acct.contract.mainCcy), cbRest);
  417.                         acct.deltaCcy = acct.deltaCcy.setScale(2, java.math.RoundingMode.HALF_UP);
  418.                     } catch (Exception e) {};                
  419.                 }
  420.                 cbRest -= acct.delta;   // остаток КБ уменьшается при каждой выплате
  421.             }
  422.         }
  423.        
  424.     }
  425.    
  426.     // Когда уже все транзакции добавлены, получаем параметры КБ для определенной карты
  427.     void calcRulesAndParams() {
  428.         //if (cbTrans != null && !cbTrans.isEmpty()) {
  429.             rules = cbTrans.get(0).rules;
  430.             textTemplate = rules.categoryText;
  431.             for (CashBack_Params p : rules.getParams()) {
  432.                 params = p;
  433.                 minTurnover = (params.turnoverAmt == null ? Num.ZERO : params.turnoverAmt);
  434.                 maxCashBack = (params.maxPayment == null ? Num.ZERO : params.maxPayment);
  435.                 cbRest = maxCashBack;
  436.                 break;
  437.             }
  438.        // }
  439.     }
  440.     /*if (rules != null && params != null) {
  441.             return;
  442.         }
  443.         if (cbTrans != null && !cbTrans.isEmpty() && cbTrans.size() >= 1) {
  444.             boolean equal = true;
  445.             if (cbTrans.size() > 1) {
  446.                 for (int i=1; i<cbTrans.size(); ++i) {
  447.                     equal = (cbTrans.get(i).rules.id == cbTrans.get(i-1).rules.id);
  448.                     if (!equal) { break; }
  449.                 }
  450.             }
  451.             if (equal) {
  452.                 this.rules = cbTrans.get(0).rules;
  453.                 for (CashBack_Params p : rules.getParams()) {
  454.                     params = p;
  455.                     minTurnover = (params.turnoverAmt == null ? Num.ZERO : params.turnoverAmt);
  456.                     maxCashBack = (params.maxPayment == null ? Num.ZERO : params.maxPayment);
  457.                     cbRest = maxCashBack;
  458.                     //Trace.warning("Макс. кэшбэк: " + maxCashBack.toString(), Radix::Arte::EventSource:TestCase);
  459.                     //Trace.warning("Мин. оборот: " + minTurnover.toString(), Radix::Arte::EventSource:TestCase);
  460.                    
  461.                     break;
  462.                 }
  463.             }
  464.         }*/
  465.    
  466.     // Достигнут ли минимальный оборот
  467.     boolean isMinTurnover() {
  468.         if (minTurnover != null) {
  469.             return turnover >= minTurnover;
  470.         }
  471.         return false;
  472.     }
  473.    
  474.    
  475.     // Для корректной работы HashSet (не понадобилось, но на всякий случай оставил):
  476.    
  477.     /*@Override
  478.     public boolean equals(Object obj) {
  479.     // не можем сравнивать с null, не можем сравнивать с другими классами
  480.         if (obj == null || obj.getClass() != this.getClass()) {
  481.             return false;
  482.         }
  483.         Card c = (Card) obj;
  484.         return tokenId.equals(c.tokenId);
  485.     }*/
  486.  
  487.     /*@Override
  488.     public int hashCode() {
  489.         return tokenId.hashCode();
  490.     }*/
  491.    
  492.    
  493.     @Override
  494.     public Str toString() {
  495.         StringBuilder sbTrans = new StringBuilder();
  496.         //-----------------------------------------------------------
  497.         sbTrans.append("ВСЕ ТРАНЗАКЦИИ ПО КАРТЕ: (").append(trans.size()).append("): ").append("\n");
  498.         //-----------------------------------------------------------
  499.         sbTrans.append("ОБОРОТ: ").append(turnover).append("\n");
  500.         for (Tran tran : trans) {
  501.             sbTrans.append(tran);
  502.         }
  503.         sbTrans.append("\n");
  504.         //-----------------------------------------------------------
  505.         sbTrans.append("ВСЕ ТРАНЗАКЦИИ ПО КАРТЕ, СВЯЗАННЫЕ С КБ: (").append(cbTrans.size()).append("): ").append("\n");
  506.         for (Tran cbTran : cbTrans) {
  507.             sbTrans.append(cbTran);
  508.         }
  509.         sbTrans.append("\n");
  510.         //-----------------------------------------------------------
  511.         sbTrans.append("СЧЕТА").append("\n");
  512.         for (Account acct : accts.values()) {
  513.             sbTrans.append("- ").append(acct).append("\n");
  514.         }
  515.         sbTrans.append("\n");
  516.         //-----------------------------------------------------------
  517.         return tokenId.toString() + " " + sbTrans.toString();
  518.     }
  519. }
  520.  
  521.  
  522.  
  523. class Client
  524. {
  525.     boolean ignore = true;  // будем игнорить клиента, если у него нет КБ транзакций
  526.    
  527.     TypesXsd:JobRequest jobs = null;
  528.     TranXsd:Request rqG = null;
  529.    
  530.     java.util.List<Tran> trans = new java.util.ArrayList<Tran>();   // список всех транзакций
  531.     java.util.HashMap<Int, Card> cards = new java.util.HashMap<Int, Card>();   // карты клиента
  532.    
  533.     void fillTrans() {
  534.         jobs = TypesXsd:JobRequest.Factory.newInstance();
  535.         rqG = jobs.addNewTran();
  536.        
  537.         addJobTran();          // групповая транзакции          
  538.         addUserAttrs();        // Rid клиента и его ФИО
  539.        
  540.         UserAttrsStorageHandler storage = new UserAttrsStorageHandler();    // для отчета
  541.        
  542.         try(CashBack_PostingsBySubjectCursor cur = CashBack_PostingsBySubjectCursor.open(from, Timing.addMonth(to, 1), subject.id)) {
  543.         //try(CashBack_PostingsBySubjectCursor cur = CashBack_PostingsBySubjectCursor.open(from, to, subject.id)) {
  544.             while(cur.next()) {
  545.                 //if(cur.tranId == 170705000058848913l)
  546.                  // Trace.event(""+cur.tranId + " period:" + cur.period + " params:" + cur.params, Radix::Arte::EventSource:UserFunc);
  547.               // Берем презентменты за два месяца, а авторизации (используем LocalTime) только за один
  548.               //if(cur.LocalTime != null && cur.LocalTime.compareTo(from) >= 0 && cur.LocalTime.compareTo(Timing.addMonth(to, -1)) < 0) {
  549.               if(cur.LocalTime != null && cur.LocalTime.compareTo(from) >= 0 && cur.LocalTime.compareTo(to) < 0) {
  550.                 //if (cur.baseAmt*(-1) <= 0) {   // игнорируем возвраты
  551.                     //continue;
  552.                 //}
  553.                 //if (cur.token.status == Tx::Tokens::TokenStatus:Closed) {  // игнорим закрытые карты
  554.                 //    continue;
  555.                 //}
  556.                 if (cur.contractFin.status == Tx::Contracts::Status:Closed || cur.contractFin.status == Tx::Contracts::Status:Finished) {  // игнорим только закрытые счета, карты не игнорим
  557.                     continue;
  558.                 }
  559.                
  560.                 Tran tran = new Tran(cur);
  561.                 trans.add(tran);   // добавляем транзакцию клиенту  
  562.                 if (!cards.containsKey(cur.token.id)) {  // добавляем транзакцию в карту
  563.                     cards.put(cur.token.id, new Card(cur.token));
  564.                 }
  565.                 Card c = cards.get(cur.token.id);
  566.                
  567.                 c.addTran(tran);                 // транзакция для расчета оборота
  568.                 if (cur.period != null) {
  569.                     ignore = false;        // не игнорим такого клиента
  570.                     CashBackTran cbTran = new CashBackTran(tran, cur);
  571.                     c.addCbTran(cbTran, storage);    // транзакция для КБ
  572.                 }
  573.               }
  574.             }
  575.         }
  576.         // Уходим, если нет КБ транзакций
  577.         if (ignore) { return; }
  578.        
  579.         jobs.addNewAttrs().set(storage.getVals());     // данные для отчета
  580.         // На этом этапе всё сформировано
  581.         for (Card card : cards.values()) {
  582.             if (card.cbTrans != null && !card.cbTrans.isEmpty()) {
  583.                 card.calcRulesAndParams();   // считаем minTurnover, maxCashBack
  584.                 card.calcDelta();            // считаем сумму выплаты, учитывая cbRest
  585.                 addCashBackRequest(card);    // запрос транзакции выплаты КБ
  586.            }
  587.         }
  588.     }
  589.    
  590.     void addJobTran() {
  591.         rqG.Kind = Tx::Tran::TranKind:Group;
  592.         rqG.OperDay = Timing.getCurrentLocalDate();
  593.         rqG.ProcessorInstId = 1;
  594.         rqG.OriginatorInstId = 1;
  595.         rqG.LifePhase = Tx::Tran::LifePhase:Single;
  596.         rqG.CategoryText = "Возврат CashBack клиенту ";
  597.         rqG.addNewSpecific().addNewGroup();
  598.     }
  599.    
  600.     void addCashBackRequest(Card card) {
  601.         Str title = "Возврат денежных средств по карте \"" + ((Card)card.token).cardProductRef.title + "\"";
  602.         // Выплачиваем только если есть минимальный оборот по карте
  603.         if (card.isMinTurnover()) {
  604.             // Проходимся по всем счетам
  605.             for (Account acct : card.accts.values()) {
  606.                 if (acct.delta != 0 && acct.deltaCcy != 0) {
  607.                     rqG.Specific.Group.addNewTran().addNewRequest().set(
  608.                         CashBack::rqCashBack(
  609.                             card.textTemplate,
  610.                             acct.contract,
  611.                             acct.delta,
  612.                             acct.deltaCcy,
  613.                             //acct.contract.mainCcy,
  614.                             from,
  615.                             to,
  616.                             ((Card)card.token).maskedPan
  617.                         )
  618.                     );
  619.                 }
  620.             }
  621.         }
  622.     }
  623.    
  624.     void addUserAttrs() {
  625.         rqG.addNewUserAttrs();
  626.         //-----------------------------------------------
  627.         TypesXsd:ParamValue pvG = null;
  628.         //-----------------------------------------------
  629.         pvG = rqG.ensureUserAttrs().addNewParamValue();    
  630.         pvG.Rid = "subjectRid";                
  631.         pvG.Val = subject.rid;
  632.         //-----------------------------------------------
  633.         pvG = rqG.ensureUserAttrs().addNewParamValue();    
  634.         pvG.Rid = "subjectFio";                
  635.         pvG.Val = subject.calcSubjectTitle();
  636.     }
  637.  
  638.     // Формируем список всех транзакций для КБ в определенный промежуток времени
  639.     Client(DateTime from, DateTime to) {
  640.         fillTrans();
  641.     }
  642.  
  643.     @Override
  644.     public String toString() {
  645.         StringBuilder sb = new StringBuilder();
  646.         //-----------------------------------------------
  647.         sb.append("ВСЕ ТРАНЗАКЦИИ (").append(trans.size()).append("): ").append("\n");
  648.         for (Tran tran : trans) {
  649.             sb.append(tran);
  650.         }
  651.         sb.append("\n");
  652.         //-----------------------------------------------
  653.         for (Card card : cards.values()) {
  654.             sb.append(card).append(" ");
  655.         }
  656.         sb.append("\n");
  657.         //-----------------------------------------------
  658.         return sb.toString();
  659.     }
  660. }
  661.  
  662.  
  663.  
  664. Client client = new Client(from, to);
  665.  
  666. //Trace.warning(client.toString(), Radix::Arte::EventSource:TestCase);
  667.  
  668. //long end = System.currentTimeMillis();
  669. //long time = end - start;
  670. //Trace.warning("Время выполнения: " + time + " ms", Radix::Arte::EventSource:TestCase);
  671. //Trace.warning("Карты: " + client, Radix::Arte::EventSource:TestCase);
  672.  
  673.  
  674. return (client.ignore ? null : client.jobs);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement