Untitled

mail@pastecode.io avatarunknown
plain_text
23 days ago
17 kB
4
Indexable
Never
package com.dwidasa.engine.service.impl.view;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

import org.apache.commons.lang.StringUtils;
import org.joda.time.DateTime;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.dwidasa.engine.dao.TransactionDao;
import com.dwidasa.engine.model.Teller;
import com.dwidasa.engine.model.Transaction;
import com.dwidasa.engine.model.view.BaseView;
import com.dwidasa.engine.model.view.KeyValueView;
import com.dwidasa.engine.model.view.MpnPaymentView;
import com.dwidasa.engine.service.CacheManager;
import com.dwidasa.engine.service.TellerService;
import com.dwidasa.engine.service.view.MessageCustomizer;
import com.dwidasa.engine.service.view.MpnPaymentViewService;
import com.dwidasa.engine.util.RandomGenerator;

@Service("mpnPaymentViewService")
public class MpnPaymentViewServiceImpl extends PaymentViewServiceImpl implements MpnPaymentViewService {
	
	@Autowired
	private CacheManager cacheManager;
	
	@Autowired
	private TransactionDao transactionDao;
	
	@Autowired
    protected TellerService tellerService;
	
    public MpnPaymentViewServiceImpl() {
        super();

        setInquiryMessageCustomizer(new InquiryMessageCustomizer());
        setTransactionMessageCustomizer(new TransactionMessageCustomizer());
        setTransactionTimeoutMessageCustomizer(new TransactionTimeoutMessageCustomizer());
    }
    
    @Override
    public void composeReprint(BaseView view, Transaction transaction,
    		Transaction ot) {
    	MpnPaymentView tv = (MpnPaymentView) view;
    	transaction.setFreeData1(tv.getBit48());
        transaction.setFreeData5(tv.getCustomerReference());   
        if (tv.getBit120() == null) {
        	tv.setBit120("");
        }
        
        
        transaction.setFreeData4("BILLER.MPN2.REINQ");
        transaction.setFreeData2(tv.getBit120());//bit 120 dipakai untuk kirim user teller
        transaction.setValueDate(tv.getSettlementDate());
        transaction.setStan(new BigDecimal(tv.getStan()));
        transaction.setReferenceNumber(tv.getReferenceNumber());
        transaction.setFreeData6(tv.getBit63());
        transaction.setFreeData7(tv.getNamaBranch());
        transaction.setTglBit12(tv.getTransactionDate());
    }
    
    @Override
    public Boolean decomposeReprint(BaseView view, Transaction transaction) {
    	MpnPaymentView tv = (MpnPaymentView) view;
        getInquiryMessageCustomizer().decompose(view, transaction);
        String bit48 = transaction.getFreeData1();
        
        if (tv.getCustomerReference().startsWith("0") || tv.getCustomerReference().startsWith("1") || 
        		tv.getCustomerReference().startsWith("2") || tv.getCustomerReference().startsWith("3")) { //DJP
        	int bit48Length = bit48.length();
            tv.setNtpn(bit48.substring(241, bit48Length).trim());
        } else if (tv.getCustomerReference().startsWith("4") || tv.getCustomerReference().startsWith("5") || 
        		tv.getCustomerReference().startsWith("6")) { //DJBC
        	tv.setNtpn(bit48.substring(118,134).trim());
        } else if (tv.getCustomerReference().startsWith("7") || tv.getCustomerReference().startsWith("8") || 
        		tv.getCustomerReference().startsWith("9")) { //DJA
        	tv.setNtpn(bit48.substring(61,77).trim());
        }
        
        tv.setStan(transaction.getStan().toString());
        tv.setResponseCode(transaction.getResponseCode());
        tv.setReferenceNumber(transaction.getReferenceNumber());
        transaction.setApprovalNumber(tv.getNtpn());
        return Boolean.TRUE;
    }

    private class InquiryMessageCustomizer implements MessageCustomizer {
        private InquiryMessageCustomizer() {
        }
        
