背景
重写了一下乐企开票的额度管理,把下载/退回/额度有效期调整写到一个工具类里,方便其他接口在开票时额度不足,引入额度管理工具类实例化后来进行开票过程中的额度下载和调整有效期.
接口说明
下载发票额度
当企业本地的已下载未使用的发票额度小于需要开具的数电票的额度时,可通过此功能下载发票额度。
建议根据企业自身开票情况,对本地已下载未使用的发票额度设置阈值,当已下载未使用的发票额度小于设置的阈值时,自动触发下载发票额度操作。
退回发票额度
当企业需要在其他平台开具数电票,但是发票额度不足时,企业可通过此接口把下载到本地的发票额度退回至税务局端,以便企业在其他平台开具数电票时。
调整发票额度有效期
结合调整发票额度有效期接口,企业在月初未申报时下载的发票额度的有效期止为当月申报截止日期,超过发票额度有效期止后,无法开具数电票,企业在完成申报或到达发票额度有效期止后,通过此接口调整发票额度有效期,并根据税局端返回的有效期更新本地发票额度有效期。
序号 | 接口名称 | 服务编码 |
---|---|---|
1 | 下载或退回授信额度 | XZTHSXED |
2 | 调整授信额度有效期 | TZSXEDYXQ |
发票额度即开票额度,用于控制企业开具数电票的总额度,国税要求企业自行管理每月数电票的发票额度,以下情况禁止使用发票额度。
- 发票额度不在有效期内
- 跨月使用
- 开票总额度大于发票额度
直接上代码
#!/usr/bin/env python
# encoding: utf-8
# @author: Evan#chengwenit.com
# 乐企额度管理工具类
from lq_request_util import LQRequestUtil
from cjc_oracle_client import OracleDBClient
import cjc_cfg as cfg
import uuid
class LQInvoiceQuotaManager:
"""
乐企数电票额度管理类,用于处理额度查询、下载、退回、有效期调整等操作
"""
def __init__(self):
self.requester = LQRequestUtil(
base_url=cfg.url_front,
headers=cfg.hjheaders,
key=cfg.hjlqkey
)
self.db_client = OracleDBClient()
def query_quota(self, taxpayer_id):
"""查询企业可用发票额度"""
try:
# 定义请求数据
request_data = {
"nsrsbh": taxpayer_id
}
# 调用接口
result = self.requester.post(cfg.url_after["sxed"], request_data, verify_ssl=False)
if result.get("Data") is not None:
if result["Data"]["returncode"] == '00':
print("解密结果:", result)
return result
except Exception as e:
print("请求失败:", e)
return None
def download_return_quota(self,jrdwptbh,sydwptbh,batch_id,taxno,ptbh,sqed,sqlx):
"""下载/退回数电票额度"""
try:
self.db_client.connect()
# 定义请求数据
request_data = {"nsrsbh":taxno,"ptbh":ptbh,"sqlx":str(sqlx),"sqed":sqed,"ywlsh":jrdwptbh + sydwptbh +batch_id}
# 调用接口
result = self.requester.post(cfg.url_after["xzthed"], request_data, verify_ssl=False)
if result.get("Data") is not None:
if result["Data"]["returncode"] == '00':
syqjq = result["Data"]["syqjq"]
syqjz = result["Data"]["syqjz"]
insertsql0 = f"""
insert into cjc_lq_xzsxed_dtl(ywlsh,get_date,entityid,nsrsbh,ptbh,sqlx,sqed,syqjq,syqjz)
values('{batch_id}',sysdate,1,'{taxno}','{ptbh}',{int(sqlx)},{sqed},to_date('{syqjq}','YYYYMMDD'),to_date('{syqjz}','YYYYMMDD'))
"""
self.db_client.execute_non_query(insertsql0)
else:
print(result)
return result
except Exception as e:
print("执行失败:", e)
return None
finally:
self.db_client.disconnect()
def adjust_quota_validity(self, xsfnsrsbh, sxedsq):
"""调整发票额度有效期 , 待验证.等申报期过后测试"""
try:
# 构建请求参数
request_data = {
"xsfnsrsbh": xsfnsrsbh,
"sxedsq": sxedsq
}
# 调用接口,假设接口地址为 cfg.url_after["adjust_quota_validity"]
result = self.requester.post(cfg.url_after["adjust_quota_validity"], request_data, verify_ssl=False)
print("调整发票额度有效期结果:", result)
return result
except Exception as e:
print("调整发票额度有效期失败:", e)
return None
if __name__ == '__main__':
lq_invoice_quota_manager = LQInvoiceQuotaManager()
# 示例查询
lq_invoice_quota_manager.query_quota("914601xxxxxxxxxxxx")
# 示例下载
# 生成业务流水号后缀
batch_id = str(uuid.uuid4()).replace('-', '')
print(batch_id)
#lq_invoice_quota_manager.download_return_quota(cfg.hjheaders["jrdwptbh"],cfg.hjheaders["sydwptbh"],batch_id,cfg.hjxfxx["taxno"],cfg.hjheaders["jrdwptbh"],1000000.00,0)
## 示例退回
lq_invoice_quota_manager.download_return_quota(cfg.hjheaders["jrdwptbh"],cfg.hjheaders["sydwptbh"],batch_id,cfg.hjxfxx["taxno"],cfg.hjheaders["jrdwptbh"],10000000.00,1)
## 示例调整有效期
#lq_invoice_quota_manager.adjust_quota_validity("9146010062xxxxxxxx", "2024-01")
接口返回示例
请求参数
{
"nsrsbh": "纳税人识别号/统一社会信用代码",
"ptbh": "平台编号",
"sqlx": "申请类型",
"sqed": "申请额度",
"ywlsh": "业务流水号"
}
返回成功
{
"Response":{
"RequestId": "16位随机数字和字母组合",
"Data":{
"returncode": "00",
"returnmsg": "成功",
"syqjq": "发票额度使用区间起",
"syqjz": "发票额度使用区间止"
}
}
}
返回失败
{
"Response":{
"RequestId": "16位随机数字和字母组合",
"Error":{
"Code": "01”,
"Message": "错误说明"
}
}
}