v3.1
Griffiths Lott 3 years ago
parent fa7162cd43
commit 5d786cb9f8
  1. 112
      2022.05.04_MINV_C
  2. 42
      MINV/2022.06.09_MINV_C
  3. 51
      MINV/2022.06.10_MINV_C
  4. 33
      MINV/2022.06.13_MINV_C
  5. 40
      MINV/2022.06.14_MINV_C
  6. 32
      MINV/2022.06.15_MINV_C
  7. 142
      ManualInvoice.py
  8. 152
      NI_sum.py
  9. 97
      RenewalTest.py
  10. 110
      ach_fix.py
  11. 87
      ach_special.py
  12. 60
      copy.svg
  13. BIN
      extract.ico
  14. 1
      extract.svg
  15. 2
      folder.svg
  16. 168
      lbf.py
  17. BIN
      man_inv_test.xlsx
  18. 1
      process.svg
  19. BIN
      test_ach_0613.xlsx
  20. BIN
      test_lb_0510.xlsx
  21. BIN
      test_lb_0511.xlsx
  22. BIN
      test_lb_0613.xlsx

@ -1,112 +0,0 @@
DAILY.MANUAL.INVOICE
CONTRACTS THAT WERE NOT INVOICED
PAGE 04-26-22 1
CHRG BUSINESS
CONTRACT.NO........ UATB.OIC.DUE RENTAL DUE......... UATB.IDS.OIC.PAYME TYPEM..... OUTSTANDING BALANCE.... SEGMENT. BOOKING.DATE BRANCH
100-2453558-003 05/09/2022 183.71 0.00 MISC 201.16 001.000 03/09/2018 9
100-2453558-003 04/09/2022 183.71 180.67 MISC 20.49 001.000 03/09/2018 9
100-2453558-003 03/09/2022 183.71 183.71 MISC 17.45 001.000 03/09/2018 9
100-1665517-003 05/15/2022 412.97 0.00 MISC 438.78 001.000 10/31/2014 9
100-4850431-001 05/10/2022 411.80 0.00 MISC 441.21 001.000 12/10/2018 3
100-4462739-001 04/18/2022 157.08 0.00 RENT 157.08 001.000 06/18/2018 9
100-4850431-001 04/10/2022 411.80 0.00 MISC 441.21 001.000 12/10/2018 3
100-3500858-001 05/12/2022 262.37 0.00 MISC 279.42 001.000 04/13/2016 9
100-3725849-003 05/13/2022 559.32 0.00 MISC 612.45 001.000 10/19/2017 9
100-3500858-001 04/12/2022 262.37 0.00 MISC 279.42 001.000 04/13/2016 9
047-2580598-001 04/05/2022 0.00 0.00 MISC 72.53 001.000 03/06/2014 9
100-3725849-003 03/13/2022 559.32 559.32 MISC 53.13 001.000 10/19/2017 9
100-4566489-001 04/14/2022 0.00 354.04 MISC 2.25 001.000 06/14/2018 9
100-4566489-001 05/14/2022 0.00 328.00 MISC 28.29 001.000 06/14/2018 9
100-5382471-001 04/15/2022 1,128.00 0.00 MISC 1,228.11 001.000 10/09/2019 9
100-5382471-001 05/15/2022 1,128.00 0.00 MISC 1,228.11 001.000 10/09/2019 9
100-9723689-001 04/20/2022 0.00 0.00 RENT 571.58 001.000 04/20/2022 10
100-9723689-001 04/20/2022 0.00 0.00 RENT 571.58 001.000 04/20/2022 10
100-7219911-001 04/20/2022 0.00 0.00 RENT 813.08 001.000 04/20/2022 9
100-1354567-002 05/25/2022 170.00 0.00 RENT 170.00 001.000 05/31/2016 9
100-6651721-001 07/14/2021 0.00 761.00 MISC 53.27 001.000 07/14/2021 9
100-2081987-008 05/25/2022 407.15 0.00 MISC 439.73 001.000 10/02/2017 9
100-2139037-002 05/20/2022 105.00 0.00 MISC 111.67 001.000 03/20/2017 9
100-3725849-003 04/13/2022 559.32 440.68 MISC 171.77 001.000 10/19/2017 9
100-3344078-002 05/01/2022 -28.53 18.47 RENT 63.00 001.000 10/01/2020 9
100-2081987-008 03/25/2022 407.15 0.00 MISC 439.73 001.000 10/02/2017 9
100-1354567-002 04/25/2022 170.00 0.00 RENT 170.00 001.000 05/31/2016 9
100-2081987-008 04/25/2022 407.15 0.00 MISC 439.73 001.000 10/02/2017 9
100-2081987-008 02/25/2022 407.15 407.15 MISC 32.58 001.000 10/02/2017 9
100-3876959-007 04/21/2022 61.07 0.00 RENT 61.07 001.000 06/21/2018 9
100-1637209-005 05/20/2022 2,023.20 0.00 RENT 2,023.20 001.000 04/25/2022 9
100-7146771-001 04/20/2022 183.28 167.00 RENT 16.28 001.000 04/25/2022 3
100-7146771-001 05/20/2022 183.28 0.00 RENT 183.28 001.000 04/25/2022 3
100-7045691-001 05/20/2022 244.57 0.00 RENT 244.57 001.000 04/25/2022 3
100-7059671-001 05/20/2022 60.00 0.00 MISC 64.20 001.000 04/25/2022 3
100-7237601-001 04/20/2022 0.00 0.00 RENT 34,192.91 001.000 04/25/2022 3
100-7242461-001 05/20/2022 57.00 0.00 MISC 60.99 001.000 04/25/2022 9
100-7178461-001 05/20/2022 197.45 0.00 MISC 209.30 001.000 04/25/2022 3
100-2611389-007 05/20/2022 171.76 0.00 RENT 171.76 001.000 04/25/2022 3
100-7037791-001 05/01/2022 444.00 0.00 MISC 478.41 001.000 04/25/2022 9
100-7203371-001 05/20/2022 1,566.40 0.00 RENT 1,566.40 001.000 04/25/2022 3
100-6630017-005 05/01/2022 0.00 178.55 MISC 0.01 001.000 04/25/2022 3
100-6738611-001 04/20/2022 0.00 0.00 RENT 4,545.94 001.000 04/25/2022 3
100-6738611-001 04/25/2022 0.00 0.00 RENT 4,545.94 001.000 04/25/2022 3
100-7052571-001 05/14/2022 255.87 0.00 MISC 278.90 001.000 04/25/2022 9
100-1011756-004 05/20/2022 1,001.64 0.00 MISC 1,081.77 001.000 04/25/2022 9
100-6849836-001 05/20/2022 1,077.47 0.00 RENT 1,077.47 001.000 04/25/2022 3
100-3492758-003 05/15/2022 312.41 0.00 RENT 312.41 001.000 04/25/2022 9
100-7156851-001 05/20/2022 150.00 0.00 MISC 159.00 001.000 04/25/2022 3
100-7232561-001 05/20/2022 113.60 0.00 MISC 122.12 001.000 04/25/2022 9
100-3876959-007 05/21/2022 61.07 0.00 RENT 61.07 001.000 06/21/2018 9
100-5382931-003 05/20/2022 146.69 0.00 RENT 146.69 001.000 04/26/2022 3
100-5722341-003 05/20/2022 170.00 0.00 MISC 181.90 001.000 04/26/2022 3
100-7150721-001 04/20/2022 174.96 0.00 RENT 174.96 001.000 04/26/2022 3
100-7150721-001 05/20/2022 174.96 0.00 RENT 174.96 001.000 04/26/2022 3
100-7165521-001 05/20/2022 1,417.88 0.00 RENT 1,417.88 001.000 04/26/2022 3
100-7227921-001 05/20/2022 64.00 0.00 MISC 69.28 001.000 04/26/2022 3
100-4858739-002 05/15/2022 208.00 0.00 MISC 225.16 001.000 04/26/2022 3
100-7100621-001 05/13/2022 880.10 0.00 MISC 954.90 001.000 04/26/2022 9
100-9725556-001 04/25/2022 0.00 0.00 RENT 600.77 001.000 04/26/2022 10
100-9725556-001 04/26/2022 0.00 0.00 RENT 600.77 001.000 04/26/2022 10
100-7209051-001 05/20/2022 1,652.01 0.00 RENT 1,652.01 001.000 04/26/2022 3
100-9660710-001 05/09/2022 174.75 0.00 RENT 174.75 001.000 06/09/2021 10
100-5329301-002 04/20/2022 0.00 0.00 RENT 263.44 001.000 04/26/2022 3
100-7087121-001 05/16/2022 3,294.46 1,125.58 RENT 3,294.46 001.000 02/16/2022 12
100-6602681-003 04/25/2022 0.00 0.00 RENT 478.00 001.000 04/26/2022 3
100-6602681-003 04/25/2022 0.00 0.00 RENT 478.00 001.000 04/26/2022 3
100-6754131-001 05/20/2022 747.75 0.00 RENT 747.75 001.000 04/26/2022 3
100-7214111-001 05/21/2022 542.97 0.00 RENT 542.97 001.000 04/26/2022 9
101-6898811-001 04/20/2022 0.00 0.00 RENT 15,035.55 001.000 04/26/2022 3
100-2406418-003 05/20/2022 200.00 0.00 MISC 219.00 001.000 04/26/2022 9
100-6943901-002 05/16/2022 236.40 0.00 MISC 257.67 001.000 04/26/2022 9
100-1623380-901 05/15/2022 1,769.11 0.00 RENT 1,769.11 001.000 04/26/2022 10
100-7107941-001 05/20/2022 1,038.95 0.00 RENT 1,038.95 001.000 02/23/2022 3
100-7031531-001 05/20/2022 120.00 0.00 MISC 130.92 001.000 04/26/2022 3
100-3630389-005 05/20/2022 168.00 0.00 MISC 181.86 001.000 04/26/2022 3
100-7174941-002 05/20/2022 1,667.38 0.00 MISC 1,804.93 001.000 04/26/2022 9
100-5204521-002 05/25/2022 3,222.20 0.00 RENT 3,222.20 001.000 04/26/2022 12
100-7241571-001 05/20/2022 55.00 0.00 MISC 59.54 001.000 04/26/2022 3
100-7182731-001 04/20/2022 0.00 0.00 RENT 1,025.37 001.000 04/26/2022 3
100-7182731-001 04/26/2022 0.00 0.00 RENT 1,025.37 001.000 04/26/2022 3
100-9726258-001 04/25/2022 0.00 0.00 RENT 255.97 001.000 04/26/2022 10
100-9726258-001 04/26/2022 0.00 0.00 RENT 255.97 001.000 04/26/2022 10
100-7220301-001 04/20/2022 0.00 0.00 RENT 1,238.00 001.000 04/26/2022 3
100-7151521-001 05/15/2022 94.00 0.00 MISC 102.46 001.000 04/26/2022 9
100-7237751-001 05/25/2022 2.00 101.65 MISC 2.14 001.000 04/26/2022 9
100-3876959-005 03/25/2022 0.00 0.00 RENT 60.74 001.000 09/27/2017 9
100-3910629-001 03/25/2022 0.00 0.00 RENT 245.81 001.000 03/30/2017 9
100-3876959-005 04/25/2022 0.00 0.00 RENT 60.74 001.000 09/27/2017 9
100-3910629-001 04/25/2022 0.00 0.00 RENT 245.81 001.000 03/30/2017 9
104-4687809-001 04/25/2022 -2,161.94 140.00 MISC 9.80 001.000 08/29/2018 9
100-3964329-001 04/28/2022 318.13 0.00 MISC 340.40 001.000 03/31/2017 9
100-3964329-001 03/28/2022 318.13 0.00 MISC 340.40 001.000 03/31/2017 9
100-1670517-003 04/16/2022 0.00 0.00 RENT 165.00 001.000 09/16/2021 3
100-4945021-001 05/15/2022 0.00 0.00 RENT 1,357.77 001.000 02/15/2019 3
100-3694757-001 05/01/2022 298.00 0.00 MISC 324.45 001.000 09/02/2016 9
100-3694757-001 04/01/2022 298.00 0.00 MISC 324.45 001.000 09/02/2016 9
100-6651721-002 07/25/2021 0.00 761.00 MISC 53.27 001.000 07/27/2021 9
100-6814061-001 04/06/2022 0.00 169.00 RENT 15.63 001.000 04/06/2022 3
100-7170651-001 04/07/2022 0.00 99.00 RENT 9.50 001.000 04/07/2022 3
100-2446458-002 04/06/2022 865.00 859.26 MISC 66.29 001.000 12/06/2016 9
100-2446458-002 05/06/2022 865.00 0.00 MISC 925.55 001.000 12/06/2016 9
102 records listed