        public void compose(BaseView view, Transaction transaction) {
            MpnPaymentView tv = (MpnPaymentView) view;
                     
            transaction.setFreeData5(tv.getCustomerReference());
            if (tv.getBit120() == null) {
            	tv.setBit120("");
            }
            transaction.setFreeData2(tv.getBit120());//bit 120 dipakai untuk kirim user teller
            transaction.setFreeData4("BILLER.MPN2.INQ");
            if (tv.getBit56().equals("BILLER.MPN2.REINQ")) transaction.setFreeData4("BILLER.MPN2.REINQ");

            //save settlement date
            String cutOffMpn = cacheManager.getParameterValue("MPN_CUT_OFF");
            int hh = Integer.parseInt(cutOffMpn.substring(0, cutOffMpn.indexOf(":")));
            int mm = Integer.parseInt(cutOffMpn.substring(cutOffMpn.indexOf(":") + 1));
            DateTime cutOff = new DateTime().withTime(hh, mm, 0, 0);
            DateTime tanggalBuku = new DateTime().withTime(0, 0, 0, 0);
            Calendar calendar = Calendar.getInstance();
            //hari senin-jumat
            String[] strDays = new String[]{
                              "Sunday",
                              "Monday",
                              "Tuesday",
                              "Wednesday",
                              "Thusday",
                              "Friday",
                              "Saturday"
                            };
           
            //Day_OF_WEEK starts from 1 while array index starts from 0      
            System.out.println("Current day is : " +strDays[calendar.get(Calendar.DAY_OF_WEEK) - 1]);
            System.out.println("current cut off is : "+cutOff.toDate());
            if (transaction.getTransactionDate().after(cutOff.toDate())) {
            	
            	if(strDays[calendar.get(Calendar.DAY_OF_WEEK) - 1].equals("Friday")){
            		tanggalBuku = tanggalBuku.plusDays(3);
                }
            	else 
                if(strDays[calendar.get(Calendar.DAY_OF_WEEK) - 1].equals("Saturday")){
            		tanggalBuku = tanggalBuku.plusDays(2);
                }
                else{
                	tanggalBuku = tanggalBuku.plusDays(1);
                }
            }
            
            tv.setSettlementDate(tanggalBuku.toDate());
            transaction.setValueDate(tanggalBuku.toDate());
            transaction.setFreeData6(tv.getKodeBranch());
            transaction.setFreeData7(tv.getNamaBranch());
            System.out.println("ini tes coba accountType = "+tv.getAccountType());
            if(tv.getAccountType().equals("10")) {
            	transaction.setMerchantType("7012");//pembayaran mpn cash
            }else if(tv.getAccountType().equals("40")) {
            	transaction.setMerchantType("7016");//pembayaran mpn overbook
            }
            
            String referenceNumber = RandomGenerator.generateRrnMpn(12);
            transaction.setReferenceNumber(referenceNumber);
//            tv.setReferenceNumber(referenceNumber);
            System.out.println("refNumber : "+transaction.getReferenceNumber());
        }

