This commit is contained in:
yumoqing 2026-01-05 17:39:55 +08:00
parent 99a592fb54
commit a78eae8664
4 changed files with 29 additions and 73 deletions

View File

@ -49,7 +49,7 @@ class Accounting:
async def setup_all_accounting_legs(self):
self.accounting_legs = []
debug(f'{self.callers=}')
for caller in self.callers:
for i, caller in ienumerate(self.callers):
self.caller = caller
self.curdate = caller.curdate
self.realtimesettled = False
@ -64,18 +64,20 @@ class Accounting:
self.own_salemode = None
self.reseller_salemode = None
self.variable = caller.variable
await self.setup_accounting_legs()
await self.setup_accounting_legs(i)
legs = sorted(
self.accounting_legs,
key=lambda x: (
x.get('accounting_orgid','0'),
x.get('accid', '0'),
x.get('orgid'),
x.get('subjectid'),
0 if x.get('acc_dir', '0') == x.get('balance_at', '0') else 1
)
)
self.accounting_legs = legs
self.get_legs_account()
async def setup_accounting_legs(self):
async def setup_accounting_legs(self, pos):
sor = self.sor
action = self.action.split('_')[0]
acfg = await get_accounting_config(self.sor)
@ -84,6 +86,7 @@ class Accounting:
debug(f'{legs=}')
rev = self.action.endswith('_REVERSE')
for l in legs:
l['position'] = pos
if rev:
l['acc_dir'] = DEBT if l['accounting_dir'] == CREDIT else CREDIT
else:
@ -110,17 +113,27 @@ class Accounting:
orgid = await self.caller.get_orgid_by_trans_role(sor, l, l.orgtype)
org1id = None if l.org1type is None else \
await self.caller.get_orgid_by_trans_role(sor, l, l.org1type)
acc = await get_account(sor, accounting_orgid, orgid, l.subjectid, org1id=org1id)
if acc is None:
debug(f'can not get accountid {accounting_orgid=}, {orgid=},{l.subjectid=}, {org1id=}, {l=}, {self.customerid=},{self.resellerid=},{self.providerid=}')
raise AccountIdNone(accounting_orgid, orgid, l['subjectid'])
l['accounting_orgid'] = accounting_orgid
l['orgid'] = orgid
l['org1id'] = org1id
self.accounting_legs += legs
def get_legs_account(self):
sor = self.sor
oldk = ''
acc = None
for l in self.accounting_legs:
k = f'{l.accounting_orgid}|{l.orgid}|{l.subjectid}|{l.org1id=org1id}'
if oldk != k:
acc = await get_account(sor, l.accounting_orgid, l.orgid,
l.subjectid, l.org1id=org1id, update=True)
if acc is None:
debug(f'can not get accountid {accounting_orgid=}, {orgid=},{l.subjectid=}, {org1id=}, {l=}, {self.customerid=},{self.resellerid=},{self.providerid=}')
raise AccountIdNone(accounting_orgid, orgid, l['subjectid'])
oldk = k
l['accid'] = acc.id
l['balance_at'] = acc.balance_at
l['acc'] = acc
self.accounting_legs += legs
def check_accounting_balance(self, legs):
debt_balance = 0.0
@ -136,7 +149,7 @@ class Accounting:
else:
acc_balance += l['amount']
if acc_balance < 0.000000:
e = AccountOverDraw(curacc, acc['balance'], leg['amount'])
e = AccountOverDraw(curacc, l['acc'].balance, leg['amount'])
exception(f'{e},{legs=}')
raise e
l['new_balance'] = acc_balance

View File

@ -13,9 +13,7 @@ async def get_account(sor, accounting_orgid, orgid, subjectid, org1id=None, upda
sql = """select
a.*,
case when b.balance is null then 0.00 else b.balance end as balance
from account a left join acc_balance b
on a.id = b.accountid
from account a
where
a.subjectid = ${subjectid}$ and
a.accounting_orgid = ${accounting_orgid}$ and
@ -38,48 +36,14 @@ where
return None
return recs[0]
async def get_account_by_subjectname(sor, accounting_orgid, orgid, subjectname, org1id=None):
ss = "a.org1id is NULL"
if org1id:
ss = "a.org1id = ${org1id}$"
sql = """select * from account a, subject b
where
a.subjectid = b.id and
b.name = ${subjectname}$ and
a.accounting_orgid = ${accounting_orgid}$ and
a.orgid = ${orgid}$ and
""" + ss
recs = await sor.sqlExe(sql, {
"accounting_orgid":accounting_orgid,
"orgid":orgid,
"org1id":org1id,
"subjectname":subjectname
});
if len(recs) == 0:
return None
for rec in recs:
if a.org1id == org1id:
return rec['id']
return None
async def getAccountByName(sor, accounting_orgid, orgid, name, org1id):
sql = """select a.* from account a, subject b
where a.subjectid = b.id and
a.accounting_orgid = ${accounting_orgid}$ and
a.orgid = ${orgid}$ and
b.name = ${name}$"""
sql = """select a.* from subject a where a.name = ${name}$"""
recs = await sor.sqlExe(sql, {
"accounting_orgid":accounting_orgid,
"orgid":orgid,
"name":name
});
if len(recs) == 0:
return None
for rec in recs:
if rec.org1id == org1id:
return rec['id']
return None
return get_account(sor, accounting_orgid, orgid, recs[0].id, org1id=org1id)
async def getTransPayMode():
pass
@ -103,13 +67,13 @@ async def getCustomerBalance(sor, customerid):
return balance
async def getAccountBalance(sor, accounting_orgid, orgid, subjectname, org1id):
accid = await getAccountByName(sor, accounting_orgid,
acc = await getAccountByName(sor, accounting_orgid,
orgid,
subjectname,org1id)
if accid is None:
debug(f'accid is None, {accounting_orgid=}, {orgid=}, {subjectname=}')
return None
return await getAccountBalanceByAccid(sor, accid)
return acc.balance
async def get_account_total_amount(sor, accid, accounting_dir, from_date, to_date):
sql = """select sun(amount) as amount from acc_detail
@ -133,30 +97,9 @@ where accountid =${accountid}$
async def getAccountBalanceByAccid(sor, accid):
balances = await sor.sqlExe("""select * from acc_balance where accountid=${accid}$ order by acc_date desc""", {'accid':accid})
balances = await sor.sqlExe("""select * from account where id=${accid}$""", {'accid':accid})
if len(balances) == 0:
debug(f'acc_balance is None, {accid=}')
return 0
return balances[0]['balance']
async def get_account_info(sor, accid):
sql = '''
select b.orgname as accounting_org,
case when a.accounting_orgid = a.orgid then '本机构'
when c.org_type in ('0', '1') then '分销商'
when c.org_type = '2' then '供应商'
else '客户' end as acctype,
c.orgname,
d.name
from account a, organization b, organization c, subject d
where a.accounting_orgid = b.id
and a.orgid = c.id
and a.subjectid = d.id
and a.id = ${accid}$'''
recs = await sor.sqlExe(sql, {'accid':accid})
if len(recs) == 0:
return None
r = recs[0]
r['balance'] = await getAccountBalanceByAccid(sor, accid)
return r

Binary file not shown.

Binary file not shown.