@ -1,42 +0,0 @@
DAILY.MANUAL.INVOICE
CONTRACTS THAT WERE NOT INVOICED
PAGE 06-09-22 1
CHRG BUSINESS
CONTRACT.NO........ UATB.OIC.DUE RENTAL DUE......... UATB.IDS.OIC.PAYME TYPEM..... OUTSTANDING BALANCE.... SEGMENT. BOOKING.DATE BRANCH
100-0553300-001 04/01/2022 413.81 0.00 RENT 413.81 001.000 11/01/2020 4.3
047-4725409-001 04/14/2022 351.30 0.00 MISC 380.28 001.000 01/14/2019 3
100-1864627-002 05/14/2022 146.71 156.07 MISC 9.36 001.000 07/14/2017 9
100-6651721-001 07/14/2021 0.00 761.00 MISC 53.27 001.000 07/14/2021 9
100-0553300-001 05/01/2022 413.81 0.00 RENT 413.81 001.000 11/01/2020 4.3
100-6651721-002 07/25/2021 0.00 761.00 MISC 53.27 001.000 07/27/2021 9
100-0553300-001 01/01/2022 413.81 319.43 RENT 94.38 001.000 11/01/2020 4.3
047-4725409-001 05/14/2022 351.30 31.54 MISC 348.74 001.000 01/14/2019 3
100-5047921-001 06/15/2022 94.69 0.00 RENT 94.69 001.000 04/11/2019 3
100-3285968-004 05/25/2022 2,027.75 0.00 MISC 2,139.28 001.000 02/27/2019 9
100-0553300-001 06/01/2022 413.81 0.00 RENT 413.81 001.000 11/01/2020 4.3
100-0553300-001 02/01/2022 413.81 0.00 RENT 413.81 001.000 11/01/2020 4.3
100-7218171-001 05/19/2022 0.00 157.00 MISC 10.60 001.000 05/19/2022 3
047-4725409-001 06/14/2022 351.30 0.00 MISC 380.28 001.000 01/14/2019 3
100-5189011-002 07/01/2022 130.58 275.67 RENT 130.58 001.000 07/16/2019 12
100-2772548-003 06/25/2022 -830.51 0.00 MISC 601.48 001.000 05/30/2017 9
100-3285968-004 06/25/2022 2,027.75 0.00 MISC 2,139.28 001.000 02/27/2019 9
047-2903398-005 05/25/2022 0.00 0.00 MISC 58.25 001.000 04/25/2017 9
100-2911448-002 05/25/2022 0.00 1,895.04 RENT 30.43 001.000 04/29/2022 9
100-0553300-001 07/01/2022 413.81 0.00 RENT 413.81 001.000 11/01/2020 4.3
100-0553300-001 03/01/2022 413.81 0.00 RENT 413.81 001.000 11/01/2020 4.3
100-7220451-001 06/06/2022 0.00 171.00 RENT 19.45 001.000 06/06/2022 3
100-7268381-001 06/06/2022 0.00 151.00 RENT 11.33 001.000 06/06/2022 3
100-7314881-001 06/06/2022 0.00 119.00 RENT 9.88 001.000 06/06/2022 3
100-7317551-001 06/25/2022 2,916.00 0.00 RENT 2,916.00 001.000 05/27/2022 12
100-7289411-001 07/03/2022 556.33 0.00 RENT 556.33 001.000 06/03/2022 3
100-7304881-002 07/01/2022 60.90 0.00 MISC 66.27 001.000 06/08/2022 9
100-6943321-002 06/15/2022 8,012.77 0.03 RENT 8,012.77 001.000 04/12/2022 9
100-1477460-002 07/08/2022 34,915.99 0.00 RENT 34,915.99 001.000 06/08/2022 12
100-1516251-002 06/20/2022 1,485.99 0.00 RENT 1,485.99 001.000 09/24/2019 10
100-7352541-001 06/09/2022 1,422.30 0.00 RENT 711.15 001.000 06/09/2022 3
100-7352541-001 06/09/2022 1,422.30 0.00 RENT 711.15 001.000 06/09/2022 3
100-9677665-001 06/25/2022 242.11 0.00 RENT 242.11 001.000 08/30/2021 10
33 records listed

