Ybnsr.go 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569
  1. package CheckYbjc
  2. import (
  3. "fmt"
  4. "git.listensoft.net/tool/jspkit/common"
  5. "git.listensoft.net/tool/jspkit/common/models/sb"
  6. "git.listensoft.net/tool/jspkit/common/variable"
  7. "git.listensoft.net/tool/jspkit/logger"
  8. "git.listensoft.net/tool/jspkit/taxerr"
  9. "reflect"
  10. "strings"
  11. )
  12. func CheckVatByYbjc(Data string, vat []sb.GsVat, fb1 []sb.GsVatAttach1, fb2 []sb.GsVatAttach2, fb3 []sb.GsVatAttach3, fb4 []sb.GsVatAttach4, fb5 []sb.GsVatAttach5, jm []sb.GsVatJsxm) (status int, editTable string, errLog string) {
  13. vats := []sb.GsVat{}
  14. common.GetData(variable.GsVat, Data, &vats)
  15. var attach1s []sb.GsVatAttach1
  16. common.GetData(variable.GsVatAttach1, Data, &attach1s)
  17. var attach2s []sb.GsVatAttach2
  18. common.GetData(variable.GsVatAttach2, Data, &attach2s)
  19. var attach3s []sb.GsVatAttach3
  20. common.GetData(variable.GsVatAttach3, Data, &attach3s)
  21. var attach4s []sb.GsVatAttach4
  22. common.GetData(variable.GsVatAttach4, Data, &attach4s)
  23. var vatfjs []sb.GsVatAttach5
  24. common.GetData(variable.GsVatAttach5, Data, &vatfjs)
  25. if len(vatfjs) != 3 {
  26. panic(taxerr.NewUser("附加税生成错误!"))
  27. }
  28. var gs_vat_qt sb.GsVatQt
  29. common.GetData(variable.GsVatQt, Data, &gs_vat_qt)
  30. var gsVatJsxm []sb.GsVatJsxm
  31. common.GetData(variable.GsVatJsxm, Data, &gsVatJsxm)
  32. var jsxm []sb.GsVatJsxm
  33. for _, v := range gsVatJsxm {
  34. if v.Type == 1 && (common.StrToFloat(v.Qcye) != 0 || common.StrToFloat(v.Qmye) != 0 || common.StrToFloat(v.Bqfse) != 0 || common.StrToFloat(v.Bqydjse) != 0 || common.StrToFloat(v.Bqsjdjse) != 0) {
  35. jsxm = append(jsxm, v)
  36. }
  37. }
  38. var ckms []sb.GsVatJsxm //出口免税
  39. for _, v := range gsVatJsxm {
  40. if v.Type == 2 {
  41. ckms = append(ckms, v)
  42. break
  43. }
  44. }
  45. var kjfw []sb.GsVatJsxm // 其中:跨境服务
  46. for _, v := range gsVatJsxm {
  47. if v.Type == 3 {
  48. kjfw = append(kjfw, v)
  49. break
  50. }
  51. }
  52. var msxm []sb.GsVatJsxm
  53. for _, v := range gsVatJsxm {
  54. if v.Type == 4 && (common.StrToFloat(v.Qcye) != 0 || common.StrToFloat(v.Qmye) != 0 || common.StrToFloat(v.Bqfse) != 0 || common.StrToFloat(v.Bqydjse) != 0 || common.StrToFloat(v.Bqsjdjse) != 0) {
  55. msxm = append(msxm, v)
  56. }
  57. }
  58. {
  59. }
  60. return 1, "", ""
  61. }
  62. // CheckWpsrLost 无票收入负数发票 税局主表 系统主表 系统附表一;正数发票可以在CheckVat返回2 重新填表
  63. func CheckWpsrLost(vat []sb.GsVat, baseVat []sb.GsVat, attach1 []sb.GsVatAttach1) bool {
  64. // 先判断附表一是不是有未开具发票
  65. Check1 := false
  66. for _, v := range attach1 {
  67. if common.StrToFloat(v.WkjfpXxynse) != 0 || common.StrToFloat(v.WkjfpXse) != 0 {
  68. logger.Info(`当前企业含有负数未开具发票,系统附表一数据:`, v.WkjfpXse, v.WkjfpXxynse)
  69. Check1 = true
  70. break
  71. }
  72. }
  73. // 在判断 主表的减免
  74. Check2 := false
  75. if common.StrToFloat(baseVat[0].Xxse) < common.StrToFloat(vat[0].Xxse) {
  76. Check2 = true
  77. }
  78. Check3 := true
  79. // 还是留几个强制校验
  80. {
  81. if common.StrToFloat(vat[0].Jxse) > common.StrToFloat(baseVat[0].Jxse) {
  82. Check3 = false
  83. }
  84. if common.StrToFloat(vat[0].Sqldse) != common.StrToFloat(baseVat[0].Sqldse) {
  85. Check3 = false
  86. }
  87. if common.StrToFloat(vat[0].Qcwjse) != common.StrToFloat(baseVat[0].Qcwjse) {
  88. Check3 = false
  89. }
  90. }
  91. if Check1 && Check2 && Check3 {
  92. logger.Info("当前企业含有负数未开具发票:主表数据", baseVat[0].Xxse, vat[0].Xxse)
  93. return true
  94. }
  95. return false
  96. }
  97. func CheckVat(vat []sb.GsVat, baseVat []sb.GsVat) (status int, errLog string) {
  98. status = 1
  99. var errLogs []string
  100. // 强制校验
  101. {
  102. i := 0
  103. var Prefix = ""
  104. switch i {
  105. case 0:
  106. Prefix = "一般纳税人主表-一般项目本月数-"
  107. case 1:
  108. Prefix = "一般纳税人主表-一般项目本年累计-"
  109. case 2:
  110. Prefix = "一般纳税人主表-即征即退项目本月数-"
  111. case 3:
  112. Prefix = "一般纳税人主表-即征即退项目本年累计-"
  113. }
  114. //if common.StrToFloat(vat[i].Asysljsxse) != common.StrToFloat(baseVat[i].Asysljsxse) {
  115. // errLogs = append(errLogs, MakeMsg(Prefix+"(一)按适用税率计税销售额", vat[i].Asysljsxse, baseVat[i].Asysljsxse))
  116. //}
  117. if common.StrToFloat(baseVat[i].Xxse) < common.StrToFloat(vat[i].Xxse) {
  118. errLogs = append(errLogs, MakeMsg(Prefix+"销项税额", vat[i].Xxse, baseVat[i].Xxse))
  119. }
  120. if common.StrToFloat(vat[i].Jxse) > common.StrToFloat(baseVat[i].Jxse) {
  121. errLogs = append(errLogs, MakeMsg(Prefix+"进项税额", vat[i].Jxse, baseVat[i].Jxse))
  122. }
  123. if common.StrToFloat(vat[0].Sqldse) != common.StrToFloat(baseVat[0].Sqldse) {
  124. errLogs = append(errLogs, MakeMsg("一般纳税人主表一 一般项目本月数-上期留抵税额", vat[0].Sqldse, baseVat[0].Sqldse))
  125. }
  126. if common.StrToFloat(vat[0].Qcwjse) != common.StrToFloat(baseVat[0].Qcwjse) {
  127. errLogs = append(errLogs, MakeMsg("一般纳税人主表一 一般项目本月数-期初未缴税额", vat[0].Qcwjse, baseVat[0].Qcwjse))
  128. }
  129. //if common.StrToFloat(vat[i].Bqybtse) != common.StrToFloat(baseVat[i].Bqybtse) {
  130. // errLogs = append(errLogs, MakeMsg(Prefix+"本期应补(退)税额", vat[i].Bqybtse, baseVat[i].Bqybtse))
  131. //}
  132. // 强制校验失败直接返回
  133. if len(errLogs) > 0 {
  134. return 3, strings.Join(errLogs, ",")
  135. }
  136. }
  137. for i := 0; i < 4; i++ {
  138. // 非强制校验
  139. {
  140. var KeyName = []string{
  141. "Asysljsxse",
  142. "Yshwxse",
  143. "Yslwxse",
  144. "Xxse",
  145. "Jxse",
  146. //"Sqldse",
  147. "Ynsehj",
  148. //"Qcwjse",
  149. "Qmwjse",
  150. "Bqybtse",
  151. "Cjs",
  152. "Jyf",
  153. "Dfjyf",
  154. }
  155. v1 := reflect.ValueOf(vat[0])
  156. v2 := reflect.ValueOf(baseVat[0])
  157. for _, v := range KeyName {
  158. if common.StrToFloat(v1.FieldByName(v).String()) != common.StrToFloat(v2.FieldByName(v).String()) {
  159. logger.Info("主表对比不通过:" + v)
  160. status = 2
  161. break
  162. }
  163. }
  164. }
  165. }
  166. if len(errLogs) > 0 {
  167. status = 3
  168. errLog = strings.Join(errLogs, ",")
  169. }
  170. return status, errLog
  171. }
  172. func CheckAttach1(fb1 []sb.GsVatAttach1, attach1 []sb.GsVatAttach1) (status int, errLog string) {
  173. status = 1
  174. var errLogs []string
  175. attach1[0].Jshj = "0" // 这个数据暂时置空 因为系统会计算出来但是税局是---
  176. // 非强制校验
  177. {
  178. var KeyName = []string{
  179. "KjskzzszyfpXse",
  180. "KjskzzszyfpXxynse",
  181. "WkjfpXse",
  182. "WkjfpXxynse",
  183. "KjqtfpXse",
  184. "KjqtfpXxynse",
  185. "Nsjctzdxse",
  186. "NsjctzXxynse",
  187. }
  188. for i := range attach1 {
  189. r1 := reflect.ValueOf(fb1[i])
  190. r2 := reflect.ValueOf(attach1[i])
  191. for _, key_name := range KeyName {
  192. if common.StrToFloat(r1.FieldByName(key_name).String()) != common.StrToFloat(r2.FieldByName(key_name).String()) {
  193. status = 2
  194. break
  195. }
  196. }
  197. }
  198. if common.StrToFloat(fb1[0].Xse) != common.StrToFloat(attach1[0].Xse) {
  199. if status != 2 {
  200. status = 2
  201. }
  202. }
  203. if common.StrToFloat(fb1[0].HjXxynse) != common.StrToFloat(attach1[0].HjXxynse) {
  204. if status != 2 {
  205. status = 2
  206. }
  207. }
  208. }
  209. if len(errLogs) > 0 {
  210. status = 3
  211. errLog = strings.Join(errLogs, ",")
  212. }
  213. return status, errLog
  214. }
  215. func CheckAttach2(fb2 []sb.GsVatAttach2, attach2 []sb.GsVatAttach2) (status int, errLog string) {
  216. status = 1
  217. var errLogs []string
  218. // 非强制校验
  219. {
  220. //期初已认证相符但未申报抵扣
  221. if common.StrToFloat(fb2[24].Je) != common.StrToFloat(attach2[24].Je) {
  222. errLogs = append(errLogs, fmt.Sprintf("附表二:期初已认证相符但未申报抵扣金额不一致:税局为%s系统为%s", fb2[24].Je, attach2[24].Je))
  223. }
  224. for i := range attach2 {
  225. // 三个都判断
  226. r1 := reflect.ValueOf(fb2[i])
  227. r2 := reflect.ValueOf(attach2[i])
  228. if i == 0 || i == 1 || i == 5 || i == 34 {
  229. for _, key_name := range []string{"Fs", "Je", "Se"} {
  230. if common.StrToFloat(r1.FieldByName(key_name).String()) != common.StrToFloat(r2.FieldByName(key_name).String()) {
  231. status = 2
  232. break
  233. }
  234. }
  235. }
  236. if status == 2 {
  237. break
  238. }
  239. if i > 11 && i < 23 {
  240. if common.StrToFloat(r1.FieldByName("Se").String()) != common.StrToFloat(r2.FieldByName("Se").String()) {
  241. status = 2
  242. break
  243. }
  244. }
  245. if status == 2 {
  246. break
  247. }
  248. }
  249. }
  250. if len(errLogs) > 0 {
  251. status = 3
  252. errLog = strings.Join(errLogs, ",")
  253. }
  254. return status, errLog
  255. }
  256. func CheckAttach3Cq(fb3 []sb.GsVatAttach3, attach3 []sb.GsVatAttach3) (status int, errLog string) {
  257. // 暂时没有校验
  258. //return 1, ""
  259. status = 1
  260. var errLogs []string
  261. // 非强制校验
  262. {
  263. for i := 0; i < len(attach3); i++ {
  264. status1 := ForeachStruct(fb3[i], attach3[i])
  265. if status != 2 {
  266. status = status1
  267. }
  268. }
  269. }
  270. if len(errLogs) > 0 {
  271. status = 3
  272. errLog = strings.Join(errLogs, ",")
  273. }
  274. return status, errLog
  275. }
  276. func CheckAttach3(fb3 []sb.GsVatAttach3, attach3 []sb.GsVatAttach3) (status int, errLog string) {
  277. // 暂时没有校验
  278. return 1, ""
  279. status = 1
  280. var errLogs []string
  281. // 非强制校验
  282. {
  283. for i := 0; i < len(attach3); i++ {
  284. status1 := ForeachStruct(fb3[i], attach3[i])
  285. if status != 2 {
  286. status = status1
  287. }
  288. }
  289. }
  290. if len(errLogs) > 0 {
  291. status = 3
  292. errLog = strings.Join(errLogs, ",")
  293. }
  294. return status, errLog
  295. }
  296. func CheckAttach4(fb4 []sb.GsVatAttach4, attach4 []sb.GsVatAttach4) (status int, errLog string) {
  297. status = 1
  298. var errLogs []string
  299. // 非强制校验
  300. {
  301. var KeyName = []string{
  302. "Bqsjdjse",
  303. "Bqfse",
  304. "Bqsjjjdkjxse",
  305. "Bqkjjdkjxse",
  306. "Qcye",
  307. }
  308. for i := 0; i < len(attach4); i++ {
  309. r1 := reflect.ValueOf(fb4[i])
  310. r2 := reflect.ValueOf(attach4[i])
  311. for _, key_name := range KeyName {
  312. if common.StrToFloat(r1.FieldByName(key_name).String()) != common.StrToFloat(r2.FieldByName(key_name).String()) {
  313. status = 2
  314. break
  315. }
  316. }
  317. }
  318. }
  319. if len(errLogs) > 0 {
  320. status = 3
  321. errLog = strings.Join(errLogs, ",")
  322. }
  323. return status, errLog
  324. }
  325. func CheckAttach5(fb5 []sb.GsVatAttach5, attach5 []sb.GsVatAttach5) (status int, errLog string) {
  326. status = 1
  327. // 非强制校验
  328. {
  329. var KeyNAme = []string{
  330. "Zzsse",
  331. "Ldtsbqkce",
  332. "Bqybtse",
  333. }
  334. for _, v1 := range attach5 {
  335. for _, v2 := range fb5 {
  336. if v1.ZsxmDm == v2.ZsxmDm {
  337. r1 := reflect.ValueOf(v1)
  338. r2 := reflect.ValueOf(v2)
  339. for _, key_name := range KeyNAme {
  340. if common.StrToFloat(r1.FieldByName(key_name).String()) != common.StrToFloat(r2.FieldByName(key_name).String()) {
  341. status = 2
  342. break
  343. }
  344. }
  345. if status == 2 {
  346. break
  347. }
  348. }
  349. }
  350. if status == 2 {
  351. break
  352. }
  353. }
  354. }
  355. var errLogs []string
  356. if len(errLogs) > 0 {
  357. status = 3
  358. errLog = strings.Join(errLogs, ",")
  359. }
  360. return status, errLog
  361. }
  362. func CheckJm(jm []sb.GsVatJsxm, Jm []sb.GsVatJsxm) (status int, errLog string) {
  363. status = 1
  364. var errLogs []string
  365. var jsxm1 []sb.GsVatJsxm
  366. for _, v := range jm {
  367. if v.Type == 1 && (common.StrToFloat(v.Qcye) != 0 || common.StrToFloat(v.Qmye) != 0 || common.StrToFloat(v.Bqfse) != 0 || common.StrToFloat(v.Bqydjse) != 0 || common.StrToFloat(v.Bqsjdjse) != 0) {
  368. jsxm1 = append(jsxm1, v)
  369. }
  370. }
  371. var ckms1 []sb.GsVatJsxm //出口免税
  372. for _, v := range jm {
  373. if v.Type == 2 {
  374. ckms1 = append(ckms1, v)
  375. break
  376. }
  377. }
  378. var kjfw1 []sb.GsVatJsxm // 其中:跨境服务
  379. for _, v := range jm {
  380. if v.Type == 3 {
  381. kjfw1 = append(kjfw1, v)
  382. break
  383. }
  384. }
  385. var msxm1 []sb.GsVatJsxm
  386. for _, v := range jm {
  387. if v.Type == 4 && (common.StrToFloat(v.Qcye) != 0 || common.StrToFloat(v.Qmye) != 0 || common.StrToFloat(v.Bqfse) != 0 || common.StrToFloat(v.Bqydjse) != 0 || common.StrToFloat(v.Bqsjdjse) != 0) {
  388. msxm1 = append(msxm1, v)
  389. }
  390. }
  391. var jsxm2 []sb.GsVatJsxm
  392. for _, v := range Jm {
  393. if v.Type == 1 && (common.StrToFloat(v.Qcye) != 0 || common.StrToFloat(v.Qmye) != 0 || common.StrToFloat(v.Bqfse) != 0 || common.StrToFloat(v.Bqydjse) != 0 || common.StrToFloat(v.Bqsjdjse) != 0) {
  394. jsxm2 = append(jsxm2, v)
  395. }
  396. }
  397. var ckms2 []sb.GsVatJsxm //出口免税
  398. for _, v := range Jm {
  399. if v.Type == 2 {
  400. ckms2 = append(ckms2, v)
  401. break
  402. }
  403. }
  404. var kjfw2 []sb.GsVatJsxm // 其中:跨境服务
  405. for _, v := range Jm {
  406. if v.Type == 3 {
  407. kjfw2 = append(kjfw2, v)
  408. break
  409. }
  410. }
  411. var msxm2 []sb.GsVatJsxm
  412. for _, v := range Jm {
  413. if v.Type == 4 && (common.StrToFloat(v.Qcye) != 0 || common.StrToFloat(v.Qmye) != 0 || common.StrToFloat(v.Bqfse) != 0 || common.StrToFloat(v.Bqydjse) != 0 || common.StrToFloat(v.Bqsjdjse) != 0) {
  414. msxm2 = append(msxm2, v)
  415. }
  416. }
  417. // 非强制校验
  418. {
  419. // 减税项目
  420. if len(jsxm1) != len(jsxm2) {
  421. status = 2
  422. //errLogs = append(errLogs, fmt.Sprintf("税局减税项目有%d条系统有%d条", len(jsxm1), len(jsxm2)))
  423. }
  424. for _, v1 := range jsxm1 {
  425. find := false
  426. for _, v2 := range jsxm2 {
  427. if v1.SbJmxzdmJmHm == v2.SbJmxzdmJmHm {
  428. find = true
  429. if common.StrToFloat(v1.Qcye) == common.StrToFloat(v2.Qcye) && common.StrToFloat(v1.Qmye) == common.StrToFloat(v2.Qmye) && common.StrToFloat(v1.Bqfse) == common.StrToFloat(v2.Bqfse) && common.StrToFloat(v1.Bqydjse) == common.StrToFloat(v2.Bqydjse) {
  430. status = 1
  431. } else {
  432. status = 2
  433. }
  434. break
  435. }
  436. }
  437. if !find {
  438. status = 2
  439. //errLogs = append(errLogs, fmt.Sprintf("税局减税项目:%s 为在系统中找到,请核实", len(jsxm1), len(jsxm2)))
  440. }
  441. }
  442. // 出口
  443. if common.StrToFloat(ckms1[0].Qcye) != common.StrToFloat(ckms2[0].Qcye) {
  444. status = 2
  445. }
  446. // 跨境
  447. if (len(kjfw1) == len(kjfw2)) && len(kjfw1) > 0 && len(kjfw2) > 0 {
  448. if common.StrToFloat(kjfw1[0].Qcye) != common.StrToFloat(kjfw2[0].Qcye) {
  449. status = 2
  450. }
  451. }
  452. // 免税项目
  453. if len(msxm1) != len(msxm2) {
  454. status = 2
  455. //errLogs = append(errLogs, fmt.Sprintf("税局免税项目有%d条系统有%d条", len(msxm1), len(msxm2)))
  456. }
  457. for _, v1 := range msxm1 {
  458. find := false
  459. for _, v2 := range msxm2 {
  460. if v1.SbJmxzdmJmHm == v2.SbJmxzdmJmHm {
  461. find = true
  462. if common.StrToFloat(v1.Qcye) == common.StrToFloat(v2.Qcye) && common.StrToFloat(v1.Qmye) == common.StrToFloat(v2.Qmye) && common.StrToFloat(v1.Bqfse) == common.StrToFloat(v2.Bqfse) && common.StrToFloat(v1.Bqydjse) == common.StrToFloat(v2.Bqydjse) {
  463. if status != 2 {
  464. status = 1
  465. }
  466. } else {
  467. status = 2
  468. }
  469. break
  470. }
  471. }
  472. if !find {
  473. status = 2
  474. //errLogs = append(errLogs, fmt.Sprintf("税局免税项目:%s 为在系统中找到,请核实", len(jsxm1), len(jsxm2)))
  475. }
  476. }
  477. }
  478. if len(errLogs) > 0 {
  479. status = 3
  480. errLog = strings.Join(errLogs, ",")
  481. }
  482. return status, errLog
  483. }
  484. // 对比结构体数据
  485. func ForeachStruct(obj1 interface{}, obj2 interface{}) (status int) {
  486. status = 1
  487. t1 := reflect.TypeOf(obj1)
  488. v1 := reflect.ValueOf(obj1)
  489. t2 := reflect.TypeOf(obj2)
  490. v2 := reflect.ValueOf(obj2)
  491. for k := 0; k < t1.NumField(); k++ {
  492. KeyName := t1.Field(k).Name
  493. if KeyName == "GsMainId" || KeyName == "ID" || KeyName == "GsBaseModel" || KeyName == "Type" || KeyName == "JmxzdmId" || KeyName == "JmxzdmSb" {
  494. continue
  495. }
  496. //fmt.Println(KeyName)
  497. Value := common.StrToFloat(v1.Field(k).Interface().(string))
  498. for j := 0; j < t2.NumField(); j++ {
  499. if KeyName == t2.Field(j).Name {
  500. if Value != common.StrToFloat(v2.Field(j).Interface().(string)) {
  501. logger.Info(KeyName, "-对比失败[税局为:", Value, "系统为:", common.StrToFloat(v2.Field(j).Interface().(string)), "]")
  502. status = 2
  503. }
  504. break
  505. }
  506. }
  507. }
  508. return status
  509. }
  510. // str:错误内容 data1税局数据 data2系统数据
  511. func MakeMsg(str, data1, data2 string) string {
  512. return fmt.Sprintf(str+"数据对比失败:[税局为:%s;系统为:%s;]", data1, data2)
  513. }
  514. // 校验减免明细有数 但是没有代码的
  515. func CheckJmDm(all []sb.GsVatJsxm) error {
  516. for _, v := range all {
  517. if v.Type != 2 && v.Type != 3 {
  518. if v.SbJmxzdmJmDm == "" && v.SbJmxzdmJmHm == "" && (common.StrToFloat(v.Qcye) != 0 || common.StrToFloat(v.Bqfse) != 0 || common.StrToFloat(v.Bqydjse) != 0 || common.StrToFloat(v.Bqsjdjse) != 0 || common.StrToFloat(v.Qmye) != 0) {
  519. return taxerr.NewUserV3("存在未填写减免代码的减免项目", "请手动补充后重试")
  520. }
  521. }
  522. }
  523. return nil
  524. }
  525. /*
  526. 逻辑:
  527. 1.读取发票后采集6张表 生成和系统数据一样的结构体并且除减免表外的其他表机构提数组长度务必相等
  528. 2.调用上面方法对比每个表 errLog为强制校验
  529. 3.
  530. 当所有表对比后返回的状态都是status=1时 直接申报即可
  531. 当某张表对比后返回status=2时 所有表按系统数据重填神申报
  532. 当某张表对比后返回status=3时 直接返回错误 taxerr.NewUser(errlog)
  533. 注意点:
  534. 1.附表一按行采集完22行后 单独把第三行插到23行中
  535. 2.附表二按系统顺序采集!!!!!!可以看河南内蒙的申报填表注释代码
  536. 3.当所有表校验完status!=3后再去判断有一个表status=2就需要重新填所有表
  537. 4.当所有表校验完status=1才能直接点击申报
  538. 传入参数:
  539. 第一个参数是税局采集的数据
  540. 第二个参数是任务的数据
  541. 返回参数:
  542. status:
  543. 1 当前表所有数据校验通过
  544. 2 当前表普通检验不通过 应根据系统的数据填写到报表上
  545. 3 当前表强之校验不通过 直接返回errLog的错误
  546. errLog:
  547. 目前只返回强制校验错误提示
  548. */