vendor.py 6.83 KB
"""
Module proses:
Save
Invoice To Vendor
Invoice To Customer
"""

import hashlib
import json
import re
from datetime import datetime
from importlib import import_module

import colander
import requests
import xmltodict
from deform import widget, Form, ValidationFailure
# from opensipkd.pasar.models import PartnerLog
from pyramid.httpexceptions import HTTPFound
from pyramid.view import view_config

from . import BaseView  # , save_file_upload
from ..models import (DBSession, flush_row, Partner, PartnerProduk, H2hArInvoiceDet)
from ..models import (Produk, ProdukKategori)
from ..tools import (btn_next, date_from_str, get_settings, btn_reset,
                     btn_inquiry, btn_advice, btn_payment, get_jsonrpc)

from ..tools import log


class VendorClass(object):
    def __init__(self, vendor_produk, invoice_det, **kwargs):
        """
        :param vendor_produk:
        :param bill_no:
        :param customer_id:
        :param cust_trx:
        :param row:
        """
        self.settings = get_settings()
        self.vendor_produk = vendor_produk
        self.invoice_det = invoice_det
        self.v_produk_kd = vendor_produk.kode
        self.kategori = vendor_produk.produk.kategori.kode
        self.id_pel = invoice_det and invoice_det.id_pel or None
        self.request = None
        self.response = None
        self.result = None
        self.vend_inv_no = invoice_det and invoice_det.vend_inv_no or None
        self.status = invoice_det and invoice_det.status or 0

        self.serial_number = invoice_det and hasattr(invoice_det, 'serial_number') \
                             and invoice_det.serial_number or None
        self.amt_buy = 0
        self.amt_sell = 0
        self.discount = 0
        self.trx_id = 0
        
    def set_response(self, data=None, message=None, code=999, typ="inquiry"):
        if not data and message:
            message = message and message or "No Response From Biller"
            data = dict(code=code,
                        message=message)

        self.result = data
        self.save_log(typ)
        log.info("Result: %s" % data)
        return data

    def set_success(self, data=None, typ="payment"):
        self.status = 1
        data = data and data or {}
        data.update(dict(code=0,
                         message="SUCCESS",
                         status="SUCCESS"))
        return self.set_response(data, typ=typ)

    def set_failed(self, data=None, message=None, typ="payment"):
        self.status = -3
        data = data and data or {}
        message = message and message or "FAILED"
        data.update(dict(code=13,
                         message=message,
                         status="FAILED"))
        return self.set_response(data, typ=typ)

    def set_double(self, data=None, message=None, typ="payment"):
        self.status = -3
        message = message and message or "DOUBLE"
        data = data and data or {}
        data.update(dict(code=67,
                         message=message,
                         status="FAILED"))
        return self.set_response(data, typ=typ)

    def set_pending(self, data=None, message=None, typ="payment"):
        data = data and data or {}
        message = message and message or "PENDING"
        data.update(dict(code=68,
                         status="PENDING",
                         message=message)
                    )
        return self.set_response(data, typ=typ)

    def get_price(self, pokok=0):
        product_id = self.invoice_det.produk_id
        self.amt_buy = pokok+self.vendor_produk.harga
        if hasattr(self.invoice_det, "customer_id"):
            customer_id = self.invoice_det.customer_id
        else:
            customer_id = self.invoice_det.h2h_ar_invoice.customer_id

        harga = pokok+self.vendor_produk.produk.harga
        self.discount = PartnerProduk.get_discount(customer_id, product_id)
        self.amt_sell = harga - self.discount
        return dict(
            subtotal=int(harga),
            discount=int(self.discount),
            total=int(self.amt_sell)
        )

    def save_log(self, typ):
        self.invoice_det.status = self.status
        if hasattr(self.invoice_det, 'serial_number'):
            self.invoice_det.serial_number = self.serial_number

        if self.vend_inv_no:
            self.invoice_det.vend_inv_no = self.vend_inv_no

        if self.amt_buy:
            self.invoice_det.amt_buy = self.amt_buy

        if self.amt_sell:
            self.invoice_det.amt_sell = self.amt_sell

        if typ == 'inquiry':
            self.invoice_det.inquiry = dict(request=self.request,
                                            response=self.response,
                                            result=self.result)
        elif typ == 'payment':
            self.invoice_det.payment = dict(request=self.request,
                                            response=self.response,
                                            result=self.result)
        elif typ == 'advice':
            self.invoice_det.advice = dict(request=self.request,
                                           response=self.response,
                                           result=self.result)
        elif typ == 'info':
            self.invoice_det.info = dict(request=self.request,
                                         response=self.response,
                                         result=self.result)

        flush_row(self.invoice_det)


# class Other(object):
#     def __init_subclass__(self, **kwargs):
#         self.settings = get_settings()
#         vendor_produk = "vendor_produk" in kwargs and kwargs["vendor_produk"] or None
#         self.vendor_id = vendor_produk.partner_id
#         self.produk_id = vendor_produk.produk_id
#         self.v_produk_kd = vendor_produk.kode
#         self.produk_kd = vendor_produk.produk.kode
#         self.kategori = vendor_produk.produk.kategori.nama
#         values = "values" in kwargs and kwargs["values"] or None
#         # self.bill_no = bill_no
#         self.customer_id = 'customer_id' in values and values['customer_id'] or None
#         self.cust_trx = 'cust_trx' in values and values['cust_trx'] or None
#         row = 'row' in values and values['row'] or None
#         self.partner_log = row
#         self.partner_log_id = row and row.id or None
#
#         self.status = row and row.status or 0
#         self.amt_buy = row and row.amt_buy or 0
#         self.amt_sell = row and row.amt_sell or 0
#         self.cust_trx = row and row.cust_trx or ""
#         self.vend_trx = row and row.vend_trx or ""
#
#         self.response = None
#         self.request = None
#
#     #     bill_no, customer_id = customer_id,
#     #     cust_trx_id = cust_trx_id, row = row,
#     #
#
#     def get_product(self):
#         pass
#
#     def inquiry(self):
#         pass
#
#     def payment(self):
#         pass


def sha256(hash_string):
    return hashlib.sha256(hash_string.encode()).hexdigest()