@ -1,51 +0,0 @@
DAILY.MANUAL.INVOICE
CONTRACTS THAT WERE NOT INVOICED
PAGE 06-10-22 1
CHRG BUSINESS
CONTRACT.NO........ UATB.OIC.DUE RENTAL DUE......... UATB.IDS.OIC.PAYME TYPEM..... OUTSTANDING BALANCE.... SEGMENT. BOOKING.DATE BRANCH
100-1049364-003 03/15/2022 79.56 0.00 RENT 79.56 001.000 10/01/2021 4.3
100-1049364-003 04/15/2022 79.56 0.00 RENT 79.56 001.000 10/01/2021 4.3
100-6651721-001 07/14/2021 0.00 761.00 MISC 53.27 001.000 07/14/2021 9
100-1049364-003 12/15/2021 79.56 68.40 RENT 11.16 001.000 10/01/2021 4.3
100-6651721-002 07/25/2021 0.00 761.00 MISC 53.27 001.000 07/27/2021 9
100-1049364-003 05/15/2022 79.56 0.00 RENT 79.56 001.000 10/01/2021 4.3
100-1049364-003 01/15/2022 79.56 0.00 RENT 79.56 001.000 10/01/2021 4.3
100-2170587-001 05/21/2022 484.62 0.00 RENT 484.62 001.000 03/26/2013 9
100-7218171-001 05/19/2022 0.00 157.00 MISC 10.60 001.000 05/19/2022 3
100-1049364-003 06/15/2022 79.56 0.00 RENT 79.56 001.000 10/01/2021 4.3
100-1049364-003 02/15/2022 79.56 0.00 RENT 79.56 001.000 10/01/2021 4.3
100-2170587-001 06/21/2022 484.62 0.00 RENT 484.62 001.000 03/26/2013 9
100-2772548-003 06/25/2022 -830.51 0.00 MISC 601.48 001.000 05/30/2017 9
047-2903398-005 05/25/2022 0.00 0.00 MISC 58.25 001.000 04/25/2017 9
100-2911448-002 05/25/2022 0.00 1,895.04 RENT 30.43 001.000 04/29/2022 9
100-7220451-001 06/06/2022 0.00 171.00 RENT 19.45 001.000 06/06/2022 3
100-7268381-001 06/06/2022 0.00 151.00 RENT 11.33 001.000 06/06/2022 3
100-7314881-001 06/06/2022 0.00 119.00 RENT 9.88 001.000 06/06/2022 3
100-7352541-001 06/09/2022 0.00 0.00 RENT 711.15 001.000 06/09/2022 3
100-7352541-001 06/09/2022 0.00 0.00 RENT 711.15 001.000 06/09/2022 3
100-9678164-001 06/25/2022 242.11 0.00 RENT 242.11 001.000 08/31/2021 10
100-1570785-001 06/24/2022 765.50 0.00 RENT 765.50 001.000 02/24/2020 10
100-4693949-001 06/17/2022 326.11 0.00 RENT 326.11 001.000 10/17/2018 3
100-1500564-011 07/04/2022 1,239.97 0.00 RENT 1,239.97 001.000 06/09/2022 12
100-9704497-001 06/16/2022 2,127.68 0.00 RENT 2,127.68 001.000 02/16/2022 10
100-7318371-001 07/01/2022 257.76 0.00 RENT 257.76 001.000 06/09/2022 9
100-1697447-005 06/20/2022 184.11 0.00 RENT 184.11 001.000 08/23/2019 3
100-1697447-004 06/20/2022 287.93 0.00 RENT 287.93 001.000 07/30/2019 3
100-4714407-008 07/01/2022 671.57 0.00 MISC 714.21 001.000 06/09/2022 9
100-6051107-001 06/20/2022 30.15 39.99 RENT 30.15 001.000 09/08/2020 9
100-3240348-006 06/14/2022 227.52 0.00 MISC 241.17 001.000 04/14/2022 9
100-6795737-003 07/10/2022 0.00 0.00 RENT 30,000.00 001.000 06/10/2022 12
100-9729335-001 06/10/2022 1,841.70 0.00 RENT 920.85 001.000 06/10/2022 10
100-9729335-001 06/10/2022 1,841.70 0.00 RENT 920.85 001.000 06/10/2022 10
100-7252451-001 06/10/2022 15.63 169.00 RENT 15.63 001.000 06/10/2022 3
100-6238218-001 06/19/2022 74.99 0.00 RENT 74.99 001.000 11/19/2021 9
100-7337851-001 06/10/2022 216.36 0.00 RENT 108.18 001.000 06/10/2022 3
100-7337851-001 06/10/2022 216.36 0.00 RENT 108.18 001.000 06/10/2022 3
100-7275051-001 06/10/2022 0.00 843.27 MISC 0.01 001.000 06/10/2022 3
100-1017678-003 07/01/2022 718.61 0.00 MISC 777.89 001.000 05/16/2019 12
100-4266879-003 07/03/2022 339.42 0.00 MISC 368.95 001.000 06/10/2022 9
41 records listed

@ -1,33 +0,0 @@
DAILY.MANUAL.INVOICE
CONTRACTS THAT WERE NOT INVOICED
PAGE 06-13-22 1
CHRG BUSINESS
CONTRACT.NO........ UATB.OIC.DUE RENTAL DUE......... UATB.IDS.OIC.PAYME TYPEM..... OUTSTANDING BALANCE.... SEGMENT. BOOKING.DATE BRANCH
100-6651721-001 07/14/2021 0.00 761.00 MISC 53.27 001.000 07/14/2021 9
100-6550098-001 05/20/2022 619.26 108.80 RENT 510.46 001.000 05/25/2021 3
100-6651721-002 07/25/2021 0.00 761.00 MISC 53.27 001.000 07/27/2021 9
100-7218171-001 05/19/2022 0.00 157.00 MISC 10.60 001.000 05/19/2022 3
100-2772548-003 06/25/2022 -830.51 0.00 MISC 601.48 001.000 05/30/2017 9
047-2903398-005 05/25/2022 0.00 0.00 MISC 58.25 001.000 04/25/2017 9
100-2911448-002 05/25/2022 0.00 1,895.04 RENT 30.43 001.000 04/29/2022 9
100-6795737-003 07/10/2022 30,000.00 0.00 RENT 30,000.00 001.000 06/10/2022 12
100-7252451-001 06/10/2022 0.00 169.00 RENT 15.63 001.000 06/10/2022 3
100-6238218-001 06/19/2022 74.99 0.00 RENT 74.99 001.000 11/19/2021 9
100-7337851-001 06/10/2022 0.00 0.00 RENT 108.18 001.000 06/10/2022 3
100-7337851-001 06/10/2022 0.00 0.00 RENT 108.18 001.000 06/10/2022 3
100-7275051-001 06/10/2022 0.00 843.27 MISC 0.01 001.000 06/10/2022 3
100-4266879-003 07/03/2022 339.42 0.00 MISC 368.95 001.000 06/10/2022 9
100-7203501-002 07/01/2022 40.00 0.00 MISC 42.50 001.000 06/10/2022 9
100-7282331-001 06/10/2022 0.00 0.00 RENT 1,432.54 001.000 06/10/2022 3
100-9735444-001 06/10/2022 0.00 0.00 RENT 214.90 001.000 06/10/2022 10
100-9735444-001 06/10/2022 0.00 0.00 RENT 214.90 001.000 06/10/2022 10
100-6930421-001 06/10/2022 0.00 0.00 RENT 1,982.24 001.000 06/10/2022 3
100-6930421-001 06/10/2022 0.00 0.00 RENT 1,982.24 001.000 06/10/2022 3
100-6721551-003 06/20/2022 1,210.36 0.00 RENT 1,210.36 001.000 09/24/2021 3
100-6721551-002 06/20/2022 613.92 0.00 RENT 613.92 001.000 09/23/2021 3
100-7136271-001 07/20/2022 176.54 0.00 RENT 176.54 001.000 03/22/2022 3
100-7171001-001 06/17/2022 68.92 0.00 RENT 68.92 001.000 03/17/2022 9
24 records listed

