1. 税盘抄税和清卡业务流程

增值税开票软件需要插入税盘才能运行,税盘分为金税盘(白盘),税控盘(黑盘)和税务UKey三种。其中,金税盘是航信旗下研发的开票软件,所使用的税盘。税控盘和税务UKey,是百旺研发的开票软件,所使用的税盘。从市场占有率来说金税盘遥遥领先,属于佼佼者,从趋势来看当属税务UKey首屈一指,代表着未来的趋势,后来者居上。

税盘每月月初,需要进行抄税,清卡操作。若不能及时清卡,到锁死期不能再开具发票。抄税是将税盘中,上月所开的所有发票数据,进行汇总上传(注意:在抄税操作之前,需要从税盘中修复所有的发票,并将发票全部上传)。在开票软件中进行抄税操作之后,税务会计登录到电子税务局,进行纳税申报,也称为“报税”。在电子税务局进行纳税申报之后,方可在开票软件中,进行清卡操作,清卡成功后,税盘的锁死日期自动变更为次月。若未清卡,到税盘锁死日期后,不能再开具发票。抄税和清卡的业务流程如下图所示。

图-1 税盘抄税和清卡业务流程

2. 常见的税盘抄税和清卡操作方式分析

税盘的抄税和清卡,从操作方式来讲,根据笔者的理解和调研,大致分为如下四种。第一种,在开票软件中手工操作,进行抄税和清卡;第二种,使用RPA技术,模拟鼠标键盘操作,进行抄税和清卡;第三种,通过注入技术,进行税盘抄税和清卡进行操作;第四种,通过调用组件的抄税和清卡接口,进行抄税和清卡进行操作。笔者,下面分别就这四种操作方式进行详细的阐述和对比。

图-2 税盘抄税和清卡操作的几种方式

2.1 手工操

在开票软件上进行手工的抄税和清卡,是最便捷、最稳定的方式。对于只有一个或数个盘的单个企业而言,是行之有效的操作手段。这种操作,首先,将税盘插到电脑上,打开对应的开票软件,输入用户密码,税控设备密码,证书密码,登录到开票软件。然后,修复发票数据,以确保当月开具的所有发票数据,在开票软中已存在。如果存在未上传的发票,则需进行上传发票操作。

经过以上的准备和前奏操作之后,在开票软件上进行抄税操作,在有的开票软件中,也称之为“汇总上传”(不同的开票软件其入口或者叫法不同,笔者在此不再一一展开赘述)。抄税成功之后,税务会计登录到电子税务局,进行纳税申报。

在税务会计纳税申报完成之后,开票员插入税盘,打开并登录开票软件,进行清卡操作。在有的开票软件中,也称之为 “监控回传”或“监控回写”。不同的开票软件,其操作入口也不同,笔者也不再展开赘述。清卡完成,则税盘的锁死日期自动变为次月的日期,若清卡失败,则到税盘锁死日期不再允许开票(一般是当月中旬,当然具体的日期可以查看税局的纳税申报截止日期)。

上面描述的是手工进行抄税,清卡的操作流程,这种方式的优点是稳定可控。但是,如果企业有数百甚至更多的盘(例如代账企业),其工作量,也是可想而知的。

2.2 RPA技术

RPA技术(Robotic Process Automation)即机器人流程自动化,该技术应用在税盘的抄税和清卡的场景,是通过技术手段,自动打开税盘对应的开票软件,通过模拟键盘鼠标操作,进行抄税和清卡。操作的流程和手工操作完全一致。

这种方式的优点是,相对于纯手工操作来说,会提升一定的效率,但效率提升是有限的。缺点是,税盘种类和开票软件种类繁多,和各种单步操作的各种业务场景(例如多报错信息的处理等)叠加在一起,有数不尽的细分场景,很难一一枚举。同时,开票软件本身,会使用各种反模拟操作的技术手段,这些因素,也就导致RPA很不稳定。开票软件升级后RPA也要做相关的调整和迭代,开票软件升级频繁(至少每月一个版本)。所以,RPA技术很难在税盘的抄税,清卡的场景能做到稳定,同时提升的效率也是有限的。

