//已开发票作废 UINT8 INVM_WstInv(CInvHead* pInvHead, string &strErr) { DBG_ASSERT_EXIT((pInvHead != NULL), (" pInvHead == NULL!")); INT32 ret = SUCCESS; INT8 val[256]; string strsql(""); UINT8 waste_type = 0; UINT8 tmpType = pInvHead->m_kplx; switch(pInvHead->m_kplx) { case NORMAL_INV: waste_type = WASTE_NOR;//正票可以作废,成为正废票 break; case RETURN_INV: case RET_MANUAL_INV: case RET_SPECIAL_INV: waste_type = WASTE_RET;//红票(负票)也可以作废,成为负废票 break; default: ; } UINT8 zflx= 1; //已开发票作废 ret= g_pAPIBase->MakeWasteInv_API(*g_YwXmlArg, pInvHead, zflx, strErr); if (SUCCESS != ret) { DBG_PRINT(("strErr = %s", strErr.c_str())); return FAILURE; } POWOFF_DISABLE(); //屏蔽掉电中断 //更新INV_HEAD发票类型 memset((void*)val, 0x00, sizeof(val)); sprintf(val, "where FPDM='%s' AND FPHM=%u", pInvHead->m_fpdm.c_str(), pInvHead->m_fphm); strsql = val; pInvHead->m_kplx = waste_type; pInvHead->m_kprq = pInvHead->m_zfrq; pInvHead->m_kpsj = pInvHead->m_zfsj; ret = pInvHead->Update(strsql, &(pInvHead->m_kplx), &(pInvHead->m_kprq), &(pInvHead->m_kpsj), NULL); if ( ret!= SQLITE_OK) { strErr = "更新发票信息表错误"; return FAILURE; } DBG_PRINT(("更新INV_HEAD发票类型strsql = %s", strsql.c_str())); //更新INV_DET发票类型 CInvDet pInvDet; pInvDet.m_kplx = waste_type; pInvDet.m_kprq = pInvHead->m_zfrq; pInvDet.m_kpsj = pInvHead->m_zfsj; ret = pInvDet.Update(strsql, &(pInvDet.m_kplx), &(pInvDet.m_kprq), &(pInvDet.m_kpsj), NULL); if ( ret!= SQLITE_OK) { strErr = "更新发票信息表错误"; return FAILURE; } DBG_PRINT(("更新INV_DET发票类型strsql = %s", strsql.c_str())); //删除RT_INV表中,红票对应的原发票代码和号码 DBG_PRINT(("pInvHead->m_kplx = %d", pInvHead->m_kplx));//开票类型并不从金税盘中返回 if(tmpType == RETURN_INV) { CRtInv rtInv; memset(val, 0, sizeof(val)); sprintf(val, "where FPDM = '%s' and FPHM = %u ", pInvHead->m_yfpdm.c_str(), pInvHead->m_yfphm); DBG_PRINT(("val = %s", val)); rtInv.m_filter = val; if( rtInv.Delete() != SQLITE_OK ) { DBG_PRINT(("Delete RT_INV info error")); } DBG_PRINT(("Delete RT_INV info succeed")); } POWOFF_ENABLE(); //开掉电中断 DBG_PRINT(("WstInv() SUCCESS")); return SUCCESS; }
INT32 CJSKMakeInvoice::FPZF_Proc(CInvHead *pInvhead, UINT8 zflx, string &strErr) { DBG_PRINT(("===== FPZF_Proc Begin() ======")); DBG_ASSERT_EXIT((pInvhead != NULL), (" pInvhead == NULL!")); INT32 retcode = JSK_SUCCESS; if(zflx == 0) //空白票作废 { pInvhead->m_kplx = JSK_WASTE_INV; pInvhead->m_xfmc = g_globalArgLib->m_corpInfo->m_Nsrmc; retcode = FPKJ_Proc(pInvhead, strErr, 1); return retcode; } ////////////////////////////////////////////////////////////////////////// if(zflx != 1) { strErr = "发票作废类型错误!"; return JSK_FAILURE; } CJSKInvManageProc::fplxdm2fplx(pInvhead->m_fplxdm, pInvhead->m_fplb); //已开票作废 //查询数据库中已开发票信息 INT8 sqlbuf[256]; UINT32 errorcode; CInvHead tmpInvHead; memset(sqlbuf, 0, sizeof(sqlbuf)); sprintf(sqlbuf, "where FPDM='%s' and FPHM=%u", pInvhead->m_fpdm.c_str(), pInvhead->m_fphm); DBG_PRINT(("sqlbuf = %s", sqlbuf)); pInvhead->m_filter.append(sqlbuf); if(pInvhead->Load() != SQLITE_OK) { DBG_PRINT(("here find by jsp")); //数据库查询不到,从盘中查询 retcode = CJSKInfoFunc::GetInvDetailInfoNO(pInvhead, strErr); if(retcode != JSK_SUCCESS) { return retcode; } pInvhead->Save(); } //已开发票作废控制 if(pInvhead->m_kplx == JSK_NORMAL_INV) { pInvhead->m_kplx = JSK_WASTE_NOR; } else if(pInvhead->m_kplx == JSK_RETURN_INV) { pInvhead->m_kplx = JSK_WASTE_RET; } else { retcode = JSK_COMMON_ERR_NO; strErr = "废票不能再次作废!"; return retcode; } //权限控制 retcode = MakeInvAuthority(pInvhead, strErr); if( retcode != JSK_SUCCESS ) { return retcode; } retcode = CJSKInfoFunc::WasteInvHandInfo(pInvhead, strErr); if( retcode != JSK_SUCCESS ) { return retcode; } //数据库事务开始 pInvhead->BeginTransaction(); //修改数据库对应信息 tmpInvHead.m_kplx = pInvhead->m_kplx; tmpInvHead.m_fpsyh = pInvhead->m_fpsyh; tmpInvHead.m_casign = pInvhead->m_casign; tmpInvHead.m_zfsj = pInvhead->m_zfsj; retcode = tmpInvHead.Update(sqlbuf, &tmpInvHead.m_kplx, &tmpInvHead.m_fpsyh, &tmpInvHead.m_zfsj, &tmpInvHead.m_casign, NULL); DBG_PRINT(("更新DB的INV_HEAD:retcode = %d", retcode)); CInvDet invDet; invDet.m_kplx = pInvhead->m_kplx; retcode = invDet.Update(sqlbuf, &invDet.m_kplx, NULL); DBG_PRINT(("更新DB的INV_DET:retcode = %d", retcode)); if(pInvhead->m_kplx == JSK_WASTE_RET ) { DBG_PRINT(("更新RT_INV表")); CRtInv curRtInv; CRtInv *pRtInv = &curRtInv; memset(sqlbuf, 0, sizeof(sqlbuf)); sprintf(sqlbuf, "where FPDM='%s' and FPHM=%u ", pInvhead->m_yfpdm.c_str(), pInvhead->m_yfphm); DBG_PRINT(("sqlbuf = %s", sqlbuf)); pRtInv->m_filter.append(sqlbuf); pRtInv->Delete(); } //处理INV_SERV表,如果已上传发票,需要重新记录INV_SERV??? CInvServ invServ; errorcode = invServ.Save(pInvhead, g_globalArgLib->m_InvServNum, g_globalArgLib->m_InvServSum, strErr); DBG_PRINT(("存储到DB的INV_SERV, errorcode = %u", errorcode)); //数据库事务结束 pInvhead->EndTransaction(); return JSK_SUCCESS; }