@ -1,40 +0,0 @@
DAILY.MANUAL.INVOICE
CONTRACTS THAT WERE NOT INVOICED
PAGE 06-14-22 1
CHRG BUSINESS
CONTRACT.NO........ UATB.OIC.DUE RENTAL DUE......... UATB.IDS.OIC.PAYME TYPEM..... OUTSTANDING BALANCE.... SEGMENT. BOOKING.DATE BRANCH
100-7269201-001 06/14/2022 17.11 172.00 RENT 17.11 001.000 06/14/2022 3
100-3654949-003 06/24/2022 1,086.99 0.00 RENT 1,086.99 001.000 09/24/2019 9
100-3654949-002 06/20/2022 1,789.52 0.00 RENT 1,789.52 001.000 09/19/2019 9
100-7199137-001 06/20/2022 1,068.97 0.00 RENT 1,068.97 001.000 04/29/2022 3
100-7284391-001 07/08/2022 91.25 0.00 RENT 91.25 001.000 06/08/2022 9
100-7209951-001 06/14/2022 0.00 160.00 MISC 11.20 001.000 06/14/2022 3
100-7334181-001 07/01/2022 338.41 0.00 MISC 366.32 001.000 06/14/2022 9
100-9570778-001 06/24/2022 637.91 0.00 RENT 637.91 001.000 02/24/2020 10
100-7234311-001 06/14/2022 15.81 204.00 RENT 15.81 001.000 06/14/2022 3
100-7294191-001 06/14/2022 14.80 160.00 RENT 14.80 001.000 06/14/2022 3
100-0849508-002 04/15/2022 2,392.50 0.00 RENT 2,392.50 001.000 10/01/2021 4.3
100-6651721-001 07/14/2021 0.00 761.00 MISC 53.27 001.000 07/14/2021 9
100-6651721-002 07/25/2021 0.00 761.00 MISC 53.27 001.000 07/27/2021 9
100-0849508-002 05/15/2022 2,392.50 0.00 RENT 2,392.50 001.000 10/01/2021 4.3
100-0849508-002 06/15/2022 2,392.50 0.00 RENT 2,392.50 001.000 10/01/2021 4.3
100-2772548-003 06/25/2022 -830.51 0.00 MISC 601.48 001.000 05/30/2017 9
100-3618019-001 06/25/2022 428.34 0.00 MISC 466.36 001.000 09/28/2016 9
047-2903398-005 05/25/2022 0.00 0.00 MISC 58.25 001.000 04/25/2017 9
100-2911448-002 05/25/2022 0.00 1,895.04 RENT 30.43 001.000 04/29/2022 9
100-7252451-001 06/10/2022 0.00 169.00 RENT 15.63 001.000 06/10/2022 3
100-7275051-001 06/10/2022 0.00 843.27 MISC 0.01 001.000 06/10/2022 3
100-7113121-001 07/13/2022 2,500.39 0.00 RENT 2,500.39 001.000 06/13/2022 3
100-7342981-001 07/08/2022 103.56 0.00 MISC 109.77 001.000 06/08/2022 9
100-7113391-002 07/01/2022 2,275.30 0.00 RENT 2,275.30 001.000 06/13/2022 3
100-5398561-002 07/01/2022 786.33 0.00 MISC 847.27 001.000 06/13/2022 9
100-4457819-001 06/20/2022 5,785.12 0.00 RENT 5,785.12 001.000 05/31/2018 3
100-3744149-012 07/08/2022 50.00 0.00 MISC 53.00 001.000 06/13/2022 9
100-3154768-008 07/01/2022 897.26 0.00 MISC 980.27 001.000 06/13/2022 9
100-7318021-001 07/03/2022 295.00 0.00 MISC 320.08 001.000 06/13/2022 9
100-2146226-002 07/01/2022 558.96 0.00 RENT 558.96 001.000 06/13/2022 9
30 records listed

@ -1,32 +0,0 @@
DAILY.MANUAL.INVOICE
CONTRACTS THAT WERE NOT INVOICED
PAGE 06-15-22 1
CHRG BUSINESS
CONTRACT.NO........ UATB.OIC.DUE RENTAL DUE......... UATB.IDS.OIC.PAYME TYPEM..... OUTSTANDING BALANCE.... SEGMENT. BOOKING.DATE BRANCH
100-7269201-001 06/14/2022 0.00 172.00 RENT 17.11 001.000 06/14/2022 3
100-7209951-001 06/14/2022 0.00 160.00 MISC 11.20 001.000 06/14/2022 3
100-7334181-001 07/01/2022 338.41 0.00 MISC 366.32 001.000 06/14/2022 9
100-7234311-001 06/14/2022 0.00 204.00 RENT 15.81 001.000 06/14/2022 3
100-7294191-001 06/14/2022 0.00 160.00 RENT 14.80 001.000 06/14/2022 3
100-9570729-001 06/24/2022 637.91 0.00 RENT 637.91 001.000 02/24/2020 10
100-7080901-001 06/14/2022 0.00 0.00 MISC 177.62 001.000 06/14/2022 3
100-7313341-001 07/09/2022 217.00 0.00 RENT 217.00 001.000 06/14/2022 9
100-7363251-001 06/14/2022 0.00 0.00 RENT 13,168.80 001.000 06/14/2022 3
100-1564449-001 07/03/2022 430.01 0.00 RENT 430.01 001.000 02/03/2020 10
100-7233611-001 06/15/2022 17.36 179.00 RENT 17.36 001.000 06/15/2022 3
100-7151111-001 06/15/2022 480.40 0.00 RENT 480.40 001.000 06/15/2022 9
100-9737145-001 06/15/2022 590.20 0.00 RENT 295.10 001.000 06/15/2022 10
100-9737145-001 06/15/2022 590.20 0.00 RENT 295.10 001.000 06/15/2022 10
100-7303761-001 08/14/2022 0.00 0.00 RENT 240,632.43 001.000 06/14/2022 12
100-6651721-001 07/14/2021 0.00 761.00 MISC 53.27 001.000 07/14/2021 9
100-6651721-002 07/25/2021 0.00 761.00 MISC 53.27 001.000 07/27/2021 9
100-6726271-001 06/15/2022 1,588.04 0.00 RENT 1,588.04 001.000 08/31/2021 12
100-2772548-003 06/25/2022 -830.51 0.00 MISC 601.48 001.000 05/30/2017 9
047-2903398-005 05/25/2022 0.00 0.00 MISC 58.25 001.000 04/25/2017 9
100-2911448-002 05/25/2022 0.00 1,895.04 RENT 30.43 001.000 04/29/2022 9
100-5864201-501 07/07/2022 143.00 0.00 MISC 153.01 001.000 09/01/2020 9
22 records listed