2.3 注入技术

通过注入技术,进行税盘的抄税,清卡操作,相对于RPA技术来说,更加考验开发者的技术功底,正所谓“没有金刚钻,别拦瓷器活”,注入需要找到正确的注入点,并进行相关的分析,这个过程没有一定技术底蕴,是很难胜任的。当然,注入也可以分为初级和高级两个境界,能做到高级注入的话,可以直接调用相关的底层接口,可以做到稳定和高效。然而,高级注入没有“大师”级的技术底蕴,是很难实现的。

高级注入虽然可以做大稳定和高效,但是开票软件频繁升级,也是梦魇一般的存在,每次升级后,都需要进行重新的分析,这个过程也是,极其耗时和繁杂的,所以这种技术也有很大的瓶颈。

2.4 使用组件接口

相关组件接口提供了抄税,清卡以及其它功能,使用组件接口可以获取税盘状态(例如核定票种的最近抄报日期,锁死日期等),并依此来判断税盘的抄税,清卡状态。如果没有抄税,则可以调用相关接口,进行未上传发票上传,抄税,清卡。组件接口的优点是稳定,高效,同时不用再需要考虑开票软件的频繁升级问题,一劳永逸。另外组件接口调用简单,很容易上手。

综上所述,组件接口是最优方案。当然组件所提供的接口,不止抄税和清卡的功能,例如开票,作废,冲红,库存查询,领购,上传,发票查询,版式文件下载等一应具全。本文着重介绍抄税和清卡。

3. 组件接口核心代码分享

下面笔者对通过调用组件接口,实现抄税和清卡的核心代码进行分享,上节提到的通过RPA技术,注入技术实现抄税,清卡的技术细节不再展开讲述,有兴趣的朋友,可以和笔者进行沟通交流。

3.1 金税盘组件核心代码分享

3.1.1 抄税操作核心代码分享

