__init__.py 6.09 KB
import json
import base64
import logging
from datetime import datetime

from opensipkd.base import get_settings, is_devel, get_host
from opensipkd.base.models import flush_row
from pyramid.httpexceptions import HTTPFound
from ..vendor import VendorClass, sha256

log = logging.getLogger(__name__)


class Vendor(VendorClass):  # VendorClass
    def __init__(self, vendor_produk, invoice_det, **kwargs):
        VendorClass.__init__(self, vendor_produk, invoice_det=invoice_det, **kwargs)
        settings = get_settings()

        self.v_produk_kd = vendor_produk.kode
        # self.bank_cd, self.pay_method = self.v_produk_kd.split('-') 
        
        self.url = 'omnipay_va_url' in settings and settings['omnipay_va_url'] or None
        self.merchantid = 'omnipay_merchant_id' in settings and settings['omnipay_merchant_id'] or ''
        self.password = 'omnipay_password' in settings and settings['omnipay_password'] or ''

        self.callback_url = "{}/api/vendor/omnipay/callback".format(get_host())
        self.notify_url = "{}/api/vendor/omnipay/notify".format(get_host())

        #total yang harus dibayarkan = fee vendor+fee agratek + tagihan VA
        self.amt = vendor_produk.harga + invoice_det.amt_sell
        self.orderid = invoice_det.cust_inv_no
        self.verify_key = self.merchantid = 'omnipay_verify_key' in settings and settings['omnipay_verify_key'] or ''
        self.vcode = md5(str(self.amt) + self.merchantid + self.orderid + self.verify_key);

        # customer / agratek_merchant
        customer = self.invoice_det.customer
        if customer:
            self.cust_kd = customer.kode
            self.cust_inv_no = self.invoice_det.cust_inv_no

    def _get_minute_duration(time_stamp):
        datetime_object = datetime.strptime(time_stamp, '%Y%m%d%H%M%S')

        current_datetime = datetime.now().strftime('%Y%m%d%H%M%S')
        current_datetime = datetime.strptime(current_datetime, '%Y%m%d%H%M%S')

        delta_minute = datetime_object - current_datetime

        minute_day = delta_minute.days * 1440
        minute_hour = delta_minute.seconds // 60

        return minute_day + minute_hour

    def _send_data_json(data, apiUrl):
        requestData = data
        host = urlparse(apiUrl)
        hostUrl = host.netloc
        hostPath = host.path
        headers = {"Content-type": "application/json"}

        resp  = requests.post(apiUrl, headers=headers, data=data)

        return resp.text

    def _transform_omnipay_response(omnipay_response):
        plain_omni = omnipay_response

        try:
            omni_resp = json.loads(plain_omni)
        except Exception as e:
            omni_resp = {}

        response_dict = {}

        time_stamp = datetime.now().strftime('%Y%m%d%H%M%S')
        key = sha256("{}{}".format(self.cust_inv_no, time_stamp))
        tx_id = "{}{}".format(self.invoice_det.customer.users.user_name, key)
        response_dict["tx_id"] = tx_id
        response_dict['invoice_no'] = self.invoice_det.cust_inv_no
        response_dict['description'] = self.invoice_det.description

        if 'va' in omni_resp:
            response_dict['code'] = 0
            response_dict['message'] = 'SUCCESS'

            datetime_trans = datetime.strptime(omni_resp['date'], '%Y-%m-%d %H:%M:%S')
            response_dict['trans_date'] = datetime_trans.strftime('%Y%m%d')
            response_dict['trans_time'] = datetime_trans.strftime('%H%M%S')

            va_dict = {}
            va_dict['vacct_no'] = omni_resp['va']
            datetime_due = datetime.strptime(omni_resp['due_date'], '%Y-%m-%d %H:%M:%S')
            va_dict['valid_date'] = datetime_due.strftime('%Y%m%d')
            va_dict['valid_time'] = datetime_due.strftime('%H%M%S')

            response_dict['va'] = va_dict
        else:
            response_dict['code'] = 999
            response_dict['message'] = plain_omni

        return response_dict

    def register(self):
        json_request = {}

        json_request['returnurl'] = self.notify_url
        json_request['merchantid'] = self.merchantid
        
        json_request['orderid'] = self.orderid
        json_request['amount'] = self.amt

        json_request['bill_name'] = self.invoice_det.inv_cust_nm
        json_request['bill_email'] = self.invoice_det.inv_cust_email
        json_request['bill_mobile'] = self.invoice_det.inv_cust_phone
        json_request['bill_desc'] = 'Pembayaran via Virtual Account dari Tuan/Nyonya : ' + json_request['bill_name']

        json_request['expiry_minute'] = self._get_minute_duration(self.invoice_det.inv_time_stamp)

        json_request['vcode'] = self.vcode

        json_request['password'] = self.password

        self.request = json_request
        log.info("Omnipay REQUEST: {}".format(json.dumps(self.request)))

        # send request to omnipay 
        result_data = self._send_data_json(self.url, json.dumps(json_request))

        response = json.loads(result_data)
        self.response = response
        log.info("Omnipay RESPONSE: {}".format(json.dumps(self.response)))

        self.result = self._transform_omnipay_response(self.response)
        log.info("Omnipay RESULT: {}".format(json.dumps(self.result)))

        self.save_log(typ="inquiry")

        return dict(data=self.result)

    def notify(self, data):
        log.info("Omnipay NOTIFY: {}".format(data))
        print('omnipay notify >>>>>>>>>>>>>>>>>')
        print(data)
        # amount = self.invoice_det.amt_sell
        # vend_inv_no = self.invoice_det.vend_inv_no

        # signature = sha256("{mid}{vend_inv_no}{amount}{key}" \
        #                    .format(mid=self.mid, key=self.key, amount=str(amount),
        #                            vend_inv_no=vend_inv_no))
        # # print('>>>>', signature)
        # if merchant_token != signature:
        #     return

        # status = int(data['status'])
        # if status == 0:
        #     # pembayaran sukses
        #     self.status = 1
        # elif status == 1:
        #     # pembayaran gagal / reversal
        #     self.status = 2

        # self.response = data

        # self.result = get_result(self.response, self.pay_method)
        # self.save_log("notify")
        return self.result