@ -1,142 +0,0 @@
import os
import pandas as pd
from datetime import datetime as dt, timedelta
import re
from pathlib import Path
import time
import numpy as np
from pprint import pprint as prt
def pfd(df: pd.DataFrame):
with pd.option_context('display.max_rows', None, 'display.max_columns', None): # more options can be specified also
print(df)
def create_line_divider(breakage_list: list):
"""
This allows for the creation of a custom data extractor
Breakage list defines the split points that will be used for the line
Example
Given breakage_list [10, 20, 30]
using slot_num 0 in the resulting extract_line_slot will yield
characters 0 - 10 from the string.
Slot 1 would give characters 10 - 20
"""
def extract_line_slot(slot_num : int, line_string: str, debug : bool = False):
"""
Pulls data from a line/string using break points defined by the
parent function.
ONLY USE THIS FUNCTION THROUGH CREATION USING 'create_line_extractor'
Will automatically convert numbers to floats
"""
# We can't have a slot number higher than the number of slots
assert(slot_num < len(breakage_list)+1)
low_range = 0 if slot_num == 0 else breakage_list[slot_num-1]
high_range = len(line_string) if slot_num == len(breakage_list) else breakage_list[slot_num]
# In order to create a float we need to remove the , from the string
data = line_string[low_range:high_range].strip().replace(",", "")
try: data = float(data)
except: pass
if debug:
print(f"Slot num: {slot_num} | Low: {low_range} | High: {high_range} | Data: {data}")
return data
return extract_line_slot
def minv(report: str, save_name: str):
lines = report.splitlines()
data_extractor = create_line_divider([15,32,52,71,83,107,116,128])
extracted_data_dict = {
"ContractNumber" : [],
"UTAB_OIC_DUE" : [],
"RentalDue" : [],
"UTAB_OIC_PYMT" : [],
"ChargeType" : [],
"OutstandBalance" : [],
"BizSegment" : [],
"BookingDate" : [],
"Branch" : [],
}
columns = list(extracted_data_dict.keys())
for line in enumerate(lines):
if re.search(contract_number_regex, line[1]) != None:
[extracted_data_dict[columns[c]].append(data_extractor(c,line[1],debug=False)) for c in range(0,len(columns))]
#All the list lengths need to be the same so if anything was missed it will fail to build
dataframe = pd.DataFrame(extracted_data_dict)
# ( bookdate != today & rent = 0 ) OR (outstanding > 100 & rent = 0)
# dt.today().strftime("%m/%m/%Y")
filtered = dataframe[
((dataframe["BookingDate"] != '04/26/2022') & (dataframe["RentalDue"] == 0)) |\
((dataframe["RentalDue"] == 0 ) & (dataframe["OutstandBalance"] > 100))]
filtered.to_excel(save_name, index=False)
return filtered
current_output = [
'100-1011756-004',
'100-1354567-002',
'100-1637209-005',
'100-1665517-003',
'100-1670517-003',
'100-2081987-008',
'100-2139037-002',
'100-2446458-002',
'100-2453558-003',
'100-2611389-007',
'100-3492758-003',
'100-3500858-001',
'100-3694757-001',
'100-3725849-003',
'100-3876959-007',
'100-3910629-001',
'100-3964329-001',
'100-4462739-001',
'100-4850431-001',
'100-4945021-001',
'100-5382471-001',
'100-6738611-001',
'100-6849836-001',
'100-7037791-001',
'100-7045691-001',
'100-7052571-001',
'100-7059671-001',
'100-7087121-001',
'100-7107941-001',
'100-7146771-001',
'100-7156851-001',
'100-7178461-001',
'100-7203371-001',
'100-7219911-001',
'100-7232561-001',
'100-7237601-001',
'100-7242461-001',
'100-9660710-001',
'100-9723689-001',
]
contract_number_regex = "\d{3}-\d{7}-\d{3}"
with open("2022.05.04_MINV_C", errors="replace") as ifile:
report = ifile.read()
fin_df = minv(report, "man_inv_test.xlsx")
pfd(fin_df)
il_contracts = fin_df.ContractNumber.to_list()
prt(il_contracts)
extra_contracts = []
not_included = []
for c in il_contracts:
if c not in current_output:
extra_contracts.append(c)
for c in current_output:
if c not in il_contracts:
not_included.append(c)
print("\nExtra Contracts:")
prt(extra_contracts)
print("Not Included Contracts:")
prt(not_included)
print(f"MATCHING CONTRACTS: {il_contracts == current_output}")
print(f"Current # contract {len(current_output)} | ILE Processed Contracts: {len(il_contracts)}")
print(f"# Extra contracts included: {len(extra_contracts)} | # Contracts not included: {len(not_included)}")

@ -1,152 +0,0 @@
import os
import pandas as pd
from datetime import datetime as dt, timedelta
import sys, getopt
import re
from pathlib import Path
import time
from pprint import pprint as prt
import numpy as np
contract_number_regex = "\d{3}-\d{7}-\d{3}"
def create_line_divider(breakage_list: list):
"""
This allows for the creation of a custom data extractor
Breakage list defines the split points that will be used for the line
Example
Given breakage_list [10, 20, 30]
using slot_num 0 in the resulting extract_line_slot will yield
characters 0 - 10 from the string.
Slot 1 would give characters 10 - 20
"""
def extract_line_slot(slot_num : int, line_string: str, debug : bool = False):
"""
Pulls data from a line/string using break points defined by the
parent function.
ONLY USE THIS FUNCTION THROUGH CREATION USING 'create_line_extractor'
Will automatically convert numbers to floats
"""
assert(slot_num < len(breakage_list)+1)
low_range = 0 if slot_num == 0 else breakage_list[slot_num-1]
high_range = len(line_string) if slot_num == len(breakage_list) else breakage_list[slot_num]
data = line_string[low_range:high_range].strip().replace(",", "")
try: data = float(data)
except: pass
if debug:
print(f"Slot num: {slot_num} | Low: {low_range} | High: {high_range} | Data: {data}")
return data
return extract_line_slot
def net_invest_trial_balance(report: str, save_name: str):
lines = report.splitlines()
extracted_data_dict = {
'CUSTOMER NAME' : [],
'CURR INT RCVB' : [],
'UNEARNED BLENDED' : [],
'BLEND NET INV' : [],
'LEASE NUMBER' : [],
'GROSS CONTRACT' : [],
'CURR RENT RCVB' : [],
'UNEARN FIN' : [],
'END DEPOSIT' : [],
'SEC DEPOSIT' : [],
'LEASE PYMTS' : [],
'TOTAL' : [],
'CONTRACT STAT' : [],
'PAYMENTS RCVD' : [],
'REM RENT RCVB' : [],
'UNEARN RESID' : [],
'PROV LOSS' : [],
'NET RESERVE' : [],
'UNEARN INC' : [],
'BAL REMAINING' : [],
'RESIDUAL' : [],
'UNPAID INT' : [],
'NET INV' : [],
'UNEARNED IDC' : [],
"LESSOR": []
}
lessors = []
columns = list(extracted_data_dict.keys())
line0 = list(zip(columns[0:4], [0,3,4,5]))
line1 = list(zip(columns[4:12], [i for i in range(0,8)]))
line2 = list(zip(columns[12:19], [i for i in range(0,7)]))
line3 = list(zip(columns[19:-1], [i for i in range(1,6)]))
for l in [line0,line1,line2,line3]:
print(f"\n{l}")
data_extractor = create_line_divider([18,32,50,66,84,100,117])
for line in enumerate(lines):
slot1 = data_extractor(0,line[1],False)
if type(slot1) != str : continue
if re.search(contract_number_regex, slot1) != None:
data_section = lines[line[0]-1:line[0]+3]
if data_section[0].find(".") == -1:
data_section[0] = lines[line[0]-2]
for ds in enumerate(data_section):
if ds[1].find(".") == -1:
if ds[0] < len(data_section) -1:
for i in range(ds[0], len(data_section)-1):
#print(f"{i}: { data_section[i]}")
data_section[i] = data_section[i+1]
#print(f"DELTA| {i}: { data_section[i]}")
data_section[3] = lines[line[0]+3]
else:
data_section[3] = lines[line[0]+3]
# [print(f"\n{d[0]}: {d[1]}") for d in enumerate(data_section)]
# print('\n')
[extracted_data_dict[c[0]].append(data_extractor(c[1], data_section[0], False)) for c in line0]
[extracted_data_dict[c[0]].append(data_extractor(c[1], data_section[1], False)) for c in line1]
[extracted_data_dict[c[0]].append(data_extractor(c[1], data_section[2], False)) for c in line2]
[extracted_data_dict[c[0]].append(data_extractor(c[1], data_section[3], False)) for c in line3]
extracted_data_dict["LESSOR"].append(extracted_data_dict["LEASE NUMBER"][-1][0:3])
if extracted_data_dict["LESSOR"][-1] not in lessors:
print(extracted_data_dict["LESSOR"][-1])
lessors.append(extracted_data_dict["LESSOR"][-1])
print(lessors)
for c in columns:
print(f"C: {c} | {len(extracted_data_dict[c])}")
print(lessors)
dataframe = pd.DataFrame(extracted_data_dict)
summary_series = []
for lessor in lessors:
reduced_df = dataframe.loc[dataframe["LESSOR"] == lessor]
del reduced_df["CUSTOMER NAME"]
del reduced_df["LEASE NUMBER"]
del reduced_df["CONTRACT STAT"]
reduced_df = reduced_df.replace("", np.NaN)
reduced_df = reduced_df.replace("REVOLV", np.NaN)
reduced_df = reduced_df.replace("ING ACCOUNT", np.NaN)
summation = reduced_df.sum(skipna=True, axis=0)
summation["LESSOR"] = lessor
summation["CONTRACT COUNT"] = len(reduced_df.index)
summary_series.append(summation)
summary_df = pd.concat(summary_series, axis=1).transpose().set_index("LESSOR")
prt(summary_df)
with pd.ExcelWriter(save_name) as writer:
dataframe.to_excel(writer, index=False, sheet_name="data")
pd.DataFrame(summary_df).to_excel(writer, index=True, sheet_name="Summary")
return dataframe
with open("/config/workspace/LEAF/IL Extract SRC/2022.05.20 Net Investment", errors="replace") as rep_file:
report = rep_file.read()
prt(net_invest_trial_balance(report, "520_NI_TEST.xlsx"))