{**********************************************************功能:金税盘抄税操作参数:errMsg        输出参数,错误信息返回值:ture  -     成功false -     失败date: 2021-05-0430author: 海之边  qq-3094353627流程简述:1. 打开金税盘2. 获取金税盘盘状态3. 如果尚未抄税则进行抄税4. 抄税成功后获取金税盘状态,并缓存到本地数据库**********************************************************}
function TCtrlItem.reportTax(var errMsg: string): boolean;
var idx: integer;bReported: boolean;sFplxdm, sCardClock: string;oJsCardComponent: TJsCardComponent;oTaxCardRespOpenCard: TJsCardResponse_OpenCard;oJsCardRespGetClock: TJsCardResponse_getClock;oJsCardState: TJsCardState;oJsCardRespRep: TJsCardResponse_taxReport;oHdFplxdmLst: TStrings;oDBAJxsb: TDBAJxsb;oDBAPzxx: TDBAPzxx;
beginresult := false;oJsCardComponent := TJsCardComponent.Create;oTaxCardRespOpenCard := nil;oJsCardState := nil;oJsCardRespRep := nil;oHdFplxdmLst := nil;oDBAJxsb := nil;oDBAPzxx := nil;tryoDBAJxsb := TDBAJssb.Create;oDBAPzxx := TDBAPzxx.Create;//1. 打开金税盘oTaxCardRespOpenCard := oJsCardComponent.openTaxCard(Zsmm);if not oTaxCardRespOpenCard.isSucc thenbeginerrMsg := Format('打开金税盘%s.%s失败: %s。', [FNsrsbh, FMachineNo, errMsg]);updateCzzt(oDBAJxsb, CZZT_SB, errMsg);exit;end;if oTaxCardRespOpenCard.isCertNotPass thenbegin//证书密码错误,设置密码校验不通过状态Zsmmjyjg := untGolbalConst.JYJG_NotPass;updateToDb(oDBAJxsb);Exit;end;//判断抄报状态//2. 读取金税盘时钟oJsCardRespGetClock := OJsCardComponent.getClock;if not oJsCardRespGetClock.isSucc thenbeginerrMsg := Format('读取金税盘时钟失败:%d-%s', [oJsCardRespGetClock.retCode, oJsCardRespGetClock.retMsg]);updateCzzt(oDBAJxsb, CZZT_SB, errMsg);Exit;end;sCardClock := oJsCardRespGetClock.Clock;//3 读取金税盘状态oJsCardState := oJsCardComponent.queryTaxcardState_svr(errMsg);if not Assigned(oJsCardState) thenbeginupdateCzzt(oDBAJxsb, CZZT_SB, errMsg);Exit;end;updateToDb(oDBAJxsb);//更新设备状态信息assignFromJsCardState(oJsCardState);//保存票种核定信息oJsCardState.Pzxxs.saveToDb(Sksblx, SksbNo);//4 逐个核定票种判断是否能抄报//4.1 判断是否已经抄报bReported := True;oHdFplxdmLst := spliteStr(hdfplxdm, ',');for idx := 0 to oHdFplxdmLst.Count - 1 dobeginsFplxdm := oHdFplxdmLst.Strings[idx];if not oDBAPzxx.isReport(Sksblx, SksbNo, sFplxdm, sCardClock) thenbeginbReported := False;Break;end;end;if bReported thenbegin//已抄报updateCzzt(oDBAJxsb, CZZT_CG, '已抄报,无需再执行抄报操作。');result := true;Exit;end;//4.2 是否到抄报期if oTaxCardRespOpenCard.IsRepReached <> '1' thenbeginerrMsg := '未到抄税期';updateCzzt(oDBAJxsb, CZZT_SB, errMsg);Exit;end;//5 执行抄税操作oJsCardRespRep := OJsCardComponent.taxReport;if not oJsCardRespRep.reportIsSucc thenbegin//抄税失败errMsg := Format('抄报失败:%s-%s', [oJsCardRespRep.Code, oJsCardRespRep.Mess]);updateCzzt(oDBAJxsb, CZZT_SB, errMsg);Exit;endelsebegin//抄税成功updateCzzt(oDBAJxsb, CZZT_CG, '');//更新金税盘状态if Assigned(taskThread) thentaskThread.setThirdPrompt('正在更新金税盘状态信息...');updateCzlb(oDBAJxsb, CZLB_HQJSPZT);oJsCardState := oJsCardComponent.queryTaxcardState(errMsg);if not Assigned(oJsCardState) thenbeginupdateCzzt(oDBAJxsb, CZZT_SB, errMsg);Exit;end;updateToDb(oDBAJxsb);//更新设备状态信息assignFromJsCardState(oJsCardState);//保存票种核定信息oJsCardState.Pzxxs.saveToDb(Sksblx, SksbNo);result := true;end;finallyif Assigned(oJsCardComponent) then  FreeAndNil(oJsCardComponent);if Assigned(oTaxCardRespOpenCard) thenFreeAndNil(oTaxCardRespOpenCard);if Assigned(oJsCardRespGetClock) thenFreeAndNil(oJsCardRespGetClock);if Assigned(oJsCardState) thenFreeAndNil(oJsCardState);if Assigned(oHdFplxdmLst) thenFreeAndNil(oHdFplxdmLst);if Assigned(oJsCardRespRep) thenFreeAndNil(oJsCardRespRep);if Assigned(oDBAJxsb) thenFreeAndNil(oDBAJxsb);if Assigned(oDBAPzxx) then  FreeAndNil(oDBAPzxx);end;
end;

3.1.2 清卡核心代码分享