        public Boolean decompose(Object view, Transaction transaction) {
            MpnPaymentView tv = (MpnPaymentView) view;
            String bit48 = transaction.getFreeData1();
            tv.setBit48(bit48);
            tv.setAmount(transaction.getTransactionAmount());
            
            List<KeyValueView> inquiryList = new ArrayList<KeyValueView>();
            tv.setInquiryList(inquiryList);
            
            if (tv.getCustomerReference().startsWith("0") || tv.getCustomerReference().startsWith("1") ||
                    tv.getCustomerReference().startsWith("2") || tv.getCustomerReference().startsWith("3")) { //DJP
                inquiryList.add(new KeyValueView("npwp", bit48.substring(0,16).trim()));
                inquiryList.add(new KeyValueView("namaWajibPajak", bit48.substring(16,141).trim()));
                inquiryList.add(new KeyValueView("alamatWajibPajak", bit48.substring(141,191).trim()));
                inquiryList.add(new KeyValueView("jumlahDetail", bit48.substring(191,193).trim()));
//                inquiryList.add(new KeyValueView("kodeJenisSetoran", bit48.substring(121,124).trim()));
//                inquiryList.add(new KeyValueView("masaPajak", bit48.substring(124,132).trim()));
//                inquiryList.add(new KeyValueView("nomorSk", bit48.substring(132,147).trim()));
//                inquiryList.add(new KeyValueView("nop", bit48.substring(147,165).trim()));
            } else if (tv.getCustomerReference().startsWith("4") || tv.getCustomerReference().startsWith("5") ||
                    tv.getCustomerReference().startsWith("6")) { //DJBC
                inquiryList.add(new KeyValueView("namaWajibBayar", bit48.substring(0,50).trim()));
                inquiryList.add(new KeyValueView("idWajibBayar", bit48.substring(50,70).trim()));
                inquiryList.add(new KeyValueView("jenisDokumen", bit48.substring(70,72).trim()));
                inquiryList.add(new KeyValueView("nomorDokumen", bit48.substring(72,102).trim()));
                inquiryList.add(new KeyValueView("tanggalDokumen", bit48.substring(102,112).trim()));
                inquiryList.add(new KeyValueView("kodeKppbc", bit48.substring(112,118).trim()));
            } else if (tv.getCustomerReference().startsWith("7") || tv.getCustomerReference().startsWith("8") ||
                    tv.getCustomerReference().startsWith("9")) { //DJA
                inquiryList.add(new KeyValueView("namaWajibBayar", bit48.substring(0,50).trim()));
                inquiryList.add(new KeyValueView("kl", bit48.substring(50,53).trim()));
                inquiryList.add(new KeyValueView("unitEselonI", bit48.substring(53,55).trim()));
                inquiryList.add(new KeyValueView("kodeSatker", bit48.substring(55,61).trim()));
            }
            tv.setTotal(tv.getAmount().add(tv.getFee()));
            //tv.setKodeBranch(transaction.getFreeData6());
            tv.setReferenceNumber(transaction.getReferenceNumber());
            System.out.println("refNumber dec:"+tv.getReferenceNumber());
            return Boolean.TRUE;
        }
    }
    private class TransactionMessageCustomizer implements MessageCustomizer {
        private TransactionMessageCustomizer() {
        }

        public void compose(BaseView view, Transaction transaction) {
            MpnPaymentView tv = (MpnPaymentView) view;
            
            transaction.setFreeData1(tv.getBit48());
            transaction.setFreeData5(tv.getCustomerReference());
            transaction.setTransactionAmount(tv.getTotal());//set amount di bit4
            transaction.setTransactionAmountBit5(tv.getTotal());//set amount di bit5
            if (tv.getBit120() == null) {
            	tv.setBit120("");
            }
            System.out.print("++++++++++++++++++++++++++ "+ tv.getUserTeller() +" +++++++++++++++++++++++++\n");
            Teller teller = tellerService.get(tv.getUserTeller());
            
            transaction.setFreeData1(tv.getBit48());
//            transaction.setFreeData2(tv.getBit120());//bit 120 dipakai untuk kirim user teller
            transaction.setFreeData2(StringUtils.rightPad(teller.getUsername(), 10) + StringUtils.rightPad(teller.getPassword(), 15)+ StringUtils.rightPad(teller.getBranchCode(), 11));
            transaction.setFreeData4("BILLER.MPN2.POS");
            //save settlement date
            String cutOffMpn = cacheManager.getParameterValue("MPN_CUT_OFF");
            int hh = Integer.parseInt(cutOffMpn.substring(0, cutOffMpn.indexOf(":")));
            int mm = Integer.parseInt(cutOffMpn.substring(cutOffMpn.indexOf(":") + 1));
            DateTime cutOff = new DateTime().withTime(hh, mm, 0, 0);
            DateTime tanggalBuku = new DateTime().withTime(0, 0, 0, 0);
            Calendar calendar = Calendar.getInstance();
            //hari senin-jumat
            String[] strDays = new String[]{
                              "Sunday",
                              "Monday",
                              "Tuesday",
                              "Wednesday",
                              "Thusday",
                              "Friday",
                              "Saturday"
                            };
           
            //Day_OF_WEEK starts from 1 while array index starts from 0      
            System.out.println("Current day is : " +strDays[calendar.get(Calendar.DAY_OF_WEEK) - 1]);
            if (transaction.getTransactionDate().after(cutOff.toDate())) {
            	
            	if(strDays[calendar.get(Calendar.DAY_OF_WEEK) - 1].equals("Friday")){
            		tanggalBuku = tanggalBuku.plusDays(3);
                }
            	else 
                if(strDays[calendar.get(Calendar.DAY_OF_WEEK) - 1].equals("Saturday")){
            		tanggalBuku = tanggalBuku.plusDays(2);
                }
                else{
                	tanggalBuku = tanggalBuku.plusDays(1);
                }
            }
            tv.setSettlementDate(tanggalBuku.toDate());
            transaction.setValueDate(tanggalBuku.toDate());
            transaction.setFreeData6(tv.getKodeBranch());
            transaction.setFreeData7(tv.getNamaBranch());
            if(tv.getAccountType().equals("10")) {//pembayaran mpn cash
            	transaction.setMerchantType("7012");
            }else if(tv.getAccountType().equals("40")) {//pembayaran mpn overbook
            	transaction.setMerchantType("7016");
            }
            
            String referenceNumber = RandomGenerator.generateRrnMpn(12);
            transaction.setReferenceNumber(referenceNumber);
            tv.setReferenceNumber(referenceNumber);
        }