@ -1,97 +0,0 @@
import os
import pandas as pd
from datetime import datetime as dt, timedelta
import sys, getopt
import re
from pathlib import Path
import time
from pprint import pprint as prt
import numpy as np
contract_number_regex = "\d{3}-\d{7}-\d{3}"
def create_line_divider(breakage_list: list):
"""
This allows for the creation of a custom data extractor
Breakage list defines the split points that will be used for the line
Example
Given breakage_list [10, 20, 30]
using slot_num 0 in the resulting extract_line_slot will yield
characters 0 - 10 from the string.
Slot 1 would give characters 10 - 20
"""
def extract_line_slot(slot_num : int, line_string: str, debug : bool = False):
"""
Pulls data from a line/string using break points defined by the
parent function.
ONLY USE THIS FUNCTION THROUGH CREATION USING 'create_line_extractor'
Will automatically convert numbers to floats
"""
assert(slot_num < len(breakage_list)+1)
low_range = 0 if slot_num == 0 else breakage_list[slot_num-1]
high_range = len(line_string) if slot_num == len(breakage_list) else breakage_list[slot_num]
data = line_string[low_range:high_range].strip().replace(",", "")
try: data = float(data)
except: pass
if debug:
print(f"Slot num: {slot_num} | Low: {low_range} | High: {high_range} | Data: {data}")
return data
return extract_line_slot
def renewal_net_invest_trial_balance(report: str, save_name: str):
lines = report.splitlines()
data_extractor = create_line_divider([21,29,43,58,71,88,99,113])
extracted_data_dict = {
'CUSTOMER NAME' : [],
'TYPE' : [],
'GROSS RENEWAL' : [],
'REMAINING BAL' : [],
'FINANCED RES' : [],
'REMAINING RES' : [],
'LEASE PYMTS' : [],
'CONTRACT NUMBER' : [],
'RENEWAL' : [],
'PAYMENTS RCVD' : [],
'CUR RENT RCVB' : [],
'UNEARNED RIN' : [],
'SECURITY DEP' : [],
'NET INVEST' : [],
'UNEARN INCOME' : [],
'TOTAL' : [],
'REM RENT RCVB' : [],
'UNPAID RES' : [],
}
columns = list(extracted_data_dict.keys())
line0 = list(zip(columns[0:7], [0,1,2,3,4,5,7]))
line1 = list(zip(columns[7:16], [i for i in range(0,9)]))
line2 = list(zip(columns[16:], [3,4]))
for line in enumerate(lines):
slot1 = data_extractor(0,line[1],False)
if type(slot1) != str : continue
if re.search(contract_number_regex, slot1) != None:
data_section = lines[line[0]-1:line[0]+2]
if data_section[0].find(".") == -1:
data_section[0] = lines[line[0]-2]
for ds in enumerate(data_section):
if ds[1].find(".") == -1:
if ds[0] < len(data_section) -1:
for i in range(ds[0], len(data_section)-1):
data_section[i] = data_section[i+1]
data_section[2] = lines[line[0]+2]
else:
data_section[2] = lines[line[0]+2]
[extracted_data_dict[c[0]].append(data_extractor(c[1], data_section[0])) for c in line0]
[extracted_data_dict[c[0]].append(data_extractor(c[1], data_section[1])) for c in line1]
[extracted_data_dict[c[0]].append(data_extractor(c[1], data_section[2])) for c in line2]
dataframe = pd.DataFrame(extracted_data_dict)
dataframe.to_excel(save_name, index=False)
return dataframe
with open("/config/workspace/LEAF/IL Extract SRC/2022.05.20 Renewal Net Investment", errors="replace") as rep_file:
report = rep_file.read()
prt(renewal_net_invest_trial_balance(report, "RN_TEST_0606.xlsx"))

@ -1,110 +0,0 @@
import os
import pandas as pd
from datetime import datetime as dt, timedelta
import sys, getopt
import re
from pathlib import Path
import time
import numpy as np
contract_number_regex = "\d{3}-\d{7}-\d{3}"
def create_line_divider(breakage_list: list):
"""
This allows for the creation of a custom data extractor
Breakage list defines the split points that will be used for the line
Example
Given breakage_list [10, 20, 30]
using slot_num 0 in the resulting extract_line_slot will yield
characters 0 - 10 from the string.
Slot 1 would give characters 10 - 20
"""
def extract_line_slot(slot_num : int, line_string: str, debug : bool = False):
"""
Pulls data from a line/string using break points defined by the
parent function.
ONLY USE THIS FUNCTION THROUGH CREATION USING 'create_line_extractor'
Will automatically convert numbers to floats
"""
# We can't have a slot number higher than the number of slots
assert(slot_num < len(breakage_list)+1)
low_range = 0 if slot_num == 0 else breakage_list[slot_num-1]
high_range = len(line_string) if slot_num == len(breakage_list) else breakage_list[slot_num]
# In order to create a float we need to remove the , from the string
data = line_string[low_range:high_range].strip().replace(",", "")
try: data = float(data)
except: pass
if debug:
print(f"Slot num: {slot_num} | Low: {low_range} | High: {high_range} | Data: {data}")
return data
return extract_line_slot
def ach(report: str, save_name: str):
lines = report.splitlines()
extracted_data_dict = {
"ContractNumber" : [],
"CustomerName" : [],
"BankCode" : [],
"BankNumber": [],
"AccountNumber" : [],
"Payment" : [],
"Batch": [],
"Lessor": [],
"PaymentDate": [],
}
columns = list(extracted_data_dict.keys())
batches = {
"batch_num": [],
"payment_date": [],
"lessor": [],
#"count": [],
"total": []
}
data_extractor = create_line_divider([19,57,67,82,104])
bank_number_regex = "\d{9}"
batch_num_regex = "BATCH \d{4} TOTAL"
for line in enumerate(lines):
# Check for a contract number and a bank number in the line
if (re.search(contract_number_regex, line[1]) != None) & (re.search(bank_number_regex, line[1]) != None):
# Iterates through the columns list and adds the corresponding slot number to the dictonary for the column
# Here the order of the columns (keys in dictonary) matter since they need to be in the same order as
# the slot numbers
[extracted_data_dict[columns[c]].append(data_extractor(c, line[1])) for c in range(0, len(columns)-3)]
# This searches for a statement that looks like a batch number
# This sums the contracts by thier lessor code. A feature requested by cash apps
if re.search(batch_num_regex, line[1]) != None:
# Batch number is always in characters 96 to 101
batches["batch_num"].append(line[1][96:101])
# Payment date will be 2 lines below that between charactes 114 and 125
batches["payment_date"].append(lines[line[0]+2][114:125])
# Lessor is just the first three number sof the contract number
batches["lessor"].append(extracted_data_dict["ContractNumber"][-1][0:3])
# Total is a number given by the report for that batch. ',' is removed so that it can be transformed into a float
batches["total"].append(float(line[1][107:125].strip().replace(",", "")))
#print(f"{line[0]+6} | {lines[line[0]+6][107:125]}\n{lines[line[0]+6]}")
#batches["count"].append(float(lines[line[0]+6][107:125].strip().replace(",", "")))
# Any time there's a new batch we need to add this data to the dictionary up up to the currrent place
# So we iterate over the number of contracts and add in the newest value for each that don't have one of these values already
[extracted_data_dict["Batch"].append(batches["batch_num"][-1]) for _ in range(0, (len(extracted_data_dict["BankCode"]) - len(extracted_data_dict["Batch"])))]
[extracted_data_dict["Lessor"].append(batches["lessor"][-1]) for _ in range(0, (len(extracted_data_dict["BankCode"]) - len(extracted_data_dict["Lessor"])))]
[extracted_data_dict["PaymentDate"].append(batches["payment_date"][-1]) for _ in range(0, (len(extracted_data_dict["BankCode"]) - len(extracted_data_dict["PaymentDate"])))]
# Now the dictioanry lists should all be equal lengths and we can create a dataframe
dataframe = pd.DataFrame(extracted_data_dict)
# We're creating two sheets: data & summary so we need to open and excel writer
# This also helps with a bug caused by larger dataframes
with pd.ExcelWriter(save_name) as writer:
dataframe.to_excel(writer, index=False, sheet_name="data")
# The batches dictioanry is converted to a dataframe and added as it's own sheet
pd.DataFrame(batches).to_excel(writer, index=False, sheet_name="Summary")
return dataframe
r1 = "/config/workspace/LEAF/IL Extract SRC/ach_errors/2022.05.27_ACH_C"
r2 = "/config/workspace/LEAF/IL Extract SRC/ach_errors/2022.06.03_ACH_C"
with open(r2, errors="replace") as ifile:
report = ifile.read()
ach(report, "test_ach_0613.xlsx")