{**********************************************************功能:金税盘清卡操作参数:errMsg        输出参数,错误信息返回值:ture  -     成功false -     失败date: 2021-05-0430author: 海之边  qq-3094353627流程简述:1. 打开金税盘2. 获取金税盘盘状态3. 如果尚未清卡则进行清卡4. 清卡成功后获取金税盘状态,并缓存到本地数据库**********************************************************}
function TCtrlItem.reportTaxJSP(var errMsg: string): boolean;
var idx: integer;bCleared: boolean;sFplxdm, sCardClock: string;oJsCardComponent: TJsCardComponent;oTaxCardRespOpenCard: TJsCardResponse_OpenCard;oJsCardRespGetClock: TJsCardResponse_getClock;oJsCardState: TJsCardState;oJsCardRespClearCard: TJsCardResponse_clearReport;oHdFplxdmLst: TStrings;oDBAJxsb: TDBAJxsb;oDBAPzxx: TDBAPzxx;
beginresult := false;oJsCardComponent := TJsCardComponent.Create;oTaxCardRespOpenCard := nil;oJsCardState := nil;oJsCardRespClearCard := nil;oHdFplxdmLst := nil;oDBAJxsb := nil;oDBAPzxx := nil;tryoDBAJxsb := TDBAJssb.Create;oDBAPzxx := TDBAPzxx.Create;//1 打开金税盘oTaxCardRespOpenCard := oJsCardComponent.openTaxCard(Zsmm);if not oTaxCardRespOpenCard.isSucc thenbeginerrMsg := Format('打开金税盘%s.%s失败: %s。', [FNsrsbh, FMachineNo, errMsg]);updateCzzt(oDBAJxsb, CZZT_SB, errMsg);Exit;end;if oTaxCardRespOpenCard.isCertNotPass thenbegin//证书密码错误,设置密码校验不通过状态Zsmmjyjg := untGolbalConst.JYJG_NotPass;updateToDb(oDBAJxsb);Exit;end;//2. 判断是否已经清卡//读取金税盘时钟oJsCardRespGetClock := OJsCardComponent.getClock;if not oJsCardRespGetClock.isSucc thenbeginerrMsg := Format('读取金税盘时钟失败:%d-%s', [oJsCardRespGetClock.retCode,oJsCardRespGetClock.retMsg]);updateCzzt(oDBAJxsb, CZZT_SB, errMsg);Exit;end;sCardClock := oJsCardRespGetClock.Clock;updateLastClock(sCardClock);//读取金税盘状态oJsCardState := oJsCardComponent.queryTaxcardState(errMsg);if not Assigned(oJsCardState) thenbeginupdateCzzt(oDBAJxsb, CZZT_SB, errMsg);Exit;end;updateToDb(oDBAJxsb);//更新设备状态信息,保存票种核定信息assignFromJsCardState(oJsCardState);oJsCardState.Pzxxs.saveToDb(Sksblx, SksbNo);//这个核定票种判断是否已经抄报bCleared := True;oHdFplxdmLst := spliteStr(hdfplxdm, ',');for idx := 0 to oHdFplxdmLst.Count - 1 dobeginsFplxdm := oHdFplxdmLst.Strings[idx];if not oDBAPzxx.isClearCard(Sksblx, SksbNo, sFplxdm, sCardClock) thenbeginbCleared := False;Break;end;end;if bCleared thenbegin//已经清卡WriteLog('金税盘%s.%s已清卡,无需再次清卡。', [FNsrsbh, FMachineNo]);updateCzzt(oDBAJxsb, CZZT_CG, '已清卡,无需再执行清卡操作。');result := true;Exit;end;//3 执行清卡操作oJsCardRespClearCard := OJsCardComponent.clearCard;if not oJsCardRespClearCard.reportIsSucc thenbegin//清卡失败errMsg := Format('清卡失败:%s-%s', [oJsCardRespClearCard.Code, oJsCardRespClearCard.Mess]);updateCzzt(oDBAJxsb, CZZT_SB, errMsg);Exit;endelsebegin//清卡成功updateCzzt(oDBAJxsb, CZZT_CG, '');//更新金税盘状态if Assigned(oJsCardState) thenFreeAndNil(oJsCardState);oJsCardState := oJsCardComponent.queryTaxcardState(errMsg);if not Assigned(oJsCardState) thenbeginWriteLogError('更新金税盘状态信息失败: %s', [errMsg]);updateCzzt(oDBAJxsb, CZZT_SB, errMsg);Exit;end;updateToDb(oDBAJxsb);oJsCardState.Pzxxs.saveToDb(Sksblx, SksbNo);result := true;end;finallyif Assigned(oJsCardComponent) then  FreeAndNil(oJsCardComponent);if Assigned(oTaxCardRespOpenCard) thenFreeAndNil(oTaxCardRespOpenCard);if Assigned(oJsCardRespGetClock) thenFreeAndNil(oJsCardRespGetClock);if Assigned(oJsCardState) thenFreeAndNil(oJsCardState);if Assigned(oHdFplxdmLst) thenFreeAndNil(oHdFplxdmLst);if Assigned(oJsCardRespRep) thenFreeAndNil(oJsCardRespRep);if Assigned(oDBAJxsb) thenFreeAndNil(oDBAJxsb);if Assigned(oDBAPzxx) then  FreeAndNil(oDBAPzxx);end;
end;

