90 lines
2.5 KiB
Python
90 lines
2.5 KiB
Python
from ahserver.serverenv import ServerEnv
|
|
from sqlor.dbpools import DBPools
|
|
from appPublic.log import debug, exception
|
|
|
|
class PricingProgram:
|
|
def __init__(self, ppid, sor):
|
|
self.ppid = ppid
|
|
self.sor = sor
|
|
|
|
async def init(self):
|
|
await self.get_program()
|
|
await self.get_pricing_type(self.ptid)
|
|
|
|
async def get_program(self):
|
|
recs = await self.sor.R('pricing_program', {'id': self.ppid})
|
|
if len(recs):
|
|
self.__dict__.update(recs[0])
|
|
|
|
async def get_pricing_type(self, ptid):
|
|
self.pricing_type = await self.sor.R('pricing_type',
|
|
{'id': ptid})
|
|
|
|
async def get_items(self):
|
|
recs = await self.sor.R('pricing_item', {'ppid': self.id})
|
|
return recs
|
|
|
|
async def get_specs(self):
|
|
recs = await self.sor.R('pricing_spec', {'ptid': self.psid})
|
|
return recs
|
|
|
|
async def get_spec_by_id(self, psid):
|
|
recs = await self.sor.R('pricing_spec', {'id': psid})
|
|
if len(recs) > 0:
|
|
return recs[0]
|
|
return None
|
|
|
|
async def get_pricing_specs_by_ppid(ppid):
|
|
env = ServerEnv()
|
|
dbname = env.get_module_dbname('pricing')
|
|
db = DBPools()
|
|
async with db.sqlorContext(dbname) as sor:
|
|
pp = PricingProgram(ppid, sor)
|
|
await pp.init()
|
|
return await pp.get_specs()
|
|
return []
|
|
|
|
async def get_remote_pricing(sor, charge, data):
|
|
env = ServerEnv()
|
|
get_callerid = env.get_callerid
|
|
userid = await get_callerid(self.ownerid)
|
|
uapi = UAPI()
|
|
ret = await uapi.call(charge.upappid, charge.apiname,
|
|
userid, params=data)
|
|
d = json.loads(ret.decode('utf-8'))
|
|
return d
|
|
|
|
async def pricing_program_charging(sor, pricing_program_id, data):
|
|
pp = PricingProgram(pricing_program_id, sor)
|
|
await pp.init()
|
|
pp_items = await pp.get_items()
|
|
charges = []
|
|
for item in pp_items:
|
|
charge = item.copy()
|
|
spec = await pp.get_spec_by_id(charge.psid)
|
|
d = data.get(spec.spec_name)
|
|
if d is None:
|
|
continue
|
|
cnt = data.get(spec.count_name, 1)
|
|
if spec.pricing_spec_mode == 'spec_name':
|
|
if d == item.spec_value:
|
|
change[spec.count_name] = cnt
|
|
charge.amount = item.pricing_amount * cnt
|
|
charges.append(charge)
|
|
elif spec.pricing_spec_mode == 'spec_amount':
|
|
if charge.pricing_unit is None or charge.pricing_unit < 1:
|
|
charge.pricing_unit = 1
|
|
charge.amount = d * charge.pricing_amount / charge.pricing_unit
|
|
charge[spec.spec_name] = d
|
|
charges.append(charge)
|
|
elif spec.pricing_spec_mode == 'remote_pricing':
|
|
charge.amount = await get_remote_pricing(sor, charge, params=d)
|
|
charges.append(charge)
|
|
elif spec.pricing_spec_mode == 'spec_subtype':
|
|
sub_charges = await pricing_program_chargeing(self.sor,
|
|
charge.subppid, d)
|
|
charges += sub_charges
|
|
|
|
return charges
|
|
|