        public Boolean decompose(Object view, Transaction transaction) {
            MpnPaymentView tv = (MpnPaymentView) view;
            getInquiryMessageCustomizer().decompose(view, transaction);
            String bit48 = transaction.getFreeData1();
            //String bit63 = transaction.getFreeData6();
            
            if (tv.getCustomerReference().startsWith("0") || tv.getCustomerReference().startsWith("1") || 
            		tv.getCustomerReference().startsWith("2") || tv.getCustomerReference().startsWith("3")) { //DJP
            	int bit48Length = bit48.length();
                tv.setNtpn(bit48.substring(241, bit48Length).trim());
            } else if (tv.getCustomerReference().startsWith("4") || tv.getCustomerReference().startsWith("5") || 
            		tv.getCustomerReference().startsWith("6")) { //DJBC
            	tv.setNtpn(bit48.substring(118,134).trim());
            } else if (tv.getCustomerReference().startsWith("7") || tv.getCustomerReference().startsWith("8") || 
            		tv.getCustomerReference().startsWith("9")) { //DJA
            	tv.setNtpn(bit48.substring(61,77).trim());
            }
            
            tv.setStan(transaction.getStan().toString());
            tv.setResponseCode(transaction.getResponseCode());
            tv.setReferenceNumber(transaction.getReferenceNumber());            
            tv.setNoArsipCore(transaction.getFreeData4());
            //tv.setKodeBranch(bit63.toString().trim());
            
            //save settlement date
//            String cutOffMpn = cacheManager.getParameterValue("MPN_CUT_OFF");
//            int hh = Integer.parseInt(cutOffMpn.substring(0, cutOffMpn.indexOf(":")));
//            int mm = Integer.parseInt(cutOffMpn.substring(cutOffMpn.indexOf(":") + 1));
//            DateTime cutOff = new DateTime().withTime(hh, mm, 0, 0);
//            DateTime tanggalBuku = new DateTime().withTime(0, 0, 0, 0);
//            if (transaction.getTransactionDate().after(cutOff.toDate())) {
//            	tanggalBuku = tanggalBuku.plusDays(1);
//            }
//            tv.setSettlementDate(tanggalBuku.toDate());
//            transaction.setValueDate(tanggalBuku.toDate());
//            transaction.setApprovalNumber(tv.getNtpn());
            tv.setSettlementDate(transaction.getValueDate());
            transaction.setApprovalNumber(tv.getNtpn());
            return Boolean.TRUE;
        }
    }

    private class TransactionTimeoutMessageCustomizer implements MessageCustomizer {

		@Override
		public void compose(BaseView view, Transaction transaction) {
			// TODO Auto-generated method stub
			
		}

		@Override
		public Boolean decompose(Object view, Transaction transaction) {
			MpnPaymentView tv = (MpnPaymentView) view;
			tv.setStan(transaction.getStan().toString());
			tv.setNoArsipCore(transaction.getFreeData4());
			return null;
		}
    	
    }
}