You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

112 lines
2.2KB

  1. package main
  2. import (
  3. "biukop.com/sfm/loan"
  4. "errors"
  5. log "github.com/sirupsen/logrus"
  6. "os/exec"
  7. "strings"
  8. )
  9. type FunderType string
  10. const (
  11. Funder_AAA FunderType = "AAA Financial"
  12. Funder_Pepper = "Pepper"
  13. Funder_Resimac = "Resimac"
  14. Funder_Unknown = "cannot detect funder type"
  15. )
  16. type AiDecodeIncome struct {
  17. Input loan.Uploads
  18. ul uploadsOnDisk // internal data
  19. Mime string //mime actually detected.
  20. PayIn []loan.PayIn
  21. Funder FunderType
  22. AAA PayInAAAData
  23. }
  24. func (m *AiDecodeIncome) decodeUploadToPayIn(ulMeta loan.Uploads) (e error) {
  25. m.Input = ulMeta
  26. m.ul.Upload = ulMeta
  27. m.PayIn = make([]loan.PayIn, 0, 10)
  28. switch m.getFileType() {
  29. case "pdf":
  30. m.decodePdf()
  31. break
  32. case "excel", "opensheet":
  33. m.decodeXls()
  34. break
  35. default:
  36. e = errors.New("unknown format")
  37. m.Funder = "" // mark unknown decoding
  38. }
  39. return
  40. }
  41. func (m *AiDecodeIncome) getFileType() (ret string) {
  42. strMime, e := GetFileContentType(m.ul.filePath())
  43. if e != nil {
  44. return
  45. }
  46. m.Mime = strMime
  47. ret, e = m.ul.GetFileType()
  48. if e != nil {
  49. ret = ""
  50. }
  51. return
  52. }
  53. func (m *AiDecodeIncome) decodePdf() (e error) {
  54. cmd := exec.Command("pdftotext", "-layout", m.ul.filePath(), "-")
  55. out, e := cmd.Output()
  56. if e != nil {
  57. log.Fatal(e)
  58. }
  59. raw := string(out)
  60. switch m.detectFunder(raw) {
  61. case Funder_AAA:
  62. m.Funder = Funder_AAA
  63. e = m.AAA.decodeAAAPdf(raw)
  64. log.Println("AAA final result", m.AAA)
  65. break
  66. case Funder_Unknown:
  67. e = errors.New(Funder_Unknown)
  68. break // not able to detect Funder
  69. }
  70. return
  71. }
  72. func (m *AiDecodeIncome) decodeXls() (e error) {
  73. return
  74. }
  75. func (m *AiDecodeIncome) detectFunder(raw string) FunderType {
  76. if m.isAAA(raw) {
  77. return Funder_AAA
  78. }
  79. return Funder_Unknown
  80. }
  81. func (m *AiDecodeIncome) isAAA(raw string) bool {
  82. keyword := "AAA Financial Trail Report"
  83. lines := strings.Split(raw, "\n")
  84. return m.checkFunderKeyword(keyword, lines, 0, 3)
  85. }
  86. func (m *AiDecodeIncome) checkFunderKeyword(keyword string, lines []string, start int, end int) bool {
  87. for idx, line := range lines {
  88. // first 10 lines has Key word
  89. if strings.Contains(line, keyword) && idx >= start && idx <= 10 {
  90. return true
  91. }
  92. }
  93. return false
  94. }