3.2 税控盘组件核心代码分享

税控盘组件的抄税和清卡相关的核心代码,和金税盘类似,笔者不再一一贴出代码,有兴趣或需求的朋友可以和笔者做进一步的沟通交流。

3.3 税务UKey组件核心代码分享

税务UKey组件的抄税和清卡相关的核心代码,和金税盘类似,笔者不再一一贴出代码,有兴趣或需求的朋友可以和笔者做进一步的沟通交流。

4. 后记

由于笔者认知和技术能力有限,文中难免存在不当或错误,欢迎批评指正。同时,笔者也殷切的期望,和各位朋友进行相关业务和技术等方面的交流,以期共同受益。

税盘的批量抄报税和批量清卡--支持金税盘,税控盘,税务UKey相关推荐

  1. 金税盘怎么安装在电脑上_金税盘怎么安装,电脑重装后怎样安装金税盘税控开票软件?...

    金税盘是税务部门为了报税方便而进化出来的一个系统.通过金税盘可以开票.抄税.清卡.领购发票.金税盘使用增值税防伪税控系统,可开具增值税专用发票和增值税普通发票,一般的企业或个体商铺纳税人需要用到.第一 ...

  2. 无盘服务器造成的客服机卡顿,无盘施工优化方案建议

    服务器方面 1.服务器防火墙服务一定要关闭.一定要关闭.一定要关闭.如未关闭会导致主副服务器之间游戏同步异常.客户机启动故障等问题.这里面有个细节是评判是否关闭不能看控制面板防火墙的关闭状态,要去检查 ...

  3. 网吧无盘服务器风扇不转会不会卡,网吧无盘系统卡tftp的原因大全和解决方案参考...

    中国的无盘网吧技术非常成熟,特别是各种商业无盘,基本是傻瓜式的操作了,但是也会有部分无盘客户机在启动时卡TFP的现象,下面说下无盘卡在TFP的原因分析和解决方案吧: 相信很多无盘用户都遇到过客户机无法 ...

  4. win7c盘空间越来越小_电脑越来越卡?C盘空间越用越小?只需几步轻松解决烦恼...

    电脑用久了,C盘可用的空间就越来越少,严重的话可能会导致一些软件无法安装和运行.那么电脑C盘空间不够用怎么办?今天小编给大家介绍一下Win7解决C盘占用空间大以及如何清理的办法. 一.缩小休眠文件的体 ...

  5. 计算机系统u盘判断,教你检测电脑是否支持U盘启动

    下面介绍两种常用方法来判断自己的机型是否支持U盘启动 一. 将具有启动功能的U盘插入电脑的USB插槽中,然后重新启动系统并按Del键,进入BIOS程序设置中 在设置主界面中依次选择 "Adv ...

  6. 《金税盘--发票开具、发票领购、发票安全存储、发票管理、身份认证和抄报税功能详解》

    <金税盘–发票开具.发票领购.发票安全存储.发票管理.身份认证和抄报税功能详解> 安装启动 出施设置 编码管理 发票读入 开具发票 抄报税 本视频将会对六大类分别进行介绍,本视频来源于网络 ...

  7. python必备软件百度网盘_【亲测好用!】python实现批量百度云批量转存工具

    本文信息本文由方法SEO顾问发表于2016-08-1719:13:22,共 3048 字,转载请注明:[亲测好用!]python实现批量百度云批量转存工具_[方法SEO顾问],如果我网站的文章对你有所 ...

  8. 航天金税金税盘批量导入项目开发

    公司erp要实现发票导入到 最新航天金税盘, 数据接口文档下载地址:http://download.csdn.net/detail/y281252548/9567083 不懂得联系我:免费    qq ...

  9. 软件更新|增值税发票税控开票软件(金税盘版_V2.051ZS_20221031)

    公开 FWSK(KP)_ V2.0.51_ZS_20221031 综合说明 一.补丁下发说明 版本号 V2.0.51 补丁编号 FWSK(KP)_ V2.0.51_ZS_20221031 系统 名称 ...

  10. 百旺税控盘清卡时候服务器返回为空,百旺税控盘会自动清卡吗

    等线百旺税控盘会自动清卡吗 目前的百旺税控盘登录就会自动清卡,如果没有自动清,那么手动清卡即可. 百旺黑色税盘怎么清盘 一.百旺黑色税盘清盘/清卡步骤如下: 登录-[报税处理]-[网上抄报]-根据企业 ...

