Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.

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