@ -1,87 +0,0 @@
import os
import pandas as pd
from datetime import datetime as dt, timedelta
import sys, getopt
import re
from pathlib import Path
import time
from pprint import pprint as prt
contract_number_regex = "\d{3}-\d{7}-\d{3}"
def create_line_divider(breakage_list: list):
"""
This allows for the creation of a custom data extractor
Breakage list defines the split points that will be used for the line
Example
Given breakage_list [10, 20, 30]
using slot_num 0 in the resulting extract_line_slot will yield
characters 0 - 10 from the string.
Slot 1 would give characters 10 - 20
"""
def extract_line_slot(slot_num : int, line_string: str, debug : bool = False):
"""
Pulls data from a line/string using break points defined by the
parent function.
ONLY USE THIS FUNCTION THROUGH CREATION USING 'create_line_extractor'
Will automatically convert numbers to floats
"""
assert(slot_num < len(breakage_list)+1)
low_range = 0 if slot_num == 0 else breakage_list[slot_num-1]
high_range = len(line_string) if slot_num == len(breakage_list) else breakage_list[slot_num]
data = line_string[low_range:high_range].strip().replace(",", "")
try: data = float(data)
except: pass
if debug:
print(f"Slot num: {slot_num} | Low: {low_range} | High: {high_range} | Data: {data}")
return data
return extract_line_slot
def ach(report: str, save_name: str):
lines = report.splitlines()
extracted_data_dict = {
"ContractNumber" : [],
"CustomerName" : [],
"BankCode" : [],
"BankNumber": [],
"AccountNumber" : [],
"Payment" : [],
"Batch": [],
"Lessor": [],
"PaymentDate": [],
}
columns = list(extracted_data_dict.keys())
batches = {
"batch_num": [],
"payment_date": [],
"lessor": [],
"count": [],
"total": []
}
data_extractor = create_line_divider([19,57,67,82,104])
bank_number_regex = "\d{9}"
batch_num_regex = "BATCH \d{4} TOTAL"
for line in enumerate(lines):
if (re.search(contract_number_regex, line[1]) != None) & (re.search(bank_number_regex, line[1]) != None):
[extracted_data_dict[columns[c]].append(data_extractor(c, line[1])) for c in range(0, len(columns)-3)]
if re.search(batch_num_regex, line[1]) != None:
batches["batch_num"].append(line[1][96:101])
batches["payment_date"].append(lines[line[0]+2][114:125])
batches["lessor"].append(extracted_data_dict["ContractNumber"][-1][0:3])
batches["total"].append(float(line[1][107:125].strip().replace(",", "")))
batches["count"].append(float(lines[line[0]+6][107:125].strip().replace(",", "")))
[extracted_data_dict["Batch"].append(batches["batch_num"][-1]) for _ in range(0, (len(extracted_data_dict["BankCode"]) - len(extracted_data_dict["Batch"])))]
[extracted_data_dict["Lessor"].append(batches["lessor"][-1]) for _ in range(0, (len(extracted_data_dict["BankCode"]) - len(extracted_data_dict["Lessor"])))]
[extracted_data_dict["PaymentDate"].append(batches["payment_date"][-1]) for _ in range(0, (len(extracted_data_dict["BankCode"]) - len(extracted_data_dict["PaymentDate"])))]
dataframe = pd.DataFrame(extracted_data_dict)
return dataframe
with open("/config/workspace/LEAF/IL Extract SRC/2022.05.04_ACH_C") as rep_file:
report = rep_file.read()
prt(ach(report, "ACH_TESTING.xlsx"))

@ -1,60 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 19.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 64 64" enable-background="new 0 0 64 64" xml:space="preserve">
<g id="Text-files">
<path d="M53.9791489,9.1429005H50.010849c-0.0826988,0-0.1562004,0.0283995-0.2331009,0.0469999V5.0228
C49.7777481,2.253,47.4731483,0,44.6398468,0h-34.422596C7.3839517,0,5.0793519,2.253,5.0793519,5.0228v46.8432999
c0,2.7697983,2.3045998,5.0228004,5.1378999,5.0228004h6.0367002v2.2678986C16.253952,61.8274002,18.4702511,64,21.1954517,64
h32.783699c2.7252007,0,4.9414978-2.1725998,4.9414978-4.8432007V13.9861002
C58.9206467,11.3155003,56.7043495,9.1429005,53.9791489,9.1429005z M7.1110516,51.8661003V5.0228
c0-1.6487999,1.3938999-2.9909999,3.1062002-2.9909999h34.422596c1.7123032,0,3.1062012,1.3422,3.1062012,2.9909999v46.8432999
c0,1.6487999-1.393898,2.9911003-3.1062012,2.9911003h-34.422596C8.5049515,54.8572006,7.1110516,53.5149002,7.1110516,51.8661003z
M56.8888474,59.1567993c0,1.550602-1.3055,2.8115005-2.9096985,2.8115005h-32.783699
c-1.6042004,0-2.9097996-1.2608986-2.9097996-2.8115005v-2.2678986h26.3541946
c2.8333015,0,5.1379013-2.2530022,5.1379013-5.0228004V11.1275997c0.0769005,0.0186005,0.1504021,0.0469999,0.2331009,0.0469999
h3.9682999c1.6041985,0,2.9096985,1.2609005,2.9096985,2.8115005V59.1567993z"/>
<path d="M38.6031494,13.2063999H16.253952c-0.5615005,0-1.0159006,0.4542999-1.0159006,1.0158005
c0,0.5615997,0.4544001,1.0158997,1.0159006,1.0158997h22.3491974c0.5615005,0,1.0158997-0.4542999,1.0158997-1.0158997
C39.6190491,13.6606998,39.16465,13.2063999,38.6031494,13.2063999z"/>
<path d="M38.6031494,21.3334007H16.253952c-0.5615005,0-1.0159006,0.4542999-1.0159006,1.0157986
c0,0.5615005,0.4544001,1.0159016,1.0159006,1.0159016h22.3491974c0.5615005,0,1.0158997-0.454401,1.0158997-1.0159016
C39.6190491,21.7877007,39.16465,21.3334007,38.6031494,21.3334007z"/>
<path d="M38.6031494,29.4603004H16.253952c-0.5615005,0-1.0159006,0.4543991-1.0159006,1.0158997
s0.4544001,1.0158997,1.0159006,1.0158997h22.3491974c0.5615005,0,1.0158997-0.4543991,1.0158997-1.0158997
S39.16465,29.4603004,38.6031494,29.4603004z"/>
<path d="M28.4444485,37.5872993H16.253952c-0.5615005,0-1.0159006,0.4543991-1.0159006,1.0158997
s0.4544001,1.0158997,1.0159006,1.0158997h12.1904964c0.5615025,0,1.0158005-0.4543991,1.0158005-1.0158997
S29.0059509,37.5872993,28.4444485,37.5872993z"/>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.9 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 18 KiB

@ -1,2 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" id="Outline" viewBox="0 0 24 24" width="512" height="512"><path d="M19,3H12.472a1.019,1.019,0,0,1-.447-.1L8.869,1.316A3.014,3.014,0,0,0,7.528,1H5A5.006,5.006,0,0,0,0,6V18a5.006,5.006,0,0,0,5,5H19a5.006,5.006,0,0,0,5-5V8A5.006,5.006,0,0,0,19,3ZM5,3H7.528a1.019,1.019,0,0,1,.447.1l3.156,1.579A3.014,3.014,0,0,0,12.472,5H19a3,3,0,0,1,2.779,1.882L2,6.994V6A3,3,0,0,1,5,3ZM19,21H5a3,3,0,0,1-3-3V8.994l20-.113V18A3,3,0,0,1,19,21Z"/></svg>

Before

Width:  |  Height:  |  Size: 512 B

168
lbf.py