最新文章

  1. python爬取高考各高校分数线_Python 爬取高校历年分数线
  2. 游戏杆编程心得二:如何判断按钮的有效按下
  3. 魔法照片pascal程序
  4. 漫画:深入浅出 ES 模块
  5. 软件推荐-有道超级计算器
  6. 6-18 23:50 day15
  7. PowerDesigner的汉化破解安装到逆向工程(ORACLE)
  8. sonar报java.io.StreamCorruptedException: invalid internal transport message format, got (48,54,54,50)
  9. 免费下载qq音乐的音频资源的方法
  10. 关于高德地图转换经纬度为屏幕点,方便自定义需链接网络的marker且添加属性动画
  11. html字体设置匹配移动端,移动端字体的设置
  12. matlab卡方拟合优度检验,卡方拟合优度检验在教学中的应用及Matlab实现_刘泽显...
  13. 使用python实现猴子摘香蕉问题
  14. Ubuntu挂载ISO文件
  15. HTML5小游戏源码收藏
  16. c语言狗追兔子,[转载]狗追兔典型例题
  17. 学计算机要具备什么能力,具备什么特质能学计算机
  18. 亿道丨三防手机丨手持终端丨PDA丨优势与特点
  19. z-blog建立博客网站SEO优化细节教程
  20. linux下搭建svn仓库

热门文章

  1. 德标螺纹规格对照表_国标德标对照表
  2. 金融量化之华泰多因子估值类显著性和IC值计算
  3. android中svn合并分支,Android Studio之SVN打分支、切换分支及合并分支
  4. 基于librtmp的推流实现
  5. Neuron:空间注意中的Alpha同步和神经反馈控制
  6. Log4j(三)——Log4j配置文件位置详解
  7. 数字信号处理技术在各个领域(电信、音频、图像、雷达、声呐等)的用途
  8. API管理基础知识集锦
  9. 039 我的技术成长历程
  10. 基于J2EE规范的中间件——EJB开发实例2