@ -1,168 +0,0 @@
import os
import pandas as pd
from datetime import datetime as dt, timedelta
import sys, getopt
import re
from pathlib import Path
import time
import numpy as np
from pprint import pprint as prt
contract_number_regex = "\d{3}-\d{7}-\d{3}"
def dict_lens(dictionary):
columns = list(dictionary.keys())
for c in columns:
print(f"{c} : {len(dictionary[c])}")
def create_line_divider(breakage_list: list):
"""
This allows for the creation of a custom data extractor
Breakage list defines the split points that will be used for the line
Example
Given breakage_list [10, 20, 30]
using slot_num 0 in the resulting extract_line_slot will yield
characters 0 - 10 from the string.
Slot 1 would give characters 10 - 20
"""
def extract_line_slot(slot_num : int, line_string: str, debug : bool = False):
"""
Pulls data from a line/string using break points defined by the
parent function.
ONLY USE THIS FUNCTION THROUGH CREATION USING 'create_line_extractor'
Will automatically convert numbers to floats
"""
# We can't have a slot number higher than the number of slots
assert(slot_num < len(breakage_list)+1)
low_range = 0 if slot_num == 0 else breakage_list[slot_num-1]
high_range = len(line_string) if slot_num == len(breakage_list) else breakage_list[slot_num]
# In order to create a float we need to remove the , from the string
data = line_string[low_range:high_range].strip().replace(",", "")
try: data = float(data)
except: pass
if debug:
print(f"Slot num: {slot_num} | Low: {low_range} | High: {high_range} | Data: {data}")
return data
return extract_line_slot
def lockbox(report: str, save_name: str):
lines = report.splitlines()
extracted_data_dict = {
"CustomerName" : [],
"PaymentDate" : [],
"InvoiceNumber" : [],
"CheckNumber" : [],
"InvoicePayment" : [],
"ContractNumber" : [],
"ContractPayment" : [],
}
# These are lists of the dictionary columns/keys and the data slots in which
# that data can be found in the report. this way we can iterate through them
# While extracting data
bank_payment_records = [list(extracted_data_dict.keys())[1:5],[1,2,3,4]]
infolease_payment_records = [list(extracted_data_dict.keys())[5:],[7,8]]
# Below are the Regular Exppressions used to find relvant data lines
full_line = "\d*\s{5}\d{2}/\d{2}/\d{4}\s{4}1"
contract_only_line = "\s{90}\d.{7}1\d{2}-"
cust_name_line = "\s{98}.{28}\D*"
# The data extractor allows us to extract data from the report using slots
# Slots are ranges of character denote by the list feed into the creation function
data_extractor = create_line_divider([9,19,39,56,69,90,98,118])
for line in enumerate(lines):
# We can skip empty lines
if len(line[1]) == 0: continue
# First we should check if there is a full line of data (defined by regex)
if re.search(full_line, line[1]):
# If this is true then we can iterate through the lists we created earlier and append the data to our dict
for k in range(0,len(bank_payment_records[0])):
extracted_data_dict[bank_payment_records[0][k]].append(data_extractor(bank_payment_records[1][k],line[1]))
for k in range(0,len(infolease_payment_records[0])):
extracted_data_dict[infolease_payment_records[0][k]].append(data_extractor(infolease_payment_records[1][k],line[1]))
# Otherwise we should check if this is a line with only contract data
elif re.search(contract_only_line,line[1]):
# If that's the case we can use the 'bank payment data' from the previous entry since it should apply to his contract
for k in range(0,len(bank_payment_records[0])):
extracted_data_dict[bank_payment_records[0][k]].append(extracted_data_dict[bank_payment_records[0][k]][-1])
for k in range(0,len(infolease_payment_records[0])):
extracted_data_dict[infolease_payment_records[0][k]].append(data_extractor(infolease_payment_records[1][k],line[1]))
# If it doesn't hit either of these critera then continue since it's irelevant data
else: continue
i = 1
# used to track how many lines below the current line we're looking for the customer name
# keep moving down a line and checking for a customer name
# Customer name typically happens 1 line under data but can be 13 lines if cut off by page end
while re.search(cust_name_line,lines[line[0]+i]) == None:
i += 1
# Once it hits, add the name to the dict
extracted_data_dict["CustomerName"].append(data_extractor(7,lines[line[0]+i]))
dataframe = pd.DataFrame(extracted_data_dict)
dataframe.to_excel(save_name, index=False)
return dataframe
def lb2(report:str, save_name:str):
lines = report.splitlines()
extracted_data_dict = {
"SEQ" : [],
"PYMT DATE" : [],
"INV NUM" : [],
"CHECK NUMBER" : [],
"PAYMENT AMOUNT" : [],
"NOTE" : [],
"IL SEQ" : [],
"CONTRACT NUM" : [],
"IL PAYMENT AMOUNT" : [],
"CUST NAME" : [],
}
columns = list(extracted_data_dict.keys())
data_extractor = create_line_divider([9,19,39,56,69,89,98,118])
for line in enumerate(lines):
match = False
# Try to find the first SEQ # & a contract payment date e.i. ' 197 05/10/2022'
if re.match("(\s|\d){3}\d{1}\s{5}\d{2}/\d{2}/\d{4}", line[1]):
match = True
# Add all of the data points except customer name
[extracted_data_dict[columns[c]].append(data_extractor(c,line[1],debug=False)) for c in range(0,len(columns)-1)]
# Check to see if this line contains only an infolease payment
# Some times there are multiple infolease payments for a single bank record
elif re.search(contract_number_regex, line[1]) != None:
match = True
# If there is then we can add the same data as the previous complete line
[extracted_data_dict[columns[c]].append(extracted_data_dict[columns[c]][-1]) for c in range(0,6)]
# Then add the new data for the infolease contract
[extracted_data_dict[columns[c]].append(data_extractor(c,line[1],debug=False)) for c in range(6,len(columns)-1)]
# If we had a match we need a customer name to associate with it
# Sometimes these can appear on the next page hense the while loop searching for a match
if match:
# We can tell the cust name will be on the next page if the word "PAGE" appears three lines under the current line
# And the next line is blank
if (lines[line[0]+1].strip() == "") & (lines[line[0]+3].find("PAGE") != -1):
i = 0
# Look for a bunch of whitespace then some writing
while not re.match("\s{98}.{34}", lines[line[0]+i]):
i +=1
# Once we find it add the cust name to the dict (it's the only thing on the line)
extracted_data_dict["CUST NAME"].append(lines[line[0]+i].strip())
# if the condition above isnt met then the cust name is on the next line (even if that line is blank)
else:
extracted_data_dict["CUST NAME"].append(lines[line[0]+1].strip())
dataframe = pd.DataFrame(extracted_data_dict)
dataframe.to_excel(save_name, index=False)
return dataframe
r1 = "/config/workspace/LEAF/IL Extract SRC/lb_errors/2022.05.10_LOCKBOX_094_C"
r2 = "/config/workspace/LEAF/IL Extract SRC/lb_errors/2022.05.11_LOCKBOX_094_C"
with open(r1, errors="replace") as ifile:
report = ifile.read()
lb2(report, "test_lb_0510.xlsx")
with open(r2, errors="replace") as ifile:
report = ifile.read()
lb2(report, "test_lb_0511.xlsx")

Binary file not shown.

@ -1 +0,0 @@
<svg width="16px" height="16px" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg" fill="currentColor"><path fill-rule="evenodd" clip-rule="evenodd" d="M1.5 2h13l.5.5V9h-1V6H2v7h7v1H1.5l-.5-.5v-11l.5-.5zM2 5h12V3H2v2zm5 7v-1.094a1.633 1.633 0 0 1-.469-.265l-.945.539-.5-.86.937-.547a1.57 1.57 0 0 1 0-.547l-.937-.546.5-.86.945.54c.151-.12.308-.209.469-.266V7h1v1.094a1.48 1.48 0 0 1 .469.265l.945-.539.5.86-.937.547a1.57 1.57 0 0 1 0 .546l.937.547-.5.86-.945-.54a1.807 1.807 0 0 1-.469.266V12H7zm-.25-2.5c0 .208.073.385.219.531a.723.723 0 0 0 .531.219.723.723 0 0 0 .531-.219.723.723 0 0 0 .219-.531.723.723 0 0 0-.219-.531.723.723 0 0 0-.531-.219.723.723 0 0 0-.531.219.723.723 0 0 0-.219.531zm5.334 5.5v-1.094a1.634 1.634 0 0 1-.469-.265l-.945.539-.5-.86.938-.547a1.572 1.572 0 0 1 0-.547l-.938-.546.5-.86.945.54c.151-.12.308-.209.47-.266V10h1v1.094a1.486 1.486 0 0 1 .468.265l.945-.539.5.86-.937.547a1.562 1.562 0 0 1 0 .546l.937.547-.5.86-.945-.54a1.806 1.806 0 0 1-.469.266V15h-1zm-.25-2.5c0 .208.073.385.219.531a.723.723 0 0 0 .531.219.723.723 0 0 0 .531-.219.723.723 0 0 0 .22-.531.723.723 0 0 0-.22-.531.723.723 0 0 0-.53-.219.723.723 0 0 0-.532.219.723.723 0 0 0-.219.531z"/></svg>

Before

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.
Loading…
Cancel
Save