fincas 0.4.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2331) hide show
  1. fincas-0.4.1/LICENSE +21 -0
  2. fincas-0.4.1/PKG-INFO +216 -0
  3. fincas-0.4.1/README.md +161 -0
  4. fincas-0.4.1/accounting/__init__.py +0 -0
  5. fincas-0.4.1/accounting/admin.py +167 -0
  6. fincas-0.4.1/accounting/api.py +66 -0
  7. fincas-0.4.1/accounting/apps.py +7 -0
  8. fincas-0.4.1/accounting/erp_urls.py +46 -0
  9. fincas-0.4.1/accounting/erp_views.py +1054 -0
  10. fincas-0.4.1/accounting/forms.py +63 -0
  11. fincas-0.4.1/accounting/management/__init__.py +0 -0
  12. fincas-0.4.1/accounting/management/commands/__init__.py +0 -0
  13. fincas-0.4.1/accounting/management/commands/import_qbo_export.py +197 -0
  14. fincas-0.4.1/accounting/management/commands/posting_rules.py +206 -0
  15. fincas-0.4.1/accounting/migrations/0001_initial.py +442 -0
  16. fincas-0.4.1/accounting/migrations/0002_documentpostingrule_journalentry_posting_key_and_more.py +191 -0
  17. fincas-0.4.1/accounting/migrations/0003_paymentproviderpostingoverride.py +67 -0
  18. fincas-0.4.1/accounting/migrations/__init__.py +0 -0
  19. fincas-0.4.1/accounting/models.py +811 -0
  20. fincas-0.4.1/accounting/periods.py +83 -0
  21. fincas-0.4.1/accounting/posting.py +280 -0
  22. fincas-0.4.1/accounting/qbo/__init__.py +8 -0
  23. fincas-0.4.1/accounting/qbo/importer.py +921 -0
  24. fincas-0.4.1/accounting/qbo/mapping.py +280 -0
  25. fincas-0.4.1/accounting/qbo/readers.py +416 -0
  26. fincas-0.4.1/accounting/serializers.py +17 -0
  27. fincas-0.4.1/accounting/test_m3_upload.py +103 -0
  28. fincas-0.4.1/accounting/tests/__init__.py +0 -0
  29. fincas-0.4.1/accounting/tests/fixtures/qbo_synthetic/AMBIGUITIES.md +61 -0
  30. fincas-0.4.1/accounting/tests/fixtures/qbo_synthetic/MANIFEST.json +111 -0
  31. fincas-0.4.1/accounting/tests/fixtures/qbo_synthetic/coa_account_number_via_account_hash.csv +6 -0
  32. fincas-0.4.1/accounting/tests/fixtures/qbo_synthetic/coa_account_number_via_account_hash.xlsx +0 -0
  33. fincas-0.4.1/accounting/tests/fixtures/qbo_synthetic/coa_account_number_via_account_no.csv +6 -0
  34. fincas-0.4.1/accounting/tests/fixtures/qbo_synthetic/coa_account_number_via_account_no.xlsx +0 -0
  35. fincas-0.4.1/accounting/tests/fixtures/qbo_synthetic/coa_account_number_via_account_number.csv +6 -0
  36. fincas-0.4.1/accounting/tests/fixtures/qbo_synthetic/coa_account_number_via_account_number.xlsx +0 -0
  37. fincas-0.4.1/accounting/tests/fixtures/qbo_synthetic/coa_account_number_via_no.csv +6 -0
  38. fincas-0.4.1/accounting/tests/fixtures/qbo_synthetic/coa_account_number_via_no.xlsx +0 -0
  39. fincas-0.4.1/accounting/tests/fixtures/qbo_synthetic/coa_account_number_via_num.csv +6 -0
  40. fincas-0.4.1/accounting/tests/fixtures/qbo_synthetic/coa_account_number_via_num.xlsx +0 -0
  41. fincas-0.4.1/accounting/tests/fixtures/qbo_synthetic/coa_account_number_via_number.csv +6 -0
  42. fincas-0.4.1/accounting/tests/fixtures/qbo_synthetic/coa_account_number_via_number.xlsx +0 -0
  43. fincas-0.4.1/accounting/tests/fixtures/qbo_synthetic/coa_description_vs_memo.csv +2 -0
  44. fincas-0.4.1/accounting/tests/fixtures/qbo_synthetic/coa_description_vs_memo.xlsx +0 -0
  45. fincas-0.4.1/accounting/tests/fixtures/qbo_synthetic/coa_duplicate_headers.csv +2 -0
  46. fincas-0.4.1/accounting/tests/fixtures/qbo_synthetic/coa_duplicate_headers.xlsx +0 -0
  47. fincas-0.4.1/accounting/tests/fixtures/qbo_synthetic/coa_empty_rows_and_spacers.csv +4 -0
  48. fincas-0.4.1/accounting/tests/fixtures/qbo_synthetic/coa_empty_rows_and_spacers.xlsx +0 -0
  49. fincas-0.4.1/accounting/tests/fixtures/qbo_synthetic/coa_full_with_preamble_and_extras.csv +9 -0
  50. fincas-0.4.1/accounting/tests/fixtures/qbo_synthetic/coa_full_with_preamble_and_extras.xlsx +0 -0
  51. fincas-0.4.1/accounting/tests/fixtures/qbo_synthetic/coa_header_case_variants.csv +2 -0
  52. fincas-0.4.1/accounting/tests/fixtures/qbo_synthetic/coa_header_case_variants.xlsx +0 -0
  53. fincas-0.4.1/accounting/tests/fixtures/qbo_synthetic/coa_header_normalization.csv +2 -0
  54. fincas-0.4.1/accounting/tests/fixtures/qbo_synthetic/coa_header_normalization.xlsx +0 -0
  55. fincas-0.4.1/accounting/tests/fixtures/qbo_synthetic/coa_header_only_one_match.csv +2 -0
  56. fincas-0.4.1/accounting/tests/fixtures/qbo_synthetic/coa_header_only_one_match.xlsx +0 -0
  57. fincas-0.4.1/accounting/tests/fixtures/qbo_synthetic/coa_header_punctuation.csv +2 -0
  58. fincas-0.4.1/accounting/tests/fixtures/qbo_synthetic/coa_header_punctuation.xlsx +0 -0
  59. fincas-0.4.1/accounting/tests/fixtures/qbo_synthetic/coa_minimal_columns.csv +3 -0
  60. fincas-0.4.1/accounting/tests/fixtures/qbo_synthetic/coa_minimal_columns.xlsx +0 -0
  61. fincas-0.4.1/accounting/tests/fixtures/qbo_synthetic/coa_name_and_account_both_present.csv +2 -0
  62. fincas-0.4.1/accounting/tests/fixtures/qbo_synthetic/coa_name_and_account_both_present.xlsx +0 -0
  63. fincas-0.4.1/accounting/tests/fixtures/qbo_synthetic/coa_name_is_account.csv +3 -0
  64. fincas-0.4.1/accounting/tests/fixtures/qbo_synthetic/coa_name_is_account.xlsx +0 -0
  65. fincas-0.4.1/accounting/tests/fixtures/qbo_synthetic/coa_short_rows_padded.csv +2 -0
  66. fincas-0.4.1/accounting/tests/fixtures/qbo_synthetic/coa_short_rows_padded.xlsx +0 -0
  67. fincas-0.4.1/accounting/tests/fixtures/qbo_synthetic/txn_dates_mixed.csv +5 -0
  68. fincas-0.4.1/accounting/tests/fixtures/qbo_synthetic/txn_dates_mixed.xlsx +0 -0
  69. fincas-0.4.1/accounting/tests/fixtures/qbo_synthetic/txn_doc_number_via_doc_number.csv +2 -0
  70. fincas-0.4.1/accounting/tests/fixtures/qbo_synthetic/txn_doc_number_via_doc_number.xlsx +0 -0
  71. fincas-0.4.1/accounting/tests/fixtures/qbo_synthetic/txn_doc_number_via_document_number.csv +2 -0
  72. fincas-0.4.1/accounting/tests/fixtures/qbo_synthetic/txn_doc_number_via_document_number.xlsx +0 -0
  73. fincas-0.4.1/accounting/tests/fixtures/qbo_synthetic/txn_doc_number_via_no.csv +2 -0
  74. fincas-0.4.1/accounting/tests/fixtures/qbo_synthetic/txn_doc_number_via_no.xlsx +0 -0
  75. fincas-0.4.1/accounting/tests/fixtures/qbo_synthetic/txn_doc_number_via_num.csv +2 -0
  76. fincas-0.4.1/accounting/tests/fixtures/qbo_synthetic/txn_doc_number_via_num.xlsx +0 -0
  77. fincas-0.4.1/accounting/tests/fixtures/qbo_synthetic/txn_doc_number_via_number.csv +2 -0
  78. fincas-0.4.1/accounting/tests/fixtures/qbo_synthetic/txn_doc_number_via_number.xlsx +0 -0
  79. fincas-0.4.1/accounting/tests/fixtures/qbo_synthetic/txn_doc_number_via_ref_no.csv +2 -0
  80. fincas-0.4.1/accounting/tests/fixtures/qbo_synthetic/txn_doc_number_via_ref_no.xlsx +0 -0
  81. fincas-0.4.1/accounting/tests/fixtures/qbo_synthetic/txn_doc_number_via_reference_number.csv +2 -0
  82. fincas-0.4.1/accounting/tests/fixtures/qbo_synthetic/txn_doc_number_via_reference_number.xlsx +0 -0
  83. fincas-0.4.1/accounting/tests/fixtures/qbo_synthetic/txn_duplicate_amount.csv +2 -0
  84. fincas-0.4.1/accounting/tests/fixtures/qbo_synthetic/txn_duplicate_amount.xlsx +0 -0
  85. fincas-0.4.1/accounting/tests/fixtures/qbo_synthetic/txn_entity_via_customer.csv +2 -0
  86. fincas-0.4.1/accounting/tests/fixtures/qbo_synthetic/txn_entity_via_customer.xlsx +0 -0
  87. fincas-0.4.1/accounting/tests/fixtures/qbo_synthetic/txn_entity_via_customer_vendor.csv +2 -0
  88. fincas-0.4.1/accounting/tests/fixtures/qbo_synthetic/txn_entity_via_customer_vendor.xlsx +0 -0
  89. fincas-0.4.1/accounting/tests/fixtures/qbo_synthetic/txn_entity_via_entity.csv +2 -0
  90. fincas-0.4.1/accounting/tests/fixtures/qbo_synthetic/txn_entity_via_entity.xlsx +0 -0
  91. fincas-0.4.1/accounting/tests/fixtures/qbo_synthetic/txn_entity_via_payee.csv +2 -0
  92. fincas-0.4.1/accounting/tests/fixtures/qbo_synthetic/txn_entity_via_payee.xlsx +0 -0
  93. fincas-0.4.1/accounting/tests/fixtures/qbo_synthetic/txn_entity_via_vendor.csv +2 -0
  94. fincas-0.4.1/accounting/tests/fixtures/qbo_synthetic/txn_entity_via_vendor.xlsx +0 -0
  95. fincas-0.4.1/accounting/tests/fixtures/qbo_synthetic/txn_full_journal_with_preamble.csv +9 -0
  96. fincas-0.4.1/accounting/tests/fixtures/qbo_synthetic/txn_full_journal_with_preamble.xlsx +0 -0
  97. fincas-0.4.1/accounting/tests/fixtures/qbo_synthetic/txn_header_normalization.csv +2 -0
  98. fincas-0.4.1/accounting/tests/fixtures/qbo_synthetic/txn_header_normalization.xlsx +0 -0
  99. fincas-0.4.1/accounting/tests/fixtures/qbo_synthetic/txn_header_punctuation.csv +2 -0
  100. fincas-0.4.1/accounting/tests/fixtures/qbo_synthetic/txn_header_punctuation.xlsx +0 -0
  101. fincas-0.4.1/accounting/tests/fixtures/qbo_synthetic/txn_memo_description_ambiguous.csv +2 -0
  102. fincas-0.4.1/accounting/tests/fixtures/qbo_synthetic/txn_memo_description_ambiguous.xlsx +0 -0
  103. fincas-0.4.1/accounting/tests/fixtures/qbo_synthetic/txn_minimal_columns.csv +2 -0
  104. fincas-0.4.1/accounting/tests/fixtures/qbo_synthetic/txn_minimal_columns.xlsx +0 -0
  105. fincas-0.4.1/accounting/tests/fixtures/qbo_synthetic/txn_money_variants.csv +5 -0
  106. fincas-0.4.1/accounting/tests/fixtures/qbo_synthetic/txn_money_variants.xlsx +0 -0
  107. fincas-0.4.1/accounting/tests/fixtures/qbo_synthetic/txn_name_and_account.csv +2 -0
  108. fincas-0.4.1/accounting/tests/fixtures/qbo_synthetic/txn_name_and_account.xlsx +0 -0
  109. fincas-0.4.1/accounting/tests/fixtures/qbo_synthetic/txn_name_is_entity.csv +2 -0
  110. fincas-0.4.1/accounting/tests/fixtures/qbo_synthetic/txn_name_is_entity.xlsx +0 -0
  111. fincas-0.4.1/accounting/tests/fixtures/qbo_synthetic/txn_number_header_ambiguous.csv +2 -0
  112. fincas-0.4.1/accounting/tests/fixtures/qbo_synthetic/txn_number_header_ambiguous.xlsx +0 -0
  113. fincas-0.4.1/accounting/tests/fixtures/qbo_synthetic/txn_qbo_id_via_journal_id.csv +2 -0
  114. fincas-0.4.1/accounting/tests/fixtures/qbo_synthetic/txn_qbo_id_via_journal_id.xlsx +0 -0
  115. fincas-0.4.1/accounting/tests/fixtures/qbo_synthetic/txn_qbo_id_via_qbo_txn_id.csv +2 -0
  116. fincas-0.4.1/accounting/tests/fixtures/qbo_synthetic/txn_qbo_id_via_qbo_txn_id.xlsx +0 -0
  117. fincas-0.4.1/accounting/tests/fixtures/qbo_synthetic/txn_qbo_id_via_transaction_id.csv +2 -0
  118. fincas-0.4.1/accounting/tests/fixtures/qbo_synthetic/txn_qbo_id_via_transaction_id.xlsx +0 -0
  119. fincas-0.4.1/accounting/tests/fixtures/qbo_synthetic/txn_qbo_id_via_txn_id.csv +2 -0
  120. fincas-0.4.1/accounting/tests/fixtures/qbo_synthetic/txn_qbo_id_via_txn_id.xlsx +0 -0
  121. fincas-0.4.1/accounting/tests/fixtures/qbo_synthetic/txn_transaction_type_via_transaction_type.csv +2 -0
  122. fincas-0.4.1/accounting/tests/fixtures/qbo_synthetic/txn_transaction_type_via_transaction_type.xlsx +0 -0
  123. fincas-0.4.1/accounting/tests/fixtures/qbo_synthetic/txn_transaction_type_via_txn_type.csv +2 -0
  124. fincas-0.4.1/accounting/tests/fixtures/qbo_synthetic/txn_transaction_type_via_txn_type.xlsx +0 -0
  125. fincas-0.4.1/accounting/tests/fixtures/qbo_synthetic/txn_transaction_type_via_type.csv +2 -0
  126. fincas-0.4.1/accounting/tests/fixtures/qbo_synthetic/txn_transaction_type_via_type.xlsx +0 -0
  127. fincas-0.4.1/accounting/tests/fixtures/qbo_synthetic/txn_type_header_ambiguous.csv +2 -0
  128. fincas-0.4.1/accounting/tests/fixtures/qbo_synthetic/txn_type_header_ambiguous.xlsx +0 -0
  129. fincas-0.4.1/accounting/tests/fixtures/qbo_synthetic/txn_with_extras_and_blanks.csv +4 -0
  130. fincas-0.4.1/accounting/tests/fixtures/qbo_synthetic/txn_with_extras_and_blanks.xlsx +0 -0
  131. fincas-0.4.1/accounting/tests/test_accounting_import_view.py +325 -0
  132. fincas-0.4.1/accounting/tests/test_admin.py +200 -0
  133. fincas-0.4.1/accounting/tests/test_company_scoping.py +95 -0
  134. fincas-0.4.1/accounting/tests/test_double_entry_balance.py +221 -0
  135. fincas-0.4.1/accounting/tests/test_fiscal_period_guard.py +146 -0
  136. fincas-0.4.1/accounting/tests/test_import_command.py +276 -0
  137. fincas-0.4.1/accounting/tests/test_models.py +539 -0
  138. fincas-0.4.1/accounting/tests/test_period_close.py +258 -0
  139. fincas-0.4.1/accounting/tests/test_posting.py +679 -0
  140. fincas-0.4.1/accounting/tests/test_posting_rules_command.py +137 -0
  141. fincas-0.4.1/accounting/tests/test_qbo_aliases_fuzz.py +399 -0
  142. fincas-0.4.1/accounting/tests/test_qbo_import.py +1327 -0
  143. fincas-0.4.1/accounting/tests/test_qbo_mapping.py +116 -0
  144. fincas-0.4.1/accounting/tests/test_qbo_readers.py +353 -0
  145. fincas-0.4.1/accounting/tests/test_reconciliation.py +138 -0
  146. fincas-0.4.1/accounting/tests/test_reporting_views.py +399 -0
  147. fincas-0.4.1/accounting/urls.py +8 -0
  148. fincas-0.4.1/addons/__init__.py +86 -0
  149. fincas-0.4.1/chat/__init__.py +0 -0
  150. fincas-0.4.1/chat/admin.py +40 -0
  151. fincas-0.4.1/chat/apps.py +6 -0
  152. fincas-0.4.1/chat/context_processors.py +41 -0
  153. fincas-0.4.1/chat/llm/__init__.py +67 -0
  154. fincas-0.4.1/chat/llm/anthropic.py +196 -0
  155. fincas-0.4.1/chat/llm/base.py +123 -0
  156. fincas-0.4.1/chat/llm/openai_compat.py +766 -0
  157. fincas-0.4.1/chat/llm/registry.py +398 -0
  158. fincas-0.4.1/chat/llm/tool_schema.py +71 -0
  159. fincas-0.4.1/chat/management/__init__.py +0 -0
  160. fincas-0.4.1/chat/management/commands/__init__.py +0 -0
  161. fincas-0.4.1/chat/management/commands/check_llm_models.py +191 -0
  162. fincas-0.4.1/chat/migrations/0001_initial.py +105 -0
  163. fincas-0.4.1/chat/migrations/__init__.py +0 -0
  164. fincas-0.4.1/chat/models.py +98 -0
  165. fincas-0.4.1/chat/static/chat/chat.css +281 -0
  166. fincas-0.4.1/chat/static/chat/chat.js +638 -0
  167. fincas-0.4.1/chat/templates/chat/drawer.html +127 -0
  168. fincas-0.4.1/chat/test_m3_llm_abuse.py +175 -0
  169. fincas-0.4.1/chat/tests/__init__.py +0 -0
  170. fincas-0.4.1/chat/tests/test_anthropic.py +335 -0
  171. fincas-0.4.1/chat/tests/test_openai_compat.py +734 -0
  172. fincas-0.4.1/chat/tests/test_registry.py +243 -0
  173. fincas-0.4.1/chat/tests/test_stream_view.py +468 -0
  174. fincas-0.4.1/chat/tests/test_tools.py +68 -0
  175. fincas-0.4.1/chat/tests/test_trackc.py +235 -0
  176. fincas-0.4.1/chat/tools.py +49 -0
  177. fincas-0.4.1/chat/urls.py +17 -0
  178. fincas-0.4.1/chat/views.py +656 -0
  179. fincas-0.4.1/communications/__init__.py +0 -0
  180. fincas-0.4.1/communications/admin.py +97 -0
  181. fincas-0.4.1/communications/api.py +160 -0
  182. fincas-0.4.1/communications/apps.py +33 -0
  183. fincas-0.4.1/communications/backfill.py +164 -0
  184. fincas-0.4.1/communications/email_link.py +180 -0
  185. fincas-0.4.1/communications/ingest.py +365 -0
  186. fincas-0.4.1/communications/kinds.py +206 -0
  187. fincas-0.4.1/communications/management/__init__.py +0 -0
  188. fincas-0.4.1/communications/management/commands/__init__.py +0 -0
  189. fincas-0.4.1/communications/management/commands/resolve_participants.py +26 -0
  190. fincas-0.4.1/communications/migrations/0001_initial.py +98 -0
  191. fincas-0.4.1/communications/migrations/0002_communication_schema.py +290 -0
  192. fincas-0.4.1/communications/migrations/0003_backfill_email_communications.py +31 -0
  193. fincas-0.4.1/communications/migrations/0004_us_english_choice_labels.py +28 -0
  194. fincas-0.4.1/communications/migrations/__init__.py +0 -0
  195. fincas-0.4.1/communications/models.py +271 -0
  196. fincas-0.4.1/communications/participants.py +217 -0
  197. fincas-0.4.1/communications/serializers.py +84 -0
  198. fincas-0.4.1/communications/services.py +493 -0
  199. fincas-0.4.1/communications/templates/communications/emails/invoice_email.html +37 -0
  200. fincas-0.4.1/communications/templates/communications/emails/order_confirmation.html +188 -0
  201. fincas-0.4.1/communications/templates/communications/emails/order_confirmation.txt +31 -0
  202. fincas-0.4.1/communications/templates/communications/emails/quote_email.html +44 -0
  203. fincas-0.4.1/communications/templates/communications/emails/shipping_notification.html +192 -0
  204. fincas-0.4.1/communications/templates/communications/emails/shipping_notification.txt +29 -0
  205. fincas-0.4.1/communications/tests/__init__.py +0 -0
  206. fincas-0.4.1/communications/tests/helpers.py +48 -0
  207. fincas-0.4.1/communications/tests/test_communication_models.py +168 -0
  208. fincas-0.4.1/communications/tests/test_email_backfill.py +216 -0
  209. fincas-0.4.1/communications/tests/test_email_link.py +178 -0
  210. fincas-0.4.1/communications/tests/test_email_sends.py +516 -0
  211. fincas-0.4.1/communications/tests/test_ingest.py +331 -0
  212. fincas-0.4.1/communications/tests/test_ingest_activity.py +142 -0
  213. fincas-0.4.1/communications/tests/test_kinds.py +147 -0
  214. fincas-0.4.1/communications/tests/test_merge.py +49 -0
  215. fincas-0.4.1/communications/urls.py +8 -0
  216. fincas-0.4.1/content/__init__.py +0 -0
  217. fincas-0.4.1/content/admin.py +12 -0
  218. fincas-0.4.1/content/apps.py +5 -0
  219. fincas-0.4.1/content/erp_urls.py +17 -0
  220. fincas-0.4.1/content/erp_views.py +100 -0
  221. fincas-0.4.1/content/forms.py +42 -0
  222. fincas-0.4.1/content/migrations/0001_initial.py +69 -0
  223. fincas-0.4.1/content/migrations/__init__.py +0 -0
  224. fincas-0.4.1/content/models.py +45 -0
  225. fincas-0.4.1/content/serializers.py +16 -0
  226. fincas-0.4.1/content/test_m3_xss.py +74 -0
  227. fincas-0.4.1/content/tests.py +82 -0
  228. fincas-0.4.1/content/urls.py +8 -0
  229. fincas-0.4.1/content/views.py +21 -0
  230. fincas-0.4.1/core/__init__.py +0 -0
  231. fincas-0.4.1/core/access_matrix.py +300 -0
  232. fincas-0.4.1/core/admin.py +250 -0
  233. fincas-0.4.1/core/api_exceptions.py +41 -0
  234. fincas-0.4.1/core/apps.py +62 -0
  235. fincas-0.4.1/core/auth_views.py +198 -0
  236. fincas-0.4.1/core/authentication.py +416 -0
  237. fincas-0.4.1/core/cache_guard.py +276 -0
  238. fincas-0.4.1/core/checks.py +283 -0
  239. fincas-0.4.1/core/client_ip.py +67 -0
  240. fincas-0.4.1/core/context_processors.py +97 -0
  241. fincas-0.4.1/core/csv_safety.py +46 -0
  242. fincas-0.4.1/core/demo_clock.py +376 -0
  243. fincas-0.4.1/core/erp_urls.py +127 -0
  244. fincas-0.4.1/core/error_views.py +73 -0
  245. fincas-0.4.1/core/field_registry.py +289 -0
  246. fincas-0.4.1/core/forms.py +76 -0
  247. fincas-0.4.1/core/hook_registry.py +121 -0
  248. fincas-0.4.1/core/html_safety.py +30 -0
  249. fincas-0.4.1/core/http.py +18 -0
  250. fincas-0.4.1/core/identity/__init__.py +26 -0
  251. fincas-0.4.1/core/identity/backfill.py +270 -0
  252. fincas-0.4.1/core/identity/base.py +165 -0
  253. fincas-0.4.1/core/identity/models.py +60 -0
  254. fincas-0.4.1/core/identity/oidc.py +748 -0
  255. fincas-0.4.1/core/identity/providers.py +465 -0
  256. fincas-0.4.1/core/identity/resolve.py +731 -0
  257. fincas-0.4.1/core/identity/retire.py +209 -0
  258. fincas-0.4.1/core/integration_checks.py +199 -0
  259. fincas-0.4.1/core/integration_registry.py +372 -0
  260. fincas-0.4.1/core/integrations/__init__.py +12 -0
  261. fincas-0.4.1/core/integrations/accounts.py +175 -0
  262. fincas-0.4.1/core/integrations/checks.py +51 -0
  263. fincas-0.4.1/core/integrations/erasure.py +472 -0
  264. fincas-0.4.1/core/integrations/models.py +179 -0
  265. fincas-0.4.1/core/integrations/poll.py +162 -0
  266. fincas-0.4.1/core/integrations/ratelimit.py +163 -0
  267. fincas-0.4.1/core/integrations/transport.py +153 -0
  268. fincas-0.4.1/core/integrations/views.py +301 -0
  269. fincas-0.4.1/core/integrations/webhook.py +121 -0
  270. fincas-0.4.1/core/integrity.py +686 -0
  271. fincas-0.4.1/core/label_registry.py +335 -0
  272. fincas-0.4.1/core/labels.py +145 -0
  273. fincas-0.4.1/core/list_columns.py +368 -0
  274. fincas-0.4.1/core/list_export.py +166 -0
  275. fincas-0.4.1/core/list_prefs.py +67 -0
  276. fincas-0.4.1/core/lookups.py +27 -0
  277. fincas-0.4.1/core/management/__init__.py +0 -0
  278. fincas-0.4.1/core/management/commands/__init__.py +0 -0
  279. fincas-0.4.1/core/management/commands/backfill_tenancy.py +211 -0
  280. fincas-0.4.1/core/management/commands/check_external_refs.py +63 -0
  281. fincas-0.4.1/core/management/commands/check_money.py +118 -0
  282. fincas-0.4.1/core/management/commands/check_numbering.py +84 -0
  283. fincas-0.4.1/core/management/commands/check_outbox.py +50 -0
  284. fincas-0.4.1/core/management/commands/check_schema_parity.py +168 -0
  285. fincas-0.4.1/core/management/commands/check_sidecar.py +156 -0
  286. fincas-0.4.1/core/management/commands/check_tenancy.py +107 -0
  287. fincas-0.4.1/core/management/commands/create_api_key.py +118 -0
  288. fincas-0.4.1/core/management/commands/demo_roll_dates.py +87 -0
  289. fincas-0.4.1/core/management/commands/ensure_legacy_api_user.py +24 -0
  290. fincas-0.4.1/core/management/commands/ensure_storefront_identity.py +41 -0
  291. fincas-0.4.1/core/management/commands/generate_secrets.py +51 -0
  292. fincas-0.4.1/core/management/commands/integration_connect.py +63 -0
  293. fincas-0.4.1/core/management/commands/integrations_poll.py +30 -0
  294. fincas-0.4.1/core/management/commands/integrations_sync.py +60 -0
  295. fincas-0.4.1/core/management/commands/outbox.py +65 -0
  296. fincas-0.4.1/core/management/commands/process_outbox.py +67 -0
  297. fincas-0.4.1/core/management/commands/release_notes.py +59 -0
  298. fincas-0.4.1/core/management/commands/requeue_outbox.py +24 -0
  299. fincas-0.4.1/core/management/commands/revoke_api_key.py +44 -0
  300. fincas-0.4.1/core/management/commands/rotate_secrets.py +69 -0
  301. fincas-0.4.1/core/management/commands/seed_demo_data.py +421 -0
  302. fincas-0.4.1/core/management/commands/seed_release_test.py +365 -0
  303. fincas-0.4.1/core/management/commands/seed_test_edge.py +119 -0
  304. fincas-0.4.1/core/management/commands/seed_test_minimal.py +137 -0
  305. fincas-0.4.1/core/management/commands/setup_demo_user.py +51 -0
  306. fincas-0.4.1/core/management/commands/smoke_cutover.py +257 -0
  307. fincas-0.4.1/core/management/commands/sync_roles.py +99 -0
  308. fincas-0.4.1/core/management/release_exit_codes.py +51 -0
  309. fincas-0.4.1/core/managers.py +52 -0
  310. fincas-0.4.1/core/middleware.py +218 -0
  311. fincas-0.4.1/core/migration_ops.py +82 -0
  312. fincas-0.4.1/core/migrations/0001_initial.py +168 -0
  313. fincas-0.4.1/core/migrations/0002_storefront_identity.py +33 -0
  314. fincas-0.4.1/core/migrations/0003_userprofile_user.py +27 -0
  315. fincas-0.4.1/core/migrations/0004_integrationcheck.py +62 -0
  316. fincas-0.4.1/core/migrations/0005_externalref.py +69 -0
  317. fincas-0.4.1/core/migrations/0006_identity_schema.py +82 -0
  318. fincas-0.4.1/core/migrations/0007_timezones.py +34 -0
  319. fincas-0.4.1/core/migrations/0008_apikey.py +61 -0
  320. fincas-0.4.1/core/migrations/0009_api_service_account.py +50 -0
  321. fincas-0.4.1/core/migrations/0010_userprofile_legacy_external_id.py +25 -0
  322. fincas-0.4.1/core/migrations/0011_remove_userprofile_supabase_uid.py +24 -0
  323. fincas-0.4.1/core/migrations/0012_team.py +64 -0
  324. fincas-0.4.1/core/migrations/0012_useridentity_user_provider_uniq.py +63 -0
  325. fincas-0.4.1/core/migrations/0013_merge_team_useridentity_uniq.py +19 -0
  326. fincas-0.4.1/core/migrations/0014_list_preferences_savedfilter.py +84 -0
  327. fincas-0.4.1/core/migrations/0015_outboxevent.py +136 -0
  328. fincas-0.4.1/core/migrations/0016_integration_accounts.py +190 -0
  329. fincas-0.4.1/core/migrations/0017_erpusersettings_hidden_quick_actions.py +18 -0
  330. fincas-0.4.1/core/migrations/0018_us_english_choice_labels.py +28 -0
  331. fincas-0.4.1/core/migrations/0019_labeloverride.py +52 -0
  332. fincas-0.4.1/core/migrations/__init__.py +0 -0
  333. fincas-0.4.1/core/models.py +542 -0
  334. fincas-0.4.1/core/nav_registry.py +119 -0
  335. fincas-0.4.1/core/oidc_views.py +158 -0
  336. fincas-0.4.1/core/once.py +70 -0
  337. fincas-0.4.1/core/outbox/__init__.py +709 -0
  338. fincas-0.4.1/core/outbox/testing.py +26 -0
  339. fincas-0.4.1/core/permissions.py +73 -0
  340. fincas-0.4.1/core/plugin_apps.py +180 -0
  341. fincas-0.4.1/core/plugins/__init__.py +44 -0
  342. fincas-0.4.1/core/plugins/base.py +263 -0
  343. fincas-0.4.1/core/plugins/crm_adapter.py +946 -0
  344. fincas-0.4.1/core/plugins/crm_export.py +116 -0
  345. fincas-0.4.1/core/plugins/dispatch.py +136 -0
  346. fincas-0.4.1/core/plugins/payroll.py +182 -0
  347. fincas-0.4.1/core/plugins/registry.py +590 -0
  348. fincas-0.4.1/core/plugins/signals.py +199 -0
  349. fincas-0.4.1/core/plugins/url_auth.py +100 -0
  350. fincas-0.4.1/core/portal_auth.py +57 -0
  351. fincas-0.4.1/core/portal_permissions.py +31 -0
  352. fincas-0.4.1/core/portal_urls.py +16 -0
  353. fincas-0.4.1/core/portal_views.py +270 -0
  354. fincas-0.4.1/core/provenance.py +133 -0
  355. fincas-0.4.1/core/quick_actions.py +57 -0
  356. fincas-0.4.1/core/release_notes.py +556 -0
  357. fincas-0.4.1/core/release_test.py +209 -0
  358. fincas-0.4.1/core/role_registry.py +178 -0
  359. fincas-0.4.1/core/roles.py +399 -0
  360. fincas-0.4.1/core/saved_filters.py +202 -0
  361. fincas-0.4.1/core/schema.py +51 -0
  362. fincas-0.4.1/core/schema_parity.py +612 -0
  363. fincas-0.4.1/core/secrets.py +169 -0
  364. fincas-0.4.1/core/serializers.py +149 -0
  365. fincas-0.4.1/core/service_accounts.py +577 -0
  366. fincas-0.4.1/core/sidecar.py +804 -0
  367. fincas-0.4.1/core/sidecar_api.py +193 -0
  368. fincas-0.4.1/core/sidecar_forms.py +243 -0
  369. fincas-0.4.1/core/signals.py +36 -0
  370. fincas-0.4.1/core/sso_views.py +75 -0
  371. fincas-0.4.1/core/staff.py +175 -0
  372. fincas-0.4.1/core/storefront.py +170 -0
  373. fincas-0.4.1/core/teams.py +133 -0
  374. fincas-0.4.1/core/templatetags/__init__.py +0 -0
  375. fincas-0.4.1/core/templatetags/erp_tags.py +190 -0
  376. fincas-0.4.1/core/templatetags/labels.py +105 -0
  377. fincas-0.4.1/core/testing/__init__.py +1 -0
  378. fincas-0.4.1/core/testing/integration_fixtures.py +494 -0
  379. fincas-0.4.1/core/testing/no_network.py +312 -0
  380. fincas-0.4.1/core/tests/__init__.py +0 -0
  381. fincas-0.4.1/core/tests/access_matrix_expectations.py +439 -0
  382. fincas-0.4.1/core/tests/helpers.py +83 -0
  383. fincas-0.4.1/core/tests/legacy_schema.py +104 -0
  384. fincas-0.4.1/core/tests/plugin_fixtures/__init__.py +1 -0
  385. fincas-0.4.1/core/tests/plugin_fixtures/glue.py +45 -0
  386. fincas-0.4.1/core/tests/plugin_fixtures/unimported_glue.py +19 -0
  387. fincas-0.4.1/core/tests/test_access_matrix.py +805 -0
  388. fincas-0.4.1/core/tests/test_addons_alias.py +158 -0
  389. fincas-0.4.1/core/tests/test_alert_markup.py +30 -0
  390. fincas-0.4.1/core/tests/test_api_error_envelope.py +94 -0
  391. fincas-0.4.1/core/tests/test_api_protected_delete.py +66 -0
  392. fincas-0.4.1/core/tests/test_auth_matrix.py +576 -0
  393. fincas-0.4.1/core/tests/test_authentication.py +862 -0
  394. fincas-0.4.1/core/tests/test_backfill_tenancy.py +180 -0
  395. fincas-0.4.1/core/tests/test_cache_down.py +408 -0
  396. fincas-0.4.1/core/tests/test_cancel_button_wiring.py +109 -0
  397. fincas-0.4.1/core/tests/test_check_money.py +392 -0
  398. fincas-0.4.1/core/tests/test_check_numbering.py +202 -0
  399. fincas-0.4.1/core/tests/test_check_sidecar.py +110 -0
  400. fincas-0.4.1/core/tests/test_coupon_throttle_keys.py +112 -0
  401. fincas-0.4.1/core/tests/test_csv_safety.py +129 -0
  402. fincas-0.4.1/core/tests/test_dashboard_aggregates.py +251 -0
  403. fincas-0.4.1/core/tests/test_demo_clock.py +363 -0
  404. fincas-0.4.1/core/tests/test_demo_guard.py +173 -0
  405. fincas-0.4.1/core/tests/test_deploy_secrets.py +86 -0
  406. fincas-0.4.1/core/tests/test_document_sequence.py +39 -0
  407. fincas-0.4.1/core/tests/test_erp_staff_only.py +78 -0
  408. fincas-0.4.1/core/tests/test_erp_tags.py +31 -0
  409. fincas-0.4.1/core/tests/test_error_pages.py +124 -0
  410. fincas-0.4.1/core/tests/test_external_refs.py +110 -0
  411. fincas-0.4.1/core/tests/test_field_registry.py +189 -0
  412. fincas-0.4.1/core/tests/test_findings_check.py +200 -0
  413. fincas-0.4.1/core/tests/test_forge_absent.py +111 -0
  414. fincas-0.4.1/core/tests/test_harness_settings.py +272 -0
  415. fincas-0.4.1/core/tests/test_hook_registry.py +146 -0
  416. fincas-0.4.1/core/tests/test_identity_backfill.py +514 -0
  417. fincas-0.4.1/core/tests/test_identity_providers.py +486 -0
  418. fincas-0.4.1/core/tests/test_identity_retire.py +222 -0
  419. fincas-0.4.1/core/tests/test_integration_adapter.py +330 -0
  420. fincas-0.4.1/core/tests/test_integration_no_leak.py +125 -0
  421. fincas-0.4.1/core/tests/test_integration_poll.py +223 -0
  422. fincas-0.4.1/core/tests/test_integration_registry.py +330 -0
  423. fincas-0.4.1/core/tests/test_integration_secrets.py +268 -0
  424. fincas-0.4.1/core/tests/test_integration_views.py +350 -0
  425. fincas-0.4.1/core/tests/test_integration_webhook.py +160 -0
  426. fincas-0.4.1/core/tests/test_label_overrides_screen.py +112 -0
  427. fincas-0.4.1/core/tests/test_labels.py +343 -0
  428. fincas-0.4.1/core/tests/test_labels_never_leak.py +216 -0
  429. fincas-0.4.1/core/tests/test_list_a11y.py +231 -0
  430. fincas-0.4.1/core/tests/test_list_cell_display.py +65 -0
  431. fincas-0.4.1/core/tests/test_list_export_query.py +93 -0
  432. fincas-0.4.1/core/tests/test_list_infra.py +614 -0
  433. fincas-0.4.1/core/tests/test_list_sort_headers.py +86 -0
  434. fincas-0.4.1/core/tests/test_list_sorting.py +105 -0
  435. fincas-0.4.1/core/tests/test_m2d_auth_ux.py +241 -0
  436. fincas-0.4.1/core/tests/test_m2d_form_roundtrips.py +176 -0
  437. fincas-0.4.1/core/tests/test_m2d_render_sweep.py +230 -0
  438. fincas-0.4.1/core/tests/test_m3_csrf.py +62 -0
  439. fincas-0.4.1/core/tests/test_m3_ratelimit.py +108 -0
  440. fincas-0.4.1/core/tests/test_m3_secrets_headers.py +214 -0
  441. fincas-0.4.1/core/tests/test_m3_sqli.py +108 -0
  442. fincas-0.4.1/core/tests/test_nav_registry.py +96 -0
  443. fincas-0.4.1/core/tests/test_no_network.py +226 -0
  444. fincas-0.4.1/core/tests/test_oidc.py +837 -0
  445. fincas-0.4.1/core/tests/test_one_company.py +136 -0
  446. fincas-0.4.1/core/tests/test_openapi_schema.py +32 -0
  447. fincas-0.4.1/core/tests/test_outbox.py +583 -0
  448. fincas-0.4.1/core/tests/test_payroll_slot.py +139 -0
  449. fincas-0.4.1/core/tests/test_plugin_boot.py +188 -0
  450. fincas-0.4.1/core/tests/test_plugin_signal_emission.py +359 -0
  451. fincas-0.4.1/core/tests/test_plugins.py +113 -0
  452. fincas-0.4.1/core/tests/test_portal_auth.py +735 -0
  453. fincas-0.4.1/core/tests/test_portal_invite_resend.py +242 -0
  454. fincas-0.4.1/core/tests/test_portal_party.py +446 -0
  455. fincas-0.4.1/core/tests/test_prod_compose.py +144 -0
  456. fincas-0.4.1/core/tests/test_prod_settings_db.py +26 -0
  457. fincas-0.4.1/core/tests/test_query_counts.py +62 -0
  458. fincas-0.4.1/core/tests/test_release_notes.py +341 -0
  459. fincas-0.4.1/core/tests/test_role_registry.py +646 -0
  460. fincas-0.4.1/core/tests/test_schema_parity.py +538 -0
  461. fincas-0.4.1/core/tests/test_security_auth_flows.py +250 -0
  462. fincas-0.4.1/core/tests/test_security_input.py +477 -0
  463. fincas-0.4.1/core/tests/test_security_pii.py +140 -0
  464. fincas-0.4.1/core/tests/test_security_settings.py +122 -0
  465. fincas-0.4.1/core/tests/test_seed_release_test.py +120 -0
  466. fincas-0.4.1/core/tests/test_sentry_before_send.py +271 -0
  467. fincas-0.4.1/core/tests/test_session_company_resolution.py +62 -0
  468. fincas-0.4.1/core/tests/test_sidecar.py +416 -0
  469. fincas-0.4.1/core/tests/test_sidecar_api.py +237 -0
  470. fincas-0.4.1/core/tests/test_sidecar_registry.py +127 -0
  471. fincas-0.4.1/core/tests/test_sidecar_vendors.py +256 -0
  472. fincas-0.4.1/core/tests/test_smoke_cutover.py +147 -0
  473. fincas-0.4.1/core/tests/test_sso_views.py +116 -0
  474. fincas-0.4.1/core/tests/test_storefront_identity.py +483 -0
  475. fincas-0.4.1/core/tests/test_teams_and_staff.py +281 -0
  476. fincas-0.4.1/core/tests/test_template_comment_hygiene.py +70 -0
  477. fincas-0.4.1/core/tests/test_tenancy_remainder.py +229 -0
  478. fincas-0.4.1/core/tests/test_tenant_settings_fail_closed.py +95 -0
  479. fincas-0.4.1/core/tests/test_theme_registry.py +83 -0
  480. fincas-0.4.1/core/tests/test_token_scopes.py +354 -0
  481. fincas-0.4.1/core/tests/test_trackc_plugins.py +96 -0
  482. fincas-0.4.1/core/tests/test_tripwire.py +119 -0
  483. fincas-0.4.1/core/tests/test_tz.py +150 -0
  484. fincas-0.4.1/core/tests/test_us_english_values.py +20 -0
  485. fincas-0.4.1/core/tests/test_user_create_view.py +55 -0
  486. fincas-0.4.1/core/tests/test_user_roles_screen.py +104 -0
  487. fincas-0.4.1/core/theme_registry.py +131 -0
  488. fincas-0.4.1/core/throttling.py +254 -0
  489. fincas-0.4.1/core/tripwire_patterns.py +49 -0
  490. fincas-0.4.1/core/tz.py +90 -0
  491. fincas-0.4.1/core/urls.py +20 -0
  492. fincas-0.4.1/core/user_roles.py +78 -0
  493. fincas-0.4.1/core/views/__init__.py +293 -0
  494. fincas-0.4.1/core/views/account.py +218 -0
  495. fincas-0.4.1/core/views/dashboard.py +117 -0
  496. fincas-0.4.1/core/views/form_view.py +54 -0
  497. fincas-0.4.1/core/views/integrations.py +132 -0
  498. fincas-0.4.1/core/views/labels.py +122 -0
  499. fincas-0.4.1/core/views/list_view.py +576 -0
  500. fincas-0.4.1/core/views/mixins.py +47 -0
  501. fincas-0.4.1/core/views/teams.py +155 -0
  502. fincas-0.4.1/crm/__init__.py +0 -0
  503. fincas-0.4.1/crm/activity_compat.py +358 -0
  504. fincas-0.4.1/crm/admin.py +189 -0
  505. fincas-0.4.1/crm/api.py +797 -0
  506. fincas-0.4.1/crm/api_serializers.py +573 -0
  507. fincas-0.4.1/crm/apps.py +19 -0
  508. fincas-0.4.1/crm/assist.py +305 -0
  509. fincas-0.4.1/crm/backfill.py +1430 -0
  510. fincas-0.4.1/crm/conf.py +49 -0
  511. fincas-0.4.1/crm/due.py +84 -0
  512. fincas-0.4.1/crm/engagements.py +716 -0
  513. fincas-0.4.1/crm/erp_timeline.py +232 -0
  514. fincas-0.4.1/crm/erp_urls.py +49 -0
  515. fincas-0.4.1/crm/erp_views.py +1665 -0
  516. fincas-0.4.1/crm/fields/__init__.py +6 -0
  517. fincas-0.4.1/crm/fields/counts.py +166 -0
  518. fincas-0.4.1/crm/fields/inventory.py +305 -0
  519. fincas-0.4.1/crm/forms.py +611 -0
  520. fincas-0.4.1/crm/intake.py +286 -0
  521. fincas-0.4.1/crm/lifecycle.py +121 -0
  522. fincas-0.4.1/crm/management/__init__.py +0 -0
  523. fincas-0.4.1/crm/management/commands/__init__.py +0 -0
  524. fincas-0.4.1/crm/management/commands/ads_conversions.py +71 -0
  525. fincas-0.4.1/crm/management/commands/backfill_crm.py +90 -0
  526. fincas-0.4.1/crm/management/commands/check_engagements.py +93 -0
  527. fincas-0.4.1/crm/management/commands/check_field_inventory.py +60 -0
  528. fincas-0.4.1/crm/management/commands/crm_emit_due.py +25 -0
  529. fincas-0.4.1/crm/management/commands/field_inventory.py +88 -0
  530. fincas-0.4.1/crm/management/commands/reconcile_engagements.py +263 -0
  531. fincas-0.4.1/crm/management/commands/seed_crm.py +360 -0
  532. fincas-0.4.1/crm/management/commands/seed_my_day.py +277 -0
  533. fincas-0.4.1/crm/migrations/0001_initial.py +156 -0
  534. fincas-0.4.1/crm/migrations/0002_initial.py +81 -0
  535. fincas-0.4.1/crm/migrations/0003_initial.py +38 -0
  536. fincas-0.4.1/crm/migrations/0004_activitylog_company.py +25 -0
  537. fincas-0.4.1/crm/migrations/0005_backfill_activitylog_company.py +33 -0
  538. fincas-0.4.1/crm/migrations/0006_party_links.py +27 -0
  539. fincas-0.4.1/crm/migrations/0007_engagement_schema.py +923 -0
  540. fincas-0.4.1/crm/migrations/0008_seed_default_pipelines.py +29 -0
  541. fincas-0.4.1/crm/migrations/0009_task_communication.py +26 -0
  542. fincas-0.4.1/crm/migrations/0010_backfill_quote_engagements.py +40 -0
  543. fincas-0.4.1/crm/migrations/0011_lead_engagement.py +26 -0
  544. fincas-0.4.1/crm/migrations/0012_backfill_lead_engagements.py +31 -0
  545. fincas-0.4.1/crm/migrations/0013_backfill_activity_communications.py +30 -0
  546. fincas-0.4.1/crm/migrations/0014_tighten.py +35 -0
  547. fincas-0.4.1/crm/migrations/0015_engagement_owner_team.py +34 -0
  548. fincas-0.4.1/crm/migrations/0016_stamp_owner_team.py +27 -0
  549. fincas-0.4.1/crm/migrations/0017_engagement_metadata_gin.py +21 -0
  550. fincas-0.4.1/crm/migrations/0018_lead_source_ai_chat.py +32 -0
  551. fincas-0.4.1/crm/migrations/0019_closed_signed_stage.py +31 -0
  552. fincas-0.4.1/crm/migrations/0020_us_english_choice_labels.py +44 -0
  553. fincas-0.4.1/crm/migrations/__init__.py +0 -0
  554. fincas-0.4.1/crm/models.py +1075 -0
  555. fincas-0.4.1/crm/pipelines.py +126 -0
  556. fincas-0.4.1/crm/registries.py +335 -0
  557. fincas-0.4.1/crm/serializers.py +123 -0
  558. fincas-0.4.1/crm/tasks.py +326 -0
  559. fincas-0.4.1/crm/templatetags/__init__.py +0 -0
  560. fincas-0.4.1/crm/templatetags/crm_tags.py +19 -0
  561. fincas-0.4.1/crm/tests/__init__.py +0 -0
  562. fincas-0.4.1/crm/tests/helpers.py +81 -0
  563. fincas-0.4.1/crm/tests/test_api.py +601 -0
  564. fincas-0.4.1/crm/tests/test_assist_api.py +141 -0
  565. fincas-0.4.1/crm/tests/test_create_screens.py +187 -0
  566. fincas-0.4.1/crm/tests/test_engagement_models.py +353 -0
  567. fincas-0.4.1/crm/tests/test_engagement_services.py +241 -0
  568. fincas-0.4.1/crm/tests/test_erp_views.py +1035 -0
  569. fincas-0.4.1/crm/tests/test_field_inventory.py +402 -0
  570. fincas-0.4.1/crm/tests/test_lead_intake.py +360 -0
  571. fincas-0.4.1/crm/tests/test_lead_numbers.py +77 -0
  572. fincas-0.4.1/crm/tests/test_leads.py +313 -0
  573. fincas-0.4.1/crm/tests/test_owner_team.py +392 -0
  574. fincas-0.4.1/crm/tests/test_owner_team_migration.py +84 -0
  575. fincas-0.4.1/crm/tests/test_p4_screens.py +541 -0
  576. fincas-0.4.1/crm/tests/test_party_picker.py +120 -0
  577. fincas-0.4.1/crm/tests/test_quote_engagements.py +595 -0
  578. fincas-0.4.1/crm/tests/test_quote_from_engagement.py +163 -0
  579. fincas-0.4.1/crm/tests/test_reconstructed_history.py +126 -0
  580. fincas-0.4.1/crm/tests/test_registries.py +147 -0
  581. fincas-0.4.1/crm/tests/test_reopen_forbidden.py +69 -0
  582. fincas-0.4.1/crm/tests/test_seeding_and_checks.py +269 -0
  583. fincas-0.4.1/crm/tests/test_signals.py +464 -0
  584. fincas-0.4.1/crm/tests/test_step6_backfill.py +630 -0
  585. fincas-0.4.1/crm/tests/test_task_updated.py +176 -0
  586. fincas-0.4.1/crm/tests/test_tasks.py +293 -0
  587. fincas-0.4.1/crm/tests/test_touchpoints.py +241 -0
  588. fincas-0.4.1/crm/timeline.py +250 -0
  589. fincas-0.4.1/crm/touchpoints.py +371 -0
  590. fincas-0.4.1/crm/urls.py +33 -0
  591. fincas-0.4.1/crm/views.py +137 -0
  592. fincas-0.4.1/crm_import/__init__.py +6 -0
  593. fincas-0.4.1/crm_import/ai.py +757 -0
  594. fincas-0.4.1/crm_import/appliers/__init__.py +84 -0
  595. fincas-0.4.1/crm_import/appliers/activity.py +113 -0
  596. fincas-0.4.1/crm_import/appliers/associations.py +192 -0
  597. fincas-0.4.1/crm_import/appliers/base.py +363 -0
  598. fincas-0.4.1/crm_import/appliers/communications.py +262 -0
  599. fincas-0.4.1/crm_import/appliers/consent.py +266 -0
  600. fincas-0.4.1/crm_import/appliers/deals.py +870 -0
  601. fincas-0.4.1/crm_import/appliers/owners.py +85 -0
  602. fincas-0.4.1/crm_import/appliers/parties.py +389 -0
  603. fincas-0.4.1/crm_import/appliers/pipelines.py +116 -0
  604. fincas-0.4.1/crm_import/appliers/relationships.py +237 -0
  605. fincas-0.4.1/crm_import/appliers/tasks.py +252 -0
  606. fincas-0.4.1/crm_import/apps.py +12 -0
  607. fincas-0.4.1/crm_import/canonical/__init__.py +52 -0
  608. fincas-0.4.1/crm_import/canonical/io.py +206 -0
  609. fincas-0.4.1/crm_import/canonical/schema.py +388 -0
  610. fincas-0.4.1/crm_import/canonical/validate.py +671 -0
  611. fincas-0.4.1/crm_import/compare.py +294 -0
  612. fincas-0.4.1/crm_import/erp_urls.py +28 -0
  613. fincas-0.4.1/crm_import/erp_views.py +71 -0
  614. fincas-0.4.1/crm_import/locks.py +111 -0
  615. fincas-0.4.1/crm_import/management/__init__.py +0 -0
  616. fincas-0.4.1/crm_import/management/commands/__init__.py +0 -0
  617. fincas-0.4.1/crm_import/management/commands/check_canonical_export.py +63 -0
  618. fincas-0.4.1/crm_import/management/commands/crm_export_adapt.py +100 -0
  619. fincas-0.4.1/crm_import/management/commands/crm_import.py +320 -0
  620. fincas-0.4.1/crm_import/match.py +933 -0
  621. fincas-0.4.1/crm_import/migrations/0001_initial.py +416 -0
  622. fincas-0.4.1/crm_import/migrations/0002_us_english_choice_labels.py +33 -0
  623. fincas-0.4.1/crm_import/migrations/__init__.py +0 -0
  624. fincas-0.4.1/crm_import/models.py +334 -0
  625. fincas-0.4.1/crm_import/report.py +297 -0
  626. fincas-0.4.1/crm_import/review.py +1162 -0
  627. fincas-0.4.1/crm_import/runner.py +526 -0
  628. fincas-0.4.1/crm_import/sidecar.py +110 -0
  629. fincas-0.4.1/crm_import/stage.py +641 -0
  630. fincas-0.4.1/crm_import/tests/__init__.py +0 -0
  631. fincas-0.4.1/crm_import/tests/canonical_cases.py +102 -0
  632. fincas-0.4.1/crm_import/tests/fixtures/ai/recorded.json +26 -0
  633. fincas-0.4.1/crm_import/tests/fixtures/canonical/invalid/adapter-version-mismatch/case.json +13 -0
  634. fincas-0.4.1/crm_import/tests/fixtures/canonical/invalid/adapter-version-mismatch/validation.expected.json +12 -0
  635. fincas-0.4.1/crm_import/tests/fixtures/canonical/invalid/archived-not-enumerated/case.json +14 -0
  636. fincas-0.4.1/crm_import/tests/fixtures/canonical/invalid/archived-not-enumerated/validation.expected.json +12 -0
  637. fincas-0.4.1/crm_import/tests/fixtures/canonical/invalid/consent-shape/case.json +3 -0
  638. fincas-0.4.1/crm_import/tests/fixtures/canonical/invalid/consent-shape/consent.jsonl +3 -0
  639. fincas-0.4.1/crm_import/tests/fixtures/canonical/invalid/consent-shape/validation.expected.json +18 -0
  640. fincas-0.4.1/crm_import/tests/fixtures/canonical/invalid/coverage-inconsistent/case.json +28 -0
  641. fincas-0.4.1/crm_import/tests/fixtures/canonical/invalid/coverage-inconsistent/validation.expected.json +18 -0
  642. fincas-0.4.1/crm_import/tests/fixtures/canonical/invalid/coverage-reason-missing/case.json +14 -0
  643. fincas-0.4.1/crm_import/tests/fixtures/canonical/invalid/coverage-reason-missing/validation.expected.json +12 -0
  644. fincas-0.4.1/crm_import/tests/fixtures/canonical/invalid/dangling-association/associations.jsonl +4 -0
  645. fincas-0.4.1/crm_import/tests/fixtures/canonical/invalid/dangling-association/case.json +3 -0
  646. fincas-0.4.1/crm_import/tests/fixtures/canonical/invalid/dangling-association/validation.expected.json +12 -0
  647. fincas-0.4.1/crm_import/tests/fixtures/canonical/invalid/duplicate-key/case.json +3 -0
  648. fincas-0.4.1/crm_import/tests/fixtures/canonical/invalid/duplicate-key/pipelines.jsonl +2 -0
  649. fincas-0.4.1/crm_import/tests/fixtures/canonical/invalid/duplicate-key/property_defs.jsonl +2 -0
  650. fincas-0.4.1/crm_import/tests/fixtures/canonical/invalid/duplicate-key/validation.expected.json +18 -0
  651. fincas-0.4.1/crm_import/tests/fixtures/canonical/invalid/duplicate-source-id/case.json +3 -0
  652. fincas-0.4.1/crm_import/tests/fixtures/canonical/invalid/duplicate-source-id/contacts.jsonl +5 -0
  653. fincas-0.4.1/crm_import/tests/fixtures/canonical/invalid/duplicate-source-id/validation.expected.json +18 -0
  654. fincas-0.4.1/crm_import/tests/fixtures/canonical/invalid/file-absent-unknown/case.json +39 -0
  655. fincas-0.4.1/crm_import/tests/fixtures/canonical/invalid/file-absent-unknown/validation.expected.json +12 -0
  656. fincas-0.4.1/crm_import/tests/fixtures/canonical/invalid/file-missing/case.json +6 -0
  657. fincas-0.4.1/crm_import/tests/fixtures/canonical/invalid/file-missing/validation.expected.json +12 -0
  658. fincas-0.4.1/crm_import/tests/fixtures/canonical/invalid/hash-mismatch/case.json +4 -0
  659. fincas-0.4.1/crm_import/tests/fixtures/canonical/invalid/hash-mismatch/deals.jsonl +2 -0
  660. fincas-0.4.1/crm_import/tests/fixtures/canonical/invalid/hash-mismatch/validation.expected.json +12 -0
  661. fincas-0.4.1/crm_import/tests/fixtures/canonical/invalid/inconsistent/case.json +3 -0
  662. fincas-0.4.1/crm_import/tests/fixtures/canonical/invalid/inconsistent/consent.jsonl +3 -0
  663. fincas-0.4.1/crm_import/tests/fixtures/canonical/invalid/inconsistent/contacts.jsonl +3 -0
  664. fincas-0.4.1/crm_import/tests/fixtures/canonical/invalid/inconsistent/tasks.jsonl +2 -0
  665. fincas-0.4.1/crm_import/tests/fixtures/canonical/invalid/inconsistent/validation.expected.json +24 -0
  666. fincas-0.4.1/crm_import/tests/fixtures/canonical/invalid/invalid-encoding/case.json +3 -0
  667. fincas-0.4.1/crm_import/tests/fixtures/canonical/invalid/invalid-encoding/owners.jsonl +2 -0
  668. fincas-0.4.1/crm_import/tests/fixtures/canonical/invalid/invalid-encoding/validation.expected.json +12 -0
  669. fincas-0.4.1/crm_import/tests/fixtures/canonical/invalid/invalid-value/case.json +3 -0
  670. fincas-0.4.1/crm_import/tests/fixtures/canonical/invalid/invalid-value/deals.jsonl +2 -0
  671. fincas-0.4.1/crm_import/tests/fixtures/canonical/invalid/invalid-value/pipelines.jsonl +2 -0
  672. fincas-0.4.1/crm_import/tests/fixtures/canonical/invalid/invalid-value/validation.expected.json +24 -0
  673. fincas-0.4.1/crm_import/tests/fixtures/canonical/invalid/malformed-lines/case.json +3 -0
  674. fincas-0.4.1/crm_import/tests/fixtures/canonical/invalid/malformed-lines/tasks.jsonl +5 -0
  675. fincas-0.4.1/crm_import/tests/fixtures/canonical/invalid/malformed-lines/validation.expected.json +24 -0
  676. fincas-0.4.1/crm_import/tests/fixtures/canonical/invalid/manifest-invalid-json/case.json +3 -0
  677. fincas-0.4.1/crm_import/tests/fixtures/canonical/invalid/manifest-invalid-json/manifest.json +1 -0
  678. fincas-0.4.1/crm_import/tests/fixtures/canonical/invalid/manifest-invalid-json/validation.expected.json +12 -0
  679. fincas-0.4.1/crm_import/tests/fixtures/canonical/invalid/manifest-missing/case.json +6 -0
  680. fincas-0.4.1/crm_import/tests/fixtures/canonical/invalid/manifest-missing/validation.expected.json +12 -0
  681. fincas-0.4.1/crm_import/tests/fixtures/canonical/invalid/manifest-provider-mismatch/case.json +12 -0
  682. fincas-0.4.1/crm_import/tests/fixtures/canonical/invalid/manifest-provider-mismatch/validation.expected.json +12 -0
  683. fincas-0.4.1/crm_import/tests/fixtures/canonical/invalid/missing-data-key/case.json +3 -0
  684. fincas-0.4.1/crm_import/tests/fixtures/canonical/invalid/missing-data-key/contacts.jsonl +3 -0
  685. fincas-0.4.1/crm_import/tests/fixtures/canonical/invalid/missing-data-key/validation.expected.json +12 -0
  686. fincas-0.4.1/crm_import/tests/fixtures/canonical/invalid/missing-envelope-key/case.json +3 -0
  687. fincas-0.4.1/crm_import/tests/fixtures/canonical/invalid/missing-envelope-key/contacts.jsonl +3 -0
  688. fincas-0.4.1/crm_import/tests/fixtures/canonical/invalid/missing-envelope-key/validation.expected.json +12 -0
  689. fincas-0.4.1/crm_import/tests/fixtures/canonical/invalid/object-type-missing/case.json +19 -0
  690. fincas-0.4.1/crm_import/tests/fixtures/canonical/invalid/object-type-missing/validation.expected.json +18 -0
  691. fincas-0.4.1/crm_import/tests/fixtures/canonical/invalid/pipeline-key-shape/case.json +3 -0
  692. fincas-0.4.1/crm_import/tests/fixtures/canonical/invalid/pipeline-key-shape/pipelines.jsonl +2 -0
  693. fincas-0.4.1/crm_import/tests/fixtures/canonical/invalid/pipeline-key-shape/validation.expected.json +12 -0
  694. fincas-0.4.1/crm_import/tests/fixtures/canonical/invalid/pipeline-kind-mismatch/case.json +3 -0
  695. fincas-0.4.1/crm_import/tests/fixtures/canonical/invalid/pipeline-kind-mismatch/relationships.jsonl +1 -0
  696. fincas-0.4.1/crm_import/tests/fixtures/canonical/invalid/pipeline-kind-mismatch/validation.expected.json +12 -0
  697. fincas-0.4.1/crm_import/tests/fixtures/canonical/invalid/row-count-mismatch/case.json +14 -0
  698. fincas-0.4.1/crm_import/tests/fixtures/canonical/invalid/row-count-mismatch/validation.expected.json +12 -0
  699. fincas-0.4.1/crm_import/tests/fixtures/canonical/invalid/source-mismatch/case.json +3 -0
  700. fincas-0.4.1/crm_import/tests/fixtures/canonical/invalid/source-mismatch/deals.jsonl +2 -0
  701. fincas-0.4.1/crm_import/tests/fixtures/canonical/invalid/source-mismatch/validation.expected.json +12 -0
  702. fincas-0.4.1/crm_import/tests/fixtures/canonical/invalid/stage-not-in-pipeline/case.json +3 -0
  703. fincas-0.4.1/crm_import/tests/fixtures/canonical/invalid/stage-not-in-pipeline/deals.jsonl +2 -0
  704. fincas-0.4.1/crm_import/tests/fixtures/canonical/invalid/stage-not-in-pipeline/validation.expected.json +12 -0
  705. fincas-0.4.1/crm_import/tests/fixtures/canonical/invalid/task-due-shape/case.json +3 -0
  706. fincas-0.4.1/crm_import/tests/fixtures/canonical/invalid/task-due-shape/tasks.jsonl +2 -0
  707. fincas-0.4.1/crm_import/tests/fixtures/canonical/invalid/task-due-shape/validation.expected.json +12 -0
  708. fincas-0.4.1/crm_import/tests/fixtures/canonical/invalid/unknown-key/case.json +3 -0
  709. fincas-0.4.1/crm_import/tests/fixtures/canonical/invalid/unknown-key/contacts.jsonl +3 -0
  710. fincas-0.4.1/crm_import/tests/fixtures/canonical/invalid/unknown-key/validation.expected.json +18 -0
  711. fincas-0.4.1/crm_import/tests/fixtures/canonical/invalid/unknown-reason-code/case.json +28 -0
  712. fincas-0.4.1/crm_import/tests/fixtures/canonical/invalid/unknown-reason-code/validation.expected.json +12 -0
  713. fincas-0.4.1/crm_import/tests/fixtures/canonical/invalid/unknown-version-manifest/case.json +12 -0
  714. fincas-0.4.1/crm_import/tests/fixtures/canonical/invalid/unknown-version-manifest/validation.expected.json +12 -0
  715. fincas-0.4.1/crm_import/tests/fixtures/canonical/invalid/unknown-version-record/case.json +3 -0
  716. fincas-0.4.1/crm_import/tests/fixtures/canonical/invalid/unknown-version-record/contacts.jsonl +3 -0
  717. fincas-0.4.1/crm_import/tests/fixtures/canonical/invalid/unknown-version-record/validation.expected.json +12 -0
  718. fincas-0.4.1/crm_import/tests/fixtures/canonical/invalid/unresolved-ref-partial/associations.jsonl +4 -0
  719. fincas-0.4.1/crm_import/tests/fixtures/canonical/invalid/unresolved-ref-partial/case.json +28 -0
  720. fincas-0.4.1/crm_import/tests/fixtures/canonical/invalid/unresolved-ref-partial/validation.expected.json +12 -0
  721. fincas-0.4.1/crm_import/tests/fixtures/canonical/invalid/unsorted/case.json +3 -0
  722. fincas-0.4.1/crm_import/tests/fixtures/canonical/invalid/unsorted/contacts.jsonl +3 -0
  723. fincas-0.4.1/crm_import/tests/fixtures/canonical/invalid/unsorted/validation.expected.json +12 -0
  724. fincas-0.4.1/crm_import/tests/fixtures/canonical/invalid/wrong-object-type/case.json +3 -0
  725. fincas-0.4.1/crm_import/tests/fixtures/canonical/invalid/wrong-object-type/deals.jsonl +2 -0
  726. fincas-0.4.1/crm_import/tests/fixtures/canonical/invalid/wrong-object-type/validation.expected.json +12 -0
  727. fincas-0.4.1/crm_import/tests/fixtures/canonical/invalid/wrong-ref-type/case.json +3 -0
  728. fincas-0.4.1/crm_import/tests/fixtures/canonical/invalid/wrong-ref-type/deals.jsonl +2 -0
  729. fincas-0.4.1/crm_import/tests/fixtures/canonical/invalid/wrong-ref-type/validation.expected.json +12 -0
  730. fincas-0.4.1/crm_import/tests/fixtures/canonical/invalid/wrong-type/case.json +3 -0
  731. fincas-0.4.1/crm_import/tests/fixtures/canonical/invalid/wrong-type/deals.jsonl +2 -0
  732. fincas-0.4.1/crm_import/tests/fixtures/canonical/invalid/wrong-type/validation.expected.json +18 -0
  733. fincas-0.4.1/crm_import/tests/fixtures/canonical/valid-small/associations.jsonl +3 -0
  734. fincas-0.4.1/crm_import/tests/fixtures/canonical/valid-small/communications.jsonl +2 -0
  735. fincas-0.4.1/crm_import/tests/fixtures/canonical/valid-small/companies.jsonl +2 -0
  736. fincas-0.4.1/crm_import/tests/fixtures/canonical/valid-small/consent.jsonl +3 -0
  737. fincas-0.4.1/crm_import/tests/fixtures/canonical/valid-small/contacts.jsonl +3 -0
  738. fincas-0.4.1/crm_import/tests/fixtures/canonical/valid-small/deals.jsonl +2 -0
  739. fincas-0.4.1/crm_import/tests/fixtures/canonical/valid-small/expected/validation.expected.json +34 -0
  740. fincas-0.4.1/crm_import/tests/fixtures/canonical/valid-small/manifest.json +113 -0
  741. fincas-0.4.1/crm_import/tests/fixtures/canonical/valid-small/owners.jsonl +2 -0
  742. fincas-0.4.1/crm_import/tests/fixtures/canonical/valid-small/pipelines.jsonl +2 -0
  743. fincas-0.4.1/crm_import/tests/fixtures/canonical/valid-small/property_defs.jsonl +2 -0
  744. fincas-0.4.1/crm_import/tests/fixtures/canonical/valid-small/relationships.jsonl +1 -0
  745. fincas-0.4.1/crm_import/tests/fixtures/canonical/valid-small/tasks.jsonl +2 -0
  746. fincas-0.4.1/crm_import/tests/staging_helpers.py +147 -0
  747. fincas-0.4.1/crm_import/tests/test_ai.py +805 -0
  748. fincas-0.4.1/crm_import/tests/test_appliers.py +543 -0
  749. fincas-0.4.1/crm_import/tests/test_appliers_activity.py +654 -0
  750. fincas-0.4.1/crm_import/tests/test_appliers_deals.py +1008 -0
  751. fincas-0.4.1/crm_import/tests/test_appliers_deals_fixture.py +98 -0
  752. fincas-0.4.1/crm_import/tests/test_appliers_pg.py +82 -0
  753. fincas-0.4.1/crm_import/tests/test_canonical.py +409 -0
  754. fincas-0.4.1/crm_import/tests/test_job_models.py +447 -0
  755. fincas-0.4.1/crm_import/tests/test_review_views.py +833 -0
  756. fincas-0.4.1/crm_import/tests/test_runner.py +390 -0
  757. fincas-0.4.1/crm_import/tests/test_runner_pg.py +106 -0
  758. fincas-0.4.1/crm_import/tests/test_staging.py +817 -0
  759. fincas-0.4.1/crm_import/tests/test_staging_pg.py +92 -0
  760. fincas-0.4.1/crm_import/views/__init__.py +1 -0
  761. fincas-0.4.1/crm_import/views/review.py +605 -0
  762. fincas-0.4.1/crm_import/writelog.py +544 -0
  763. fincas-0.4.1/customers/__init__.py +0 -0
  764. fincas-0.4.1/customers/admin.py +37 -0
  765. fincas-0.4.1/customers/apps.py +5 -0
  766. fincas-0.4.1/customers/erp_urls.py +45 -0
  767. fincas-0.4.1/customers/erp_views.py +726 -0
  768. fincas-0.4.1/customers/forms.py +97 -0
  769. fincas-0.4.1/customers/management/__init__.py +0 -0
  770. fincas-0.4.1/customers/management/commands/__init__.py +0 -0
  771. fincas-0.4.1/customers/management/commands/check_tighten.py +27 -0
  772. fincas-0.4.1/customers/migrations/0001_initial.py +221 -0
  773. fincas-0.4.1/customers/migrations/0002_initial.py +67 -0
  774. fincas-0.4.1/customers/migrations/0003_customer_user.py +27 -0
  775. fincas-0.4.1/customers/migrations/0004_backfill_user_identity.py +34 -0
  776. fincas-0.4.1/customers/migrations/0005_party_links.py +87 -0
  777. fincas-0.4.1/customers/migrations/0006_rerun_identity_backfill.py +33 -0
  778. fincas-0.4.1/customers/migrations/0007_tighten.py +85 -0
  779. fincas-0.4.1/customers/migrations/0008_identity_retire_precheck.py +42 -0
  780. fincas-0.4.1/customers/migrations/0009_remove_customer_supabase_user_id.py +22 -0
  781. fincas-0.4.1/customers/migrations/__init__.py +0 -0
  782. fincas-0.4.1/customers/models.py +367 -0
  783. fincas-0.4.1/customers/pre_tighten.py +133 -0
  784. fincas-0.4.1/customers/serializers.py +71 -0
  785. fincas-0.4.1/customers/test_erased_display.py +68 -0
  786. fincas-0.4.1/customers/test_m3_xss.py +67 -0
  787. fincas-0.4.1/customers/test_portal_link_readonly.py +66 -0
  788. fincas-0.4.1/customers/test_quick_create_tenant.py +86 -0
  789. fincas-0.4.1/customers/test_tighten.py +315 -0
  790. fincas-0.4.1/customers/tests.py +59 -0
  791. fincas-0.4.1/customers/tighten.py +127 -0
  792. fincas-0.4.1/customers/urls.py +9 -0
  793. fincas-0.4.1/customers/views.py +35 -0
  794. fincas-0.4.1/discounts/__init__.py +0 -0
  795. fincas-0.4.1/discounts/admin.py +42 -0
  796. fincas-0.4.1/discounts/apps.py +7 -0
  797. fincas-0.4.1/discounts/erp_urls.py +17 -0
  798. fincas-0.4.1/discounts/erp_views.py +186 -0
  799. fincas-0.4.1/discounts/forms.py +81 -0
  800. fincas-0.4.1/discounts/migrations/0001_initial.py +141 -0
  801. fincas-0.4.1/discounts/migrations/__init__.py +0 -0
  802. fincas-0.4.1/discounts/models.py +78 -0
  803. fincas-0.4.1/discounts/serializers.py +31 -0
  804. fincas-0.4.1/discounts/urls.py +8 -0
  805. fincas-0.4.1/discounts/views.py +166 -0
  806. fincas-0.4.1/documents/__init__.py +0 -0
  807. fincas-0.4.1/documents/admin.py +14 -0
  808. fincas-0.4.1/documents/apps.py +5 -0
  809. fincas-0.4.1/documents/brand.py +31 -0
  810. fincas-0.4.1/documents/erp_urls.py +7 -0
  811. fincas-0.4.1/documents/erp_views.py +38 -0
  812. fincas-0.4.1/documents/management/__init__.py +0 -0
  813. fincas-0.4.1/documents/management/commands/__init__.py +0 -0
  814. fincas-0.4.1/documents/management/commands/auto_match_docs.py +414 -0
  815. fincas-0.4.1/documents/matcher.py +418 -0
  816. fincas-0.4.1/documents/migrations/0001_initial.py +116 -0
  817. fincas-0.4.1/documents/migrations/0002_initial.py +26 -0
  818. fincas-0.4.1/documents/migrations/__init__.py +0 -0
  819. fincas-0.4.1/documents/models.py +65 -0
  820. fincas-0.4.1/documents/serializers.py +40 -0
  821. fincas-0.4.1/documents/services/__init__.py +0 -0
  822. fincas-0.4.1/documents/services/document_context.py +363 -0
  823. fincas-0.4.1/documents/services/pdf.py +82 -0
  824. fincas-0.4.1/documents/templates/documents/base_document.html +351 -0
  825. fincas-0.4.1/documents/templates/documents/purchase_order.html +38 -0
  826. fincas-0.4.1/documents/templates/documents/sales_invoice.html +79 -0
  827. fincas-0.4.1/documents/templates/documents/sales_quote.html +82 -0
  828. fincas-0.4.1/documents/tests/__init__.py +0 -0
  829. fincas-0.4.1/documents/tests/test_auto_match.py +458 -0
  830. fincas-0.4.1/documents/tests/test_document_addresses.py +93 -0
  831. fincas-0.4.1/documents/tests/test_document_fonts.py +92 -0
  832. fincas-0.4.1/documents/tests/test_pdf_service.py +70 -0
  833. fincas-0.4.1/documents/tests/test_quote_pdf_service.py +146 -0
  834. fincas-0.4.1/documents/tests/test_trackc.py +223 -0
  835. fincas-0.4.1/documents/tests/test_upload_caps.py +78 -0
  836. fincas-0.4.1/documents/text_extract.py +52 -0
  837. fincas-0.4.1/documents/tigris_inventory.py +99 -0
  838. fincas-0.4.1/documents/urls.py +8 -0
  839. fincas-0.4.1/documents/views.py +19 -0
  840. fincas-0.4.1/erp_assist/__init__.py +0 -0
  841. fincas-0.4.1/erp_assist/core/__init__.py +21 -0
  842. fincas-0.4.1/erp_assist/core/_cache.py +109 -0
  843. fincas-0.4.1/erp_assist/core/_writable_fields.py +683 -0
  844. fincas-0.4.1/erp_assist/core/client.py +270 -0
  845. fincas-0.4.1/erp_assist/core/crm.py +565 -0
  846. fincas-0.4.1/erp_assist/core/customers.py +258 -0
  847. fincas-0.4.1/erp_assist/core/inventory.py +154 -0
  848. fincas-0.4.1/erp_assist/core/orders.py +526 -0
  849. fincas-0.4.1/erp_assist/core/parties.py +188 -0
  850. fincas-0.4.1/erp_assist/core/pricing.py +208 -0
  851. fincas-0.4.1/erp_assist/core/products.py +558 -0
  852. fincas-0.4.1/erp_assist/core/purchasing.py +343 -0
  853. fincas-0.4.1/erp_assist/http_adapter.py +27 -0
  854. fincas-0.4.1/erp_assist/mcp_adapter.py +2222 -0
  855. fincas-0.4.1/erp_assist/tests/__init__.py +0 -0
  856. fincas-0.4.1/erp_assist/tests/test_api_e2e.py +263 -0
  857. fincas-0.4.1/erp_assist/tests/test_crm_report_tools.py +149 -0
  858. fincas-0.4.1/erp_assist/tests/test_crm_tools.py +394 -0
  859. fincas-0.4.1/erp_assist/tests/test_customer_writable.py +35 -0
  860. fincas-0.4.1/erp_assist/tests/test_party_ambiguity.py +246 -0
  861. fincas-0.4.1/erp_assist/tests/test_quote_pipeline_moved.py +44 -0
  862. fincas-0.4.1/fincas.egg-info/PKG-INFO +216 -0
  863. fincas-0.4.1/fincas.egg-info/SOURCES.txt +2329 -0
  864. fincas-0.4.1/fincas.egg-info/dependency_links.txt +1 -0
  865. fincas-0.4.1/fincas.egg-info/requires.txt +28 -0
  866. fincas-0.4.1/fincas.egg-info/top_level.txt +26 -0
  867. fincas-0.4.1/fulfillment/__init__.py +0 -0
  868. fincas-0.4.1/fulfillment/admin.py +204 -0
  869. fincas-0.4.1/fulfillment/apps.py +5 -0
  870. fincas-0.4.1/fulfillment/carriers/__init__.py +26 -0
  871. fincas-0.4.1/fulfillment/carriers/base.py +118 -0
  872. fincas-0.4.1/fulfillment/carriers/easypost_carrier.py +184 -0
  873. fincas-0.4.1/fulfillment/carriers/manual.py +74 -0
  874. fincas-0.4.1/fulfillment/carriers/registry.py +41 -0
  875. fincas-0.4.1/fulfillment/erp_urls.py +17 -0
  876. fincas-0.4.1/fulfillment/erp_views.py +337 -0
  877. fincas-0.4.1/fulfillment/forms.py +63 -0
  878. fincas-0.4.1/fulfillment/label_service.py +293 -0
  879. fincas-0.4.1/fulfillment/migrations/0001_initial.py +120 -0
  880. fincas-0.4.1/fulfillment/migrations/0002_initial.py +79 -0
  881. fincas-0.4.1/fulfillment/migrations/0003_initial.py +27 -0
  882. fincas-0.4.1/fulfillment/migrations/__init__.py +0 -0
  883. fincas-0.4.1/fulfillment/models.py +117 -0
  884. fincas-0.4.1/fulfillment/printer.py +95 -0
  885. fincas-0.4.1/fulfillment/serializers.py +19 -0
  886. fincas-0.4.1/fulfillment/templates/admin/fulfillment/pickticket/change_form.html +143 -0
  887. fincas-0.4.1/fulfillment/tests/__init__.py +0 -0
  888. fincas-0.4.1/fulfillment/tests/test_carriers.py +82 -0
  889. fincas-0.4.1/fulfillment/tests/test_company_scoping.py +119 -0
  890. fincas-0.4.1/fulfillment/tests/test_m2d_print.py +69 -0
  891. fincas-0.4.1/fulfillment/tests/test_pick_ticket_transitions.py +100 -0
  892. fincas-0.4.1/fulfillment/urls.py +9 -0
  893. fincas-0.4.1/fulfillment/views.py +55 -0
  894. fincas-0.4.1/golden_erp/__init__.py +34 -0
  895. fincas-0.4.1/golden_erp/addons/__init__.py +7 -0
  896. fincas-0.4.1/golden_erp/addons/aircall/__init__.py +13 -0
  897. fincas-0.4.1/golden_erp/addons/aircall/adapter.py +304 -0
  898. fincas-0.4.1/golden_erp/addons/aircall/fixtures/comment-update/account.json +4 -0
  899. fincas-0.4.1/golden_erp/addons/aircall/fixtures/comment-update/case.json +37 -0
  900. fincas-0.4.1/golden_erp/addons/aircall/fixtures/comment-update/db.expected.json +57 -0
  901. fincas-0.4.1/golden_erp/addons/aircall/fixtures/comment-update/inbound/001.json +38 -0
  902. fincas-0.4.1/golden_erp/addons/aircall/fixtures/comment-update/inbound/002.json +49 -0
  903. fincas-0.4.1/golden_erp/addons/aircall/fixtures/comment-update/requests.expected.json +1 -0
  904. fincas-0.4.1/golden_erp/addons/aircall/fixtures/erased-call-skipped/account.json +4 -0
  905. fincas-0.4.1/golden_erp/addons/aircall/fixtures/erased-call-skipped/case.json +34 -0
  906. fincas-0.4.1/golden_erp/addons/aircall/fixtures/erased-call-skipped/db.expected.json +20 -0
  907. fincas-0.4.1/golden_erp/addons/aircall/fixtures/erased-call-skipped/inbound/001.json +38 -0
  908. fincas-0.4.1/golden_erp/addons/aircall/fixtures/erased-call-skipped/requests.expected.json +1 -0
  909. fincas-0.4.1/golden_erp/addons/aircall/fixtures/erased-number-skipped/account.json +4 -0
  910. fincas-0.4.1/golden_erp/addons/aircall/fixtures/erased-number-skipped/case.json +25 -0
  911. fincas-0.4.1/golden_erp/addons/aircall/fixtures/erased-number-skipped/db.expected.json +32 -0
  912. fincas-0.4.1/golden_erp/addons/aircall/fixtures/erased-number-skipped/inbound/001.json +38 -0
  913. fincas-0.4.1/golden_erp/addons/aircall/fixtures/erased-number-skipped/requests.expected.json +1 -0
  914. fincas-0.4.1/golden_erp/addons/aircall/fixtures/ignored-event/account.json +4 -0
  915. fincas-0.4.1/golden_erp/addons/aircall/fixtures/ignored-event/case.json +30 -0
  916. fincas-0.4.1/golden_erp/addons/aircall/fixtures/ignored-event/db.expected.json +17 -0
  917. fincas-0.4.1/golden_erp/addons/aircall/fixtures/ignored-event/inbound/001.json +14 -0
  918. fincas-0.4.1/golden_erp/addons/aircall/fixtures/ignored-event/requests.expected.json +1 -0
  919. fincas-0.4.1/golden_erp/addons/aircall/fixtures/inbound-answered-known/account.json +4 -0
  920. fincas-0.4.1/golden_erp/addons/aircall/fixtures/inbound-answered-known/case.json +36 -0
  921. fincas-0.4.1/golden_erp/addons/aircall/fixtures/inbound-answered-known/db.expected.json +50 -0
  922. fincas-0.4.1/golden_erp/addons/aircall/fixtures/inbound-answered-known/inbound/001.json +43 -0
  923. fincas-0.4.1/golden_erp/addons/aircall/fixtures/inbound-answered-known/requests.expected.json +1 -0
  924. fincas-0.4.1/golden_erp/addons/aircall/fixtures/missed-unknown-number/account.json +4 -0
  925. fincas-0.4.1/golden_erp/addons/aircall/fixtures/missed-unknown-number/case.json +30 -0
  926. fincas-0.4.1/golden_erp/addons/aircall/fixtures/missed-unknown-number/db.expected.json +50 -0
  927. fincas-0.4.1/golden_erp/addons/aircall/fixtures/missed-unknown-number/inbound/001.json +34 -0
  928. fincas-0.4.1/golden_erp/addons/aircall/fixtures/missed-unknown-number/requests.expected.json +1 -0
  929. fincas-0.4.1/golden_erp/addons/aircall/fixtures/newer-schema/account.json +4 -0
  930. fincas-0.4.1/golden_erp/addons/aircall/fixtures/newer-schema/case.json +28 -0
  931. fincas-0.4.1/golden_erp/addons/aircall/fixtures/newer-schema/db.expected.json +9 -0
  932. fincas-0.4.1/golden_erp/addons/aircall/fixtures/newer-schema/inbound/001.json +38 -0
  933. fincas-0.4.1/golden_erp/addons/aircall/fixtures/newer-schema/requests.expected.json +1 -0
  934. fincas-0.4.1/golden_erp/addons/aircall/fixtures/outbound-known/account.json +4 -0
  935. fincas-0.4.1/golden_erp/addons/aircall/fixtures/outbound-known/case.json +33 -0
  936. fincas-0.4.1/golden_erp/addons/aircall/fixtures/outbound-known/db.expected.json +42 -0
  937. fincas-0.4.1/golden_erp/addons/aircall/fixtures/outbound-known/inbound/001.json +38 -0
  938. fincas-0.4.1/golden_erp/addons/aircall/fixtures/outbound-known/requests.expected.json +1 -0
  939. fincas-0.4.1/golden_erp/addons/aircall/fixtures/poll-backstop/account.json +6 -0
  940. fincas-0.4.1/golden_erp/addons/aircall/fixtures/poll-backstop/case.json +50 -0
  941. fincas-0.4.1/golden_erp/addons/aircall/fixtures/poll-backstop/db.expected.json +42 -0
  942. fincas-0.4.1/golden_erp/addons/aircall/fixtures/poll-backstop/requests.expected.json +32 -0
  943. fincas-0.4.1/golden_erp/addons/aircall/fixtures/poll-backstop/responses/001-page1.json +54 -0
  944. fincas-0.4.1/golden_erp/addons/aircall/fixtures/poll-backstop/responses/002-page2.json +54 -0
  945. fincas-0.4.1/golden_erp/addons/aircall/fixtures/poll-backstop/responses/003-held.json +26 -0
  946. fincas-0.4.1/golden_erp/addons/aircall/fixtures/replayed-event/account.json +4 -0
  947. fincas-0.4.1/golden_erp/addons/aircall/fixtures/replayed-event/case.json +34 -0
  948. fincas-0.4.1/golden_erp/addons/aircall/fixtures/replayed-event/db.expected.json +50 -0
  949. fincas-0.4.1/golden_erp/addons/aircall/fixtures/replayed-event/inbound/001.json +38 -0
  950. fincas-0.4.1/golden_erp/addons/aircall/fixtures/replayed-event/requests.expected.json +1 -0
  951. fincas-0.4.1/golden_erp/addons/aircall/fixtures/token-mismatch/account.json +4 -0
  952. fincas-0.4.1/golden_erp/addons/aircall/fixtures/token-mismatch/case.json +30 -0
  953. fincas-0.4.1/golden_erp/addons/aircall/fixtures/token-mismatch/db.expected.json +9 -0
  954. fincas-0.4.1/golden_erp/addons/aircall/fixtures/token-mismatch/inbound/001.json +38 -0
  955. fincas-0.4.1/golden_erp/addons/aircall/fixtures/token-mismatch/requests.expected.json +1 -0
  956. fincas-0.4.1/golden_erp/addons/aircall/fixtures/voicemail/account.json +4 -0
  957. fincas-0.4.1/golden_erp/addons/aircall/fixtures/voicemail/case.json +30 -0
  958. fincas-0.4.1/golden_erp/addons/aircall/fixtures/voicemail/db.expected.json +50 -0
  959. fincas-0.4.1/golden_erp/addons/aircall/fixtures/voicemail/inbound/001.json +34 -0
  960. fincas-0.4.1/golden_erp/addons/aircall/fixtures/voicemail/requests.expected.json +1 -0
  961. fincas-0.4.1/golden_erp/addons/aircall/mapping.py +198 -0
  962. fincas-0.4.1/golden_erp/addons/aircall/plugin.py +26 -0
  963. fincas-0.4.1/golden_erp/addons/aircall/tests/__init__.py +0 -0
  964. fincas-0.4.1/golden_erp/addons/aircall/tests/helpers.py +42 -0
  965. fincas-0.4.1/golden_erp/addons/aircall/tests/test_aircall.py +406 -0
  966. fincas-0.4.1/golden_erp/addons/aircall/tests/test_contract.py +33 -0
  967. fincas-0.4.1/golden_erp/addons/aircall/tests/test_mapping.py +92 -0
  968. fincas-0.4.1/golden_erp/addons/aircall/values.py +62 -0
  969. fincas-0.4.1/golden_erp/addons/clickup/__init__.py +14 -0
  970. fincas-0.4.1/golden_erp/addons/clickup/adapter.py +1135 -0
  971. fincas-0.4.1/golden_erp/addons/clickup/fixtures/assignee-unknown/account.json +18 -0
  972. fincas-0.4.1/golden_erp/addons/clickup/fixtures/assignee-unknown/case.json +45 -0
  973. fincas-0.4.1/golden_erp/addons/clickup/fixtures/assignee-unknown/db.expected.json +30 -0
  974. fincas-0.4.1/golden_erp/addons/clickup/fixtures/assignee-unknown/inbound/001.json +36 -0
  975. fincas-0.4.1/golden_erp/addons/clickup/fixtures/assignee-unknown/requests.expected.json +1 -0
  976. fincas-0.4.1/golden_erp/addons/clickup/fixtures/deleted-cancels/account.json +18 -0
  977. fincas-0.4.1/golden_erp/addons/clickup/fixtures/deleted-cancels/case.json +65 -0
  978. fincas-0.4.1/golden_erp/addons/clickup/fixtures/deleted-cancels/db.expected.json +64 -0
  979. fincas-0.4.1/golden_erp/addons/clickup/fixtures/deleted-cancels/inbound/001-deleted.json +24 -0
  980. fincas-0.4.1/golden_erp/addons/clickup/fixtures/deleted-cancels/inbound/002-deleted.json +24 -0
  981. fincas-0.4.1/golden_erp/addons/clickup/fixtures/deleted-cancels/requests.expected.json +1 -0
  982. fincas-0.4.1/golden_erp/addons/clickup/fixtures/echo-no-op/account.json +18 -0
  983. fincas-0.4.1/golden_erp/addons/clickup/fixtures/echo-no-op/case.json +59 -0
  984. fincas-0.4.1/golden_erp/addons/clickup/fixtures/echo-no-op/db.expected.json +48 -0
  985. fincas-0.4.1/golden_erp/addons/clickup/fixtures/echo-no-op/inbound/001-echo.json +24 -0
  986. fincas-0.4.1/golden_erp/addons/clickup/fixtures/echo-no-op/requests.expected.json +26 -0
  987. fincas-0.4.1/golden_erp/addons/clickup/fixtures/echo-no-op/responses/001.json +40 -0
  988. fincas-0.4.1/golden_erp/addons/clickup/fixtures/echo-no-op/responses/002.json +40 -0
  989. fincas-0.4.1/golden_erp/addons/clickup/fixtures/erase/account.json +18 -0
  990. fincas-0.4.1/golden_erp/addons/clickup/fixtures/erase/case.json +59 -0
  991. fincas-0.4.1/golden_erp/addons/clickup/fixtures/erase/db.expected.json +38 -0
  992. fincas-0.4.1/golden_erp/addons/clickup/fixtures/erase/requests.expected.json +25 -0
  993. fincas-0.4.1/golden_erp/addons/clickup/fixtures/erase/responses/001.json +34 -0
  994. fincas-0.4.1/golden_erp/addons/clickup/fixtures/erase/responses/002.json +9 -0
  995. fincas-0.4.1/golden_erp/addons/clickup/fixtures/inbound-create-linked/account.json +18 -0
  996. fincas-0.4.1/golden_erp/addons/clickup/fixtures/inbound-create-linked/case.json +36 -0
  997. fincas-0.4.1/golden_erp/addons/clickup/fixtures/inbound-create-linked/db.expected.json +38 -0
  998. fincas-0.4.1/golden_erp/addons/clickup/fixtures/inbound-create-linked/inbound/001-created.json +24 -0
  999. fincas-0.4.1/golden_erp/addons/clickup/fixtures/inbound-create-linked/requests.expected.json +14 -0
  1000. fincas-0.4.1/golden_erp/addons/clickup/fixtures/inbound-create-linked/responses/001.json +47 -0
  1001. fincas-0.4.1/golden_erp/addons/clickup/fixtures/inbound-engagement-refused/account.json +18 -0
  1002. fincas-0.4.1/golden_erp/addons/clickup/fixtures/inbound-engagement-refused/case.json +56 -0
  1003. fincas-0.4.1/golden_erp/addons/clickup/fixtures/inbound-engagement-refused/db.expected.json +30 -0
  1004. fincas-0.4.1/golden_erp/addons/clickup/fixtures/inbound-engagement-refused/inbound/001.json +43 -0
  1005. fincas-0.4.1/golden_erp/addons/clickup/fixtures/inbound-engagement-refused/requests.expected.json +1 -0
  1006. fincas-0.4.1/golden_erp/addons/clickup/fixtures/inbound-erased-skipped/account.json +18 -0
  1007. fincas-0.4.1/golden_erp/addons/clickup/fixtures/inbound-erased-skipped/case.json +46 -0
  1008. fincas-0.4.1/golden_erp/addons/clickup/fixtures/inbound-erased-skipped/db.expected.json +31 -0
  1009. fincas-0.4.1/golden_erp/addons/clickup/fixtures/inbound-erased-skipped/inbound/001.json +36 -0
  1010. fincas-0.4.1/golden_erp/addons/clickup/fixtures/inbound-erased-skipped/requests.expected.json +1 -0
  1011. fincas-0.4.1/golden_erp/addons/clickup/fixtures/inbound-stale-ignored/account.json +18 -0
  1012. fincas-0.4.1/golden_erp/addons/clickup/fixtures/inbound-stale-ignored/case.json +45 -0
  1013. fincas-0.4.1/golden_erp/addons/clickup/fixtures/inbound-stale-ignored/db.expected.json +30 -0
  1014. fincas-0.4.1/golden_erp/addons/clickup/fixtures/inbound-stale-ignored/inbound/001-stale.json +36 -0
  1015. fincas-0.4.1/golden_erp/addons/clickup/fixtures/inbound-stale-ignored/requests.expected.json +1 -0
  1016. fincas-0.4.1/golden_erp/addons/clickup/fixtures/inbound-status-map/account.json +18 -0
  1017. fincas-0.4.1/golden_erp/addons/clickup/fixtures/inbound-status-map/case.json +48 -0
  1018. fincas-0.4.1/golden_erp/addons/clickup/fixtures/inbound-status-map/db.expected.json +30 -0
  1019. fincas-0.4.1/golden_erp/addons/clickup/fixtures/inbound-status-map/inbound/001-in-review.json +36 -0
  1020. fincas-0.4.1/golden_erp/addons/clickup/fixtures/inbound-status-map/inbound/002-closed.json +36 -0
  1021. fincas-0.4.1/golden_erp/addons/clickup/fixtures/inbound-status-map/requests.expected.json +1 -0
  1022. fincas-0.4.1/golden_erp/addons/clickup/fixtures/inbound-unlinked-ignored/account.json +18 -0
  1023. fincas-0.4.1/golden_erp/addons/clickup/fixtures/inbound-unlinked-ignored/case.json +35 -0
  1024. fincas-0.4.1/golden_erp/addons/clickup/fixtures/inbound-unlinked-ignored/db.expected.json +9 -0
  1025. fincas-0.4.1/golden_erp/addons/clickup/fixtures/inbound-unlinked-ignored/inbound/001-unlinked.json +30 -0
  1026. fincas-0.4.1/golden_erp/addons/clickup/fixtures/inbound-unlinked-ignored/inbound/002-other-list.json +37 -0
  1027. fincas-0.4.1/golden_erp/addons/clickup/fixtures/inbound-unlinked-ignored/requests.expected.json +1 -0
  1028. fincas-0.4.1/golden_erp/addons/clickup/fixtures/newer-schema/account.json +18 -0
  1029. fincas-0.4.1/golden_erp/addons/clickup/fixtures/newer-schema/case.json +34 -0
  1030. fincas-0.4.1/golden_erp/addons/clickup/fixtures/newer-schema/db.expected.json +9 -0
  1031. fincas-0.4.1/golden_erp/addons/clickup/fixtures/newer-schema/inbound/001.json +37 -0
  1032. fincas-0.4.1/golden_erp/addons/clickup/fixtures/newer-schema/requests.expected.json +1 -0
  1033. fincas-0.4.1/golden_erp/addons/clickup/fixtures/poll-pages/account.json +18 -0
  1034. fincas-0.4.1/golden_erp/addons/clickup/fixtures/poll-pages/case.json +52 -0
  1035. fincas-0.4.1/golden_erp/addons/clickup/fixtures/poll-pages/db.expected.json +49 -0
  1036. fincas-0.4.1/golden_erp/addons/clickup/fixtures/poll-pages/requests.expected.json +38 -0
  1037. fincas-0.4.1/golden_erp/addons/clickup/fixtures/poll-pages/responses/001.json +81 -0
  1038. fincas-0.4.1/golden_erp/addons/clickup/fixtures/poll-pages/responses/002.json +55 -0
  1039. fincas-0.4.1/golden_erp/addons/clickup/fixtures/poll-pages/responses/003.json +22 -0
  1040. fincas-0.4.1/golden_erp/addons/clickup/fixtures/push-complete/account.json +18 -0
  1041. fincas-0.4.1/golden_erp/addons/clickup/fixtures/push-complete/case.json +51 -0
  1042. fincas-0.4.1/golden_erp/addons/clickup/fixtures/push-complete/db.expected.json +41 -0
  1043. fincas-0.4.1/golden_erp/addons/clickup/fixtures/push-complete/requests.expected.json +14 -0
  1044. fincas-0.4.1/golden_erp/addons/clickup/fixtures/push-complete/responses/001.json +40 -0
  1045. fincas-0.4.1/golden_erp/addons/clickup/fixtures/push-create/account.json +18 -0
  1046. fincas-0.4.1/golden_erp/addons/clickup/fixtures/push-create/case.json +43 -0
  1047. fincas-0.4.1/golden_erp/addons/clickup/fixtures/push-create/db.expected.json +38 -0
  1048. fincas-0.4.1/golden_erp/addons/clickup/fixtures/push-create/requests.expected.json +38 -0
  1049. fincas-0.4.1/golden_erp/addons/clickup/fixtures/push-create/responses/001.json +17 -0
  1050. fincas-0.4.1/golden_erp/addons/clickup/fixtures/push-create/responses/002.json +40 -0
  1051. fincas-0.4.1/golden_erp/addons/clickup/fixtures/push-create-timeout/account.json +18 -0
  1052. fincas-0.4.1/golden_erp/addons/clickup/fixtures/push-create-timeout/case.json +49 -0
  1053. fincas-0.4.1/golden_erp/addons/clickup/fixtures/push-create-timeout/db.expected.json +47 -0
  1054. fincas-0.4.1/golden_erp/addons/clickup/fixtures/push-create-timeout/requests.expected.json +84 -0
  1055. fincas-0.4.1/golden_erp/addons/clickup/fixtures/push-create-timeout/responses/001.json +18 -0
  1056. fincas-0.4.1/golden_erp/addons/clickup/fixtures/push-create-timeout/responses/002.json +12 -0
  1057. fincas-0.4.1/golden_erp/addons/clickup/fixtures/push-create-timeout/responses/003.json +45 -0
  1058. fincas-0.4.1/golden_erp/addons/clickup/fixtures/push-create-timeout/responses/004.json +40 -0
  1059. fincas-0.4.1/golden_erp/addons/clickup/fixtures/push-edit/account.json +18 -0
  1060. fincas-0.4.1/golden_erp/addons/clickup/fixtures/push-edit/case.json +52 -0
  1061. fincas-0.4.1/golden_erp/addons/clickup/fixtures/push-edit/db.expected.json +41 -0
  1062. fincas-0.4.1/golden_erp/addons/clickup/fixtures/push-edit/requests.expected.json +14 -0
  1063. fincas-0.4.1/golden_erp/addons/clickup/fixtures/push-edit/responses/001.json +40 -0
  1064. fincas-0.4.1/golden_erp/addons/clickup/fixtures/push-reschedule/account.json +18 -0
  1065. fincas-0.4.1/golden_erp/addons/clickup/fixtures/push-reschedule/case.json +52 -0
  1066. fincas-0.4.1/golden_erp/addons/clickup/fixtures/push-reschedule/db.expected.json +42 -0
  1067. fincas-0.4.1/golden_erp/addons/clickup/fixtures/push-reschedule/requests.expected.json +15 -0
  1068. fincas-0.4.1/golden_erp/addons/clickup/fixtures/push-reschedule/responses/001.json +40 -0
  1069. fincas-0.4.1/golden_erp/addons/clickup/fixtures/rate-limited/account.json +18 -0
  1070. fincas-0.4.1/golden_erp/addons/clickup/fixtures/rate-limited/case.json +54 -0
  1071. fincas-0.4.1/golden_erp/addons/clickup/fixtures/rate-limited/db.expected.json +38 -0
  1072. fincas-0.4.1/golden_erp/addons/clickup/fixtures/rate-limited/requests.expected.json +14 -0
  1073. fincas-0.4.1/golden_erp/addons/clickup/fixtures/rate-limited/responses/001.json +18 -0
  1074. fincas-0.4.1/golden_erp/addons/clickup/fixtures/webhook-replayed/account.json +18 -0
  1075. fincas-0.4.1/golden_erp/addons/clickup/fixtures/webhook-replayed/case.json +40 -0
  1076. fincas-0.4.1/golden_erp/addons/clickup/fixtures/webhook-replayed/db.expected.json +38 -0
  1077. fincas-0.4.1/golden_erp/addons/clickup/fixtures/webhook-replayed/inbound/001.json +24 -0
  1078. fincas-0.4.1/golden_erp/addons/clickup/fixtures/webhook-replayed/requests.expected.json +14 -0
  1079. fincas-0.4.1/golden_erp/addons/clickup/fixtures/webhook-replayed/responses/001.json +41 -0
  1080. fincas-0.4.1/golden_erp/addons/clickup/fixtures/webhook-tampered/account.json +18 -0
  1081. fincas-0.4.1/golden_erp/addons/clickup/fixtures/webhook-tampered/case.json +33 -0
  1082. fincas-0.4.1/golden_erp/addons/clickup/fixtures/webhook-tampered/db.expected.json +9 -0
  1083. fincas-0.4.1/golden_erp/addons/clickup/fixtures/webhook-tampered/inbound/001.json +24 -0
  1084. fincas-0.4.1/golden_erp/addons/clickup/fixtures/webhook-tampered/requests.expected.json +1 -0
  1085. fincas-0.4.1/golden_erp/addons/clickup/mapping.py +226 -0
  1086. fincas-0.4.1/golden_erp/addons/clickup/plugin.py +26 -0
  1087. fincas-0.4.1/golden_erp/addons/clickup/tests/__init__.py +0 -0
  1088. fincas-0.4.1/golden_erp/addons/clickup/tests/seed.py +99 -0
  1089. fincas-0.4.1/golden_erp/addons/clickup/tests/test_adapter.py +606 -0
  1090. fincas-0.4.1/golden_erp/addons/clickup/tests/test_contract.py +36 -0
  1091. fincas-0.4.1/golden_erp/addons/clickup/tests/test_mapping.py +82 -0
  1092. fincas-0.4.1/golden_erp/addons/clickup/values.py +69 -0
  1093. fincas-0.4.1/golden_erp/addons/example_audit_notifier/__init__.py +5 -0
  1094. fincas-0.4.1/golden_erp/addons/example_audit_notifier/plugin.py +100 -0
  1095. fincas-0.4.1/golden_erp/addons/fixture_crm/__init__.py +13 -0
  1096. fincas-0.4.1/golden_erp/addons/fixture_crm/adapter.py +235 -0
  1097. fincas-0.4.1/golden_erp/addons/fixture_crm/fixtures/fixture/inbound-erased-skipped/account.json +6 -0
  1098. fincas-0.4.1/golden_erp/addons/fixture_crm/fixtures/fixture/inbound-erased-skipped/case.json +27 -0
  1099. fincas-0.4.1/golden_erp/addons/fixture_crm/fixtures/fixture/inbound-erased-skipped/db.expected.json +20 -0
  1100. fincas-0.4.1/golden_erp/addons/fixture_crm/fixtures/fixture/inbound-erased-skipped/inbound/001.json +16 -0
  1101. fincas-0.4.1/golden_erp/addons/fixture_crm/fixtures/fixture/inbound-erased-skipped/requests.expected.json +1 -0
  1102. fincas-0.4.1/golden_erp/addons/fixture_crm/fixtures/fixture/inbound-known-party/account.json +6 -0
  1103. fincas-0.4.1/golden_erp/addons/fixture_crm/fixtures/fixture/inbound-known-party/case.json +19 -0
  1104. fincas-0.4.1/golden_erp/addons/fixture_crm/fixtures/fixture/inbound-known-party/db.expected.json +42 -0
  1105. fincas-0.4.1/golden_erp/addons/fixture_crm/fixtures/fixture/inbound-known-party/inbound/001.json +16 -0
  1106. fincas-0.4.1/golden_erp/addons/fixture_crm/fixtures/fixture/inbound-known-party/requests.expected.json +1 -0
  1107. fincas-0.4.1/golden_erp/addons/fixture_crm/fixtures/fixture/inbound-unknown-party/account.json +6 -0
  1108. fincas-0.4.1/golden_erp/addons/fixture_crm/fixtures/fixture/inbound-unknown-party/case.json +19 -0
  1109. fincas-0.4.1/golden_erp/addons/fixture_crm/fixtures/fixture/inbound-unknown-party/db.expected.json +9 -0
  1110. fincas-0.4.1/golden_erp/addons/fixture_crm/fixtures/fixture/inbound-unknown-party/inbound/001.json +16 -0
  1111. fincas-0.4.1/golden_erp/addons/fixture_crm/fixtures/fixture/inbound-unknown-party/requests.expected.json +1 -0
  1112. fincas-0.4.1/golden_erp/addons/fixture_crm/fixtures/fixture/inbound-unsupported-type/account.json +6 -0
  1113. fincas-0.4.1/golden_erp/addons/fixture_crm/fixtures/fixture/inbound-unsupported-type/case.json +19 -0
  1114. fincas-0.4.1/golden_erp/addons/fixture_crm/fixtures/fixture/inbound-unsupported-type/db.expected.json +9 -0
  1115. fincas-0.4.1/golden_erp/addons/fixture_crm/fixtures/fixture/inbound-unsupported-type/inbound/001.json +16 -0
  1116. fincas-0.4.1/golden_erp/addons/fixture_crm/fixtures/fixture/inbound-unsupported-type/requests.expected.json +1 -0
  1117. fincas-0.4.1/golden_erp/addons/fixture_crm/fixtures/fixture/newer-schema/account.json +6 -0
  1118. fincas-0.4.1/golden_erp/addons/fixture_crm/fixtures/fixture/newer-schema/case.json +21 -0
  1119. fincas-0.4.1/golden_erp/addons/fixture_crm/fixtures/fixture/newer-schema/db.expected.json +9 -0
  1120. fincas-0.4.1/golden_erp/addons/fixture_crm/fixtures/fixture/newer-schema/inbound/001.json +16 -0
  1121. fincas-0.4.1/golden_erp/addons/fixture_crm/fixtures/fixture/newer-schema/requests.expected.json +1 -0
  1122. fincas-0.4.1/golden_erp/addons/fixture_crm/fixtures/fixture/poll-pages/account.json +7 -0
  1123. fincas-0.4.1/golden_erp/addons/fixture_crm/fixtures/fixture/poll-pages/case.json +39 -0
  1124. fincas-0.4.1/golden_erp/addons/fixture_crm/fixtures/fixture/poll-pages/db.expected.json +73 -0
  1125. fincas-0.4.1/golden_erp/addons/fixture_crm/fixtures/fixture/poll-pages/requests.expected.json +27 -0
  1126. fincas-0.4.1/golden_erp/addons/fixture_crm/fixtures/fixture/poll-pages/responses/001-page1.json +30 -0
  1127. fincas-0.4.1/golden_erp/addons/fixture_crm/fixtures/fixture/poll-pages/responses/002-page2.json +29 -0
  1128. fincas-0.4.1/golden_erp/addons/fixture_crm/fixtures/fixture/poll-pages/responses/003-empty.json +17 -0
  1129. fincas-0.4.1/golden_erp/addons/fixture_crm/fixtures/fixture/push-create/account.json +6 -0
  1130. fincas-0.4.1/golden_erp/addons/fixture_crm/fixtures/fixture/push-create/case.json +26 -0
  1131. fincas-0.4.1/golden_erp/addons/fixture_crm/fixtures/fixture/push-create/db.expected.json +26 -0
  1132. fincas-0.4.1/golden_erp/addons/fixture_crm/fixtures/fixture/push-create/requests.expected.json +17 -0
  1133. fincas-0.4.1/golden_erp/addons/fixture_crm/fixtures/fixture/push-create/responses/001-create.json +14 -0
  1134. fincas-0.4.1/golden_erp/addons/fixture_crm/fixtures/fixture/push-create-timeout/account.json +6 -0
  1135. fincas-0.4.1/golden_erp/addons/fixture_crm/fixtures/fixture/push-create-timeout/case.json +32 -0
  1136. fincas-0.4.1/golden_erp/addons/fixture_crm/fixtures/fixture/push-create-timeout/db.expected.json +26 -0
  1137. fincas-0.4.1/golden_erp/addons/fixture_crm/fixtures/fixture/push-create-timeout/requests.expected.json +29 -0
  1138. fincas-0.4.1/golden_erp/addons/fixture_crm/fixtures/fixture/push-create-timeout/responses/001-create-lost.json +12 -0
  1139. fincas-0.4.1/golden_erp/addons/fixture_crm/fixtures/fixture/push-create-timeout/responses/002-search.json +15 -0
  1140. fincas-0.4.1/golden_erp/addons/fixture_crm/fixtures/fixture/push-update/account.json +6 -0
  1141. fincas-0.4.1/golden_erp/addons/fixture_crm/fixtures/fixture/push-update/case.json +33 -0
  1142. fincas-0.4.1/golden_erp/addons/fixture_crm/fixtures/fixture/push-update/db.expected.json +26 -0
  1143. fincas-0.4.1/golden_erp/addons/fixture_crm/fixtures/fixture/push-update/requests.expected.json +16 -0
  1144. fincas-0.4.1/golden_erp/addons/fixture_crm/fixtures/fixture/push-update/responses/001-patch.json +11 -0
  1145. fincas-0.4.1/golden_erp/addons/fixture_crm/fixtures/fixture/rate-limited/account.json +6 -0
  1146. fincas-0.4.1/golden_erp/addons/fixture_crm/fixtures/fixture/rate-limited/case.json +29 -0
  1147. fincas-0.4.1/golden_erp/addons/fixture_crm/fixtures/fixture/rate-limited/db.expected.json +17 -0
  1148. fincas-0.4.1/golden_erp/addons/fixture_crm/fixtures/fixture/rate-limited/requests.expected.json +17 -0
  1149. fincas-0.4.1/golden_erp/addons/fixture_crm/fixtures/fixture/rate-limited/responses/001-throttled.json +17 -0
  1150. fincas-0.4.1/golden_erp/addons/fixture_crm/fixtures/fixture/webhook-stale/account.json +6 -0
  1151. fincas-0.4.1/golden_erp/addons/fixture_crm/fixtures/fixture/webhook-stale/case.json +23 -0
  1152. fincas-0.4.1/golden_erp/addons/fixture_crm/fixtures/fixture/webhook-stale/db.expected.json +9 -0
  1153. fincas-0.4.1/golden_erp/addons/fixture_crm/fixtures/fixture/webhook-stale/inbound/001.json +23 -0
  1154. fincas-0.4.1/golden_erp/addons/fixture_crm/fixtures/fixture/webhook-stale/requests.expected.json +1 -0
  1155. fincas-0.4.1/golden_erp/addons/fixture_crm/fixtures/fixture/webhook-tampered/account.json +6 -0
  1156. fincas-0.4.1/golden_erp/addons/fixture_crm/fixtures/fixture/webhook-tampered/case.json +23 -0
  1157. fincas-0.4.1/golden_erp/addons/fixture_crm/fixtures/fixture/webhook-tampered/db.expected.json +9 -0
  1158. fincas-0.4.1/golden_erp/addons/fixture_crm/fixtures/fixture/webhook-tampered/inbound/001.json +23 -0
  1159. fincas-0.4.1/golden_erp/addons/fixture_crm/fixtures/fixture/webhook-tampered/requests.expected.json +1 -0
  1160. fincas-0.4.1/golden_erp/addons/fixture_crm/fixtures/fixture/webhook-valid/account.json +6 -0
  1161. fincas-0.4.1/golden_erp/addons/fixture_crm/fixtures/fixture/webhook-valid/case.json +23 -0
  1162. fincas-0.4.1/golden_erp/addons/fixture_crm/fixtures/fixture/webhook-valid/db.expected.json +50 -0
  1163. fincas-0.4.1/golden_erp/addons/fixture_crm/fixtures/fixture/webhook-valid/inbound/001.json +23 -0
  1164. fincas-0.4.1/golden_erp/addons/fixture_crm/fixtures/fixture/webhook-valid/requests.expected.json +1 -0
  1165. fincas-0.4.1/golden_erp/addons/fixture_crm/fixtures/fixture_oauth/newer-schema/account.json +4 -0
  1166. fincas-0.4.1/golden_erp/addons/fixture_crm/fixtures/fixture_oauth/newer-schema/case.json +21 -0
  1167. fincas-0.4.1/golden_erp/addons/fixture_crm/fixtures/fixture_oauth/newer-schema/db.expected.json +9 -0
  1168. fincas-0.4.1/golden_erp/addons/fixture_crm/fixtures/fixture_oauth/newer-schema/inbound/001.json +16 -0
  1169. fincas-0.4.1/golden_erp/addons/fixture_crm/fixtures/fixture_oauth/newer-schema/requests.expected.json +1 -0
  1170. fincas-0.4.1/golden_erp/addons/fixture_crm/fixtures/fixture_oauth/poll-per-grant/account.json +4 -0
  1171. fincas-0.4.1/golden_erp/addons/fixture_crm/fixtures/fixture_oauth/poll-per-grant/case.json +48 -0
  1172. fincas-0.4.1/golden_erp/addons/fixture_crm/fixtures/fixture_oauth/poll-per-grant/db.expected.json +42 -0
  1173. fincas-0.4.1/golden_erp/addons/fixture_crm/fixtures/fixture_oauth/poll-per-grant/requests.expected.json +14 -0
  1174. fincas-0.4.1/golden_erp/addons/fixture_crm/fixtures/fixture_oauth/poll-per-grant/responses/001-page.json +29 -0
  1175. fincas-0.4.1/golden_erp/addons/fixture_crm/fixtures/fixture_oauth/poll-per-grant/responses/002-empty.json +17 -0
  1176. fincas-0.4.1/golden_erp/addons/fixture_crm/fixtures/fixture_oauth/poll-refreshes-token/account.json +4 -0
  1177. fincas-0.4.1/golden_erp/addons/fixture_crm/fixtures/fixture_oauth/poll-refreshes-token/case.json +52 -0
  1178. fincas-0.4.1/golden_erp/addons/fixture_crm/fixtures/fixture_oauth/poll-refreshes-token/db.expected.json +42 -0
  1179. fincas-0.4.1/golden_erp/addons/fixture_crm/fixtures/fixture_oauth/poll-refreshes-token/requests.expected.json +29 -0
  1180. fincas-0.4.1/golden_erp/addons/fixture_crm/fixtures/fixture_oauth/poll-refreshes-token/responses/001-token.json +13 -0
  1181. fincas-0.4.1/golden_erp/addons/fixture_crm/fixtures/fixture_oauth/poll-refreshes-token/responses/002-page.json +29 -0
  1182. fincas-0.4.1/golden_erp/addons/fixture_crm/fixtures/fixture_oauth/poll-refreshes-token/responses/003-empty.json +17 -0
  1183. fincas-0.4.1/golden_erp/addons/fixture_crm/mapping.py +55 -0
  1184. fincas-0.4.1/golden_erp/addons/fixture_crm/plugin.py +22 -0
  1185. fincas-0.4.1/golden_erp/addons/fixture_crm/tests/__init__.py +0 -0
  1186. fincas-0.4.1/golden_erp/addons/fixture_crm/tests/test_contract.py +33 -0
  1187. fincas-0.4.1/golden_erp/addons/fixture_crm/tests/test_mapping.py +29 -0
  1188. fincas-0.4.1/golden_erp/addons/fixture_crm/values.py +29 -0
  1189. fincas-0.4.1/golden_erp/addons/gmail/__init__.py +10 -0
  1190. fincas-0.4.1/golden_erp/addons/gmail/adapter.py +844 -0
  1191. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/bcc-copy-adds-participant/account.json +4 -0
  1192. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/bcc-copy-adds-participant/case.json +87 -0
  1193. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/bcc-copy-adds-participant/db.expected.json +47 -0
  1194. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/bcc-copy-adds-participant/requests.expected.json +98 -0
  1195. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/bcc-copy-adds-participant/responses/001.json +38 -0
  1196. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/bcc-copy-adds-participant/responses/002.json +17 -0
  1197. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/bcc-copy-adds-participant/responses/003.json +38 -0
  1198. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/bcc-copy-adds-participant/responses/004.json +17 -0
  1199. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/bcc-copy-adds-participant/responses/005.json +38 -0
  1200. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/bcc-copy-adds-participant/responses/006.json +47 -0
  1201. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/bcc-copy-adds-participant/responses/007.json +74 -0
  1202. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/bcc-copy-adds-participant/responses/008.json +51 -0
  1203. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/bcc-copy-adds-participant/responses/009.json +78 -0
  1204. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/erased-sender-skipped/account.json +4 -0
  1205. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/erased-sender-skipped/case.json +69 -0
  1206. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/erased-sender-skipped/db.expected.json +17 -0
  1207. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/erased-sender-skipped/requests.expected.json +38 -0
  1208. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/erased-sender-skipped/responses/001.json +38 -0
  1209. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/erased-sender-skipped/responses/002.json +17 -0
  1210. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/erased-sender-skipped/responses/003.json +38 -0
  1211. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/erased-sender-skipped/responses/004.json +51 -0
  1212. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/excluded-label/account.json +4 -0
  1213. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/excluded-label/case.json +63 -0
  1214. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/excluded-label/db.expected.json +42 -0
  1215. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/excluded-label/requests.expected.json +98 -0
  1216. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/excluded-label/responses/001.json +118 -0
  1217. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/excluded-label/responses/002.json +17 -0
  1218. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/excluded-label/responses/003.json +38 -0
  1219. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/excluded-label/responses/004.json +47 -0
  1220. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/excluded-label/responses/005.json +48 -0
  1221. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/excluded-label/responses/006.json +47 -0
  1222. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/excluded-label/responses/007.json +48 -0
  1223. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/excluded-label/responses/008.json +75 -0
  1224. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/excluded-label/responses/009.json +47 -0
  1225. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/first-sync-lists-recent/account.json +4 -0
  1226. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/first-sync-lists-recent/case.json +57 -0
  1227. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/first-sync-lists-recent/db.expected.json +42 -0
  1228. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/first-sync-lists-recent/requests.expected.json +59 -0
  1229. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/first-sync-lists-recent/responses/001.json +14 -0
  1230. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/first-sync-lists-recent/responses/002.json +21 -0
  1231. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/first-sync-lists-recent/responses/003.json +17 -0
  1232. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/first-sync-lists-recent/responses/004.json +38 -0
  1233. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/first-sync-lists-recent/responses/005.json +47 -0
  1234. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/first-sync-lists-recent/responses/006.json +74 -0
  1235. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/golden-send-bcc-skipped/account.json +4 -0
  1236. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/golden-send-bcc-skipped/case.json +69 -0
  1237. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/golden-send-bcc-skipped/db.expected.json +85 -0
  1238. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/golden-send-bcc-skipped/requests.expected.json +86 -0
  1239. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/golden-send-bcc-skipped/responses/001.json +78 -0
  1240. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/golden-send-bcc-skipped/responses/002.json +17 -0
  1241. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/golden-send-bcc-skipped/responses/003.json +38 -0
  1242. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/golden-send-bcc-skipped/responses/004.json +55 -0
  1243. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/golden-send-bcc-skipped/responses/005.json +51 -0
  1244. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/golden-send-bcc-skipped/responses/006.json +78 -0
  1245. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/golden-send-bcc-skipped/responses/007.json +51 -0
  1246. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/golden-send-bcc-skipped/responses/008.json +78 -0
  1247. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/history-expired-resyncs/account.json +4 -0
  1248. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/history-expired-resyncs/case.json +63 -0
  1249. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/history-expired-resyncs/db.expected.json +42 -0
  1250. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/history-expired-resyncs/requests.expected.json +73 -0
  1251. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/history-expired-resyncs/responses/001.json +21 -0
  1252. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/history-expired-resyncs/responses/002.json +12 -0
  1253. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/history-expired-resyncs/responses/003.json +20 -0
  1254. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/history-expired-resyncs/responses/004.json +17 -0
  1255. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/history-expired-resyncs/responses/005.json +38 -0
  1256. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/history-expired-resyncs/responses/006.json +47 -0
  1257. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/history-expired-resyncs/responses/007.json +74 -0
  1258. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/html-only-body/account.json +4 -0
  1259. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/html-only-body/case.json +63 -0
  1260. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/html-only-body/db.expected.json +42 -0
  1261. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/html-only-body/requests.expected.json +50 -0
  1262. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/html-only-body/responses/001.json +38 -0
  1263. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/html-only-body/responses/002.json +17 -0
  1264. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/html-only-body/responses/003.json +38 -0
  1265. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/html-only-body/responses/004.json +47 -0
  1266. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/html-only-body/responses/005.json +74 -0
  1267. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/inbound-known-contact/account.json +4 -0
  1268. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/inbound-known-contact/case.json +63 -0
  1269. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/inbound-known-contact/db.expected.json +42 -0
  1270. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/inbound-known-contact/requests.expected.json +50 -0
  1271. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/inbound-known-contact/responses/001.json +38 -0
  1272. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/inbound-known-contact/responses/002.json +17 -0
  1273. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/inbound-known-contact/responses/003.json +38 -0
  1274. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/inbound-known-contact/responses/004.json +47 -0
  1275. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/inbound-known-contact/responses/005.json +94 -0
  1276. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/newer-schema/account.json +4 -0
  1277. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/newer-schema/case.json +50 -0
  1278. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/newer-schema/db.expected.json +9 -0
  1279. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/newer-schema/inbound/001.json +90 -0
  1280. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/newer-schema/requests.expected.json +1 -0
  1281. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/oauth-invalid-grant-revokes/account.json +4 -0
  1282. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/oauth-invalid-grant-revokes/case.json +74 -0
  1283. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/oauth-invalid-grant-revokes/db.expected.json +9 -0
  1284. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/oauth-invalid-grant-revokes/requests.expected.json +31 -0
  1285. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/oauth-invalid-grant-revokes/responses/001.json +15 -0
  1286. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/oauth-invalid-grant-revokes/responses/002.json +17 -0
  1287. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/oauth-refresh/account.json +4 -0
  1288. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/oauth-refresh/case.json +64 -0
  1289. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/oauth-refresh/db.expected.json +42 -0
  1290. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/oauth-refresh/requests.expected.json +65 -0
  1291. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/oauth-refresh/responses/001.json +14 -0
  1292. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/oauth-refresh/responses/002.json +38 -0
  1293. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/oauth-refresh/responses/003.json +17 -0
  1294. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/oauth-refresh/responses/004.json +38 -0
  1295. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/oauth-refresh/responses/005.json +47 -0
  1296. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/oauth-refresh/responses/006.json +74 -0
  1297. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/outbound-from-owner/account.json +4 -0
  1298. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/outbound-from-owner/case.json +63 -0
  1299. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/outbound-from-owner/db.expected.json +47 -0
  1300. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/outbound-from-owner/requests.expected.json +50 -0
  1301. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/outbound-from-owner/responses/001.json +38 -0
  1302. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/outbound-from-owner/responses/002.json +17 -0
  1303. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/outbound-from-owner/responses/003.json +38 -0
  1304. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/outbound-from-owner/responses/004.json +59 -0
  1305. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/outbound-from-owner/responses/005.json +86 -0
  1306. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/push-body-not-a-notification/account.json +6 -0
  1307. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/push-body-not-a-notification/case.json +49 -0
  1308. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/push-body-not-a-notification/db.expected.json +9 -0
  1309. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/push-body-not-a-notification/inbound/push.json +95 -0
  1310. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/push-body-not-a-notification/requests.expected.json +1 -0
  1311. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/push-notification-polls/account.json +6 -0
  1312. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/push-notification-polls/case.json +55 -0
  1313. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/push-notification-polls/db.expected.json +57 -0
  1314. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/push-notification-polls/inbound/push.json +18 -0
  1315. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/push-notification-polls/requests.expected.json +58 -0
  1316. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/push-notification-polls/responses/001.json +27 -0
  1317. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/push-notification-polls/responses/002.json +38 -0
  1318. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/push-notification-polls/responses/003.json +17 -0
  1319. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/push-notification-polls/responses/004.json +38 -0
  1320. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/push-notification-polls/responses/005.json +47 -0
  1321. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/push-notification-polls/responses/006.json +74 -0
  1322. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/push-wrong-audience/account.json +6 -0
  1323. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/push-wrong-audience/case.json +49 -0
  1324. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/push-wrong-audience/db.expected.json +9 -0
  1325. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/push-wrong-audience/inbound/push.json +18 -0
  1326. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/push-wrong-audience/requests.expected.json +10 -0
  1327. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/push-wrong-audience/responses/001.json +27 -0
  1328. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/same-message-two-mailboxes/account.json +4 -0
  1329. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/same-message-two-mailboxes/case.json +87 -0
  1330. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/same-message-two-mailboxes/db.expected.json +47 -0
  1331. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/same-message-two-mailboxes/requests.expected.json +86 -0
  1332. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/same-message-two-mailboxes/responses/001.json +38 -0
  1333. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/same-message-two-mailboxes/responses/002.json +17 -0
  1334. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/same-message-two-mailboxes/responses/003.json +38 -0
  1335. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/same-message-two-mailboxes/responses/004.json +17 -0
  1336. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/same-message-two-mailboxes/responses/005.json +38 -0
  1337. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/same-message-two-mailboxes/responses/006.json +51 -0
  1338. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/same-message-two-mailboxes/responses/007.json +78 -0
  1339. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/same-message-two-mailboxes/responses/008.json +47 -0
  1340. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/thread-across-mailboxes/account.json +4 -0
  1341. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/thread-across-mailboxes/case.json +102 -0
  1342. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/thread-across-mailboxes/db.expected.json +131 -0
  1343. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/thread-across-mailboxes/requests.expected.json +134 -0
  1344. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/thread-across-mailboxes/responses/001.json +58 -0
  1345. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/thread-across-mailboxes/responses/002.json +17 -0
  1346. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/thread-across-mailboxes/responses/003.json +58 -0
  1347. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/thread-across-mailboxes/responses/004.json +17 -0
  1348. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/thread-across-mailboxes/responses/005.json +38 -0
  1349. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/thread-across-mailboxes/responses/006.json +47 -0
  1350. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/thread-across-mailboxes/responses/007.json +74 -0
  1351. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/thread-across-mailboxes/responses/008.json +59 -0
  1352. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/thread-across-mailboxes/responses/009.json +86 -0
  1353. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/thread-across-mailboxes/responses/010.json +47 -0
  1354. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/thread-across-mailboxes/responses/011.json +59 -0
  1355. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/thread-across-mailboxes/responses/012.json +86 -0
  1356. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/unknown-only-skipped/account.json +4 -0
  1357. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/unknown-only-skipped/case.json +63 -0
  1358. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/unknown-only-skipped/db.expected.json +9 -0
  1359. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/unknown-only-skipped/requests.expected.json +74 -0
  1360. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/unknown-only-skipped/responses/001.json +98 -0
  1361. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/unknown-only-skipped/responses/002.json +17 -0
  1362. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/unknown-only-skipped/responses/003.json +38 -0
  1363. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/unknown-only-skipped/responses/004.json +47 -0
  1364. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/unknown-only-skipped/responses/005.json +51 -0
  1365. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/unknown-only-skipped/responses/006.json +51 -0
  1366. fincas-0.4.1/golden_erp/addons/gmail/fixtures/gmail/unknown-only-skipped/responses/007.json +51 -0
  1367. fincas-0.4.1/golden_erp/addons/gmail/mapping.py +317 -0
  1368. fincas-0.4.1/golden_erp/addons/gmail/plugin.py +23 -0
  1369. fincas-0.4.1/golden_erp/addons/gmail/pubsub.py +143 -0
  1370. fincas-0.4.1/golden_erp/addons/gmail/tests/__init__.py +0 -0
  1371. fincas-0.4.1/golden_erp/addons/gmail/tests/helpers.py +121 -0
  1372. fincas-0.4.1/golden_erp/addons/gmail/tests/seed.py +92 -0
  1373. fincas-0.4.1/golden_erp/addons/gmail/tests/test_contract.py +30 -0
  1374. fincas-0.4.1/golden_erp/addons/gmail/tests/test_gmail.py +525 -0
  1375. fincas-0.4.1/golden_erp/addons/gmail/tests/test_gmail_pg.py +82 -0
  1376. fincas-0.4.1/golden_erp/addons/gmail/tests/test_mapping.py +101 -0
  1377. fincas-0.4.1/golden_erp/addons/gmail/tests/test_pubsub.py +87 -0
  1378. fincas-0.4.1/golden_erp/addons/gmail/values.py +47 -0
  1379. fincas-0.4.1/golden_erp/addons/google_ads/__init__.py +1 -0
  1380. fincas-0.4.1/golden_erp/addons/google_ads/adapter.py +301 -0
  1381. fincas-0.4.1/golden_erp/addons/google_ads/conversions.py +150 -0
  1382. fincas-0.4.1/golden_erp/addons/google_ads/fixtures/batch-partial-failure/account.json +9 -0
  1383. fincas-0.4.1/golden_erp/addons/google_ads/fixtures/batch-partial-failure/case.json +81 -0
  1384. fincas-0.4.1/golden_erp/addons/google_ads/fixtures/batch-partial-failure/db.expected.json +65 -0
  1385. fincas-0.4.1/golden_erp/addons/google_ads/fixtures/batch-partial-failure/requests.expected.json +66 -0
  1386. fincas-0.4.1/golden_erp/addons/google_ads/fixtures/batch-partial-failure/responses/001.json +16 -0
  1387. fincas-0.4.1/golden_erp/addons/google_ads/fixtures/batch-partial-failure/responses/002.json +56 -0
  1388. fincas-0.4.1/golden_erp/addons/google_ads/fixtures/click-too-old/account.json +10 -0
  1389. fincas-0.4.1/golden_erp/addons/google_ads/fixtures/click-too-old/case.json +37 -0
  1390. fincas-0.4.1/golden_erp/addons/google_ads/fixtures/click-too-old/db.expected.json +25 -0
  1391. fincas-0.4.1/golden_erp/addons/google_ads/fixtures/click-too-old/requests.expected.json +1 -0
  1392. fincas-0.4.1/golden_erp/addons/google_ads/fixtures/consent-override/account.json +10 -0
  1393. fincas-0.4.1/golden_erp/addons/google_ads/fixtures/consent-override/case.json +37 -0
  1394. fincas-0.4.1/golden_erp/addons/google_ads/fixtures/consent-override/db.expected.json +37 -0
  1395. fincas-0.4.1/golden_erp/addons/google_ads/fixtures/consent-override/requests.expected.json +44 -0
  1396. fincas-0.4.1/golden_erp/addons/google_ads/fixtures/consent-override/responses/001.json +16 -0
  1397. fincas-0.4.1/golden_erp/addons/google_ads/fixtures/consent-override/responses/002.json +16 -0
  1398. fincas-0.4.1/golden_erp/addons/google_ads/fixtures/erased-party/account.json +9 -0
  1399. fincas-0.4.1/golden_erp/addons/google_ads/fixtures/erased-party/case.json +38 -0
  1400. fincas-0.4.1/golden_erp/addons/google_ads/fixtures/erased-party/db.expected.json +25 -0
  1401. fincas-0.4.1/golden_erp/addons/google_ads/fixtures/erased-party/requests.expected.json +1 -0
  1402. fincas-0.4.1/golden_erp/addons/google_ads/fixtures/landing-url-click-parse/account.json +9 -0
  1403. fincas-0.4.1/golden_erp/addons/google_ads/fixtures/landing-url-click-parse/case.json +20 -0
  1404. fincas-0.4.1/golden_erp/addons/google_ads/fixtures/landing-url-click-parse/db.expected.json +17 -0
  1405. fincas-0.4.1/golden_erp/addons/google_ads/fixtures/landing-url-click-parse/inbound/001.json +20 -0
  1406. fincas-0.4.1/golden_erp/addons/google_ads/fixtures/landing-url-click-parse/requests.expected.json +1 -0
  1407. fincas-0.4.1/golden_erp/addons/google_ads/fixtures/newer-schema/account.json +9 -0
  1408. fincas-0.4.1/golden_erp/addons/google_ads/fixtures/newer-schema/case.json +22 -0
  1409. fincas-0.4.1/golden_erp/addons/google_ads/fixtures/newer-schema/db.expected.json +9 -0
  1410. fincas-0.4.1/golden_erp/addons/google_ads/fixtures/newer-schema/inbound/001.json +7 -0
  1411. fincas-0.4.1/golden_erp/addons/google_ads/fixtures/newer-schema/requests.expected.json +1 -0
  1412. fincas-0.4.1/golden_erp/addons/google_ads/fixtures/null-amount-no-value/account.json +9 -0
  1413. fincas-0.4.1/golden_erp/addons/google_ads/fixtures/null-amount-no-value/case.json +37 -0
  1414. fincas-0.4.1/golden_erp/addons/google_ads/fixtures/null-amount-no-value/db.expected.json +38 -0
  1415. fincas-0.4.1/golden_erp/addons/google_ads/fixtures/null-amount-no-value/requests.expected.json +43 -0
  1416. fincas-0.4.1/golden_erp/addons/google_ads/fixtures/null-amount-no-value/responses/001.json +16 -0
  1417. fincas-0.4.1/golden_erp/addons/google_ads/fixtures/null-amount-no-value/responses/002.json +16 -0
  1418. fincas-0.4.1/golden_erp/addons/google_ads/fixtures/pipeline-unmapped/account.json +9 -0
  1419. fincas-0.4.1/golden_erp/addons/google_ads/fixtures/pipeline-unmapped/case.json +37 -0
  1420. fincas-0.4.1/golden_erp/addons/google_ads/fixtures/pipeline-unmapped/db.expected.json +25 -0
  1421. fincas-0.4.1/golden_erp/addons/google_ads/fixtures/pipeline-unmapped/requests.expected.json +1 -0
  1422. fincas-0.4.1/golden_erp/addons/google_ads/fixtures/reopen-retracts/account.json +9 -0
  1423. fincas-0.4.1/golden_erp/addons/google_ads/fixtures/reopen-retracts/case.json +40 -0
  1424. fincas-0.4.1/golden_erp/addons/google_ads/fixtures/reopen-retracts/db.expected.json +45 -0
  1425. fincas-0.4.1/golden_erp/addons/google_ads/fixtures/reopen-retracts/requests.expected.json +39 -0
  1426. fincas-0.4.1/golden_erp/addons/google_ads/fixtures/reopen-retracts/responses/001.json +16 -0
  1427. fincas-0.4.1/golden_erp/addons/google_ads/fixtures/reopen-retracts/responses/002.json +16 -0
  1428. fincas-0.4.1/golden_erp/addons/google_ads/fixtures/replay-idempotent/account.json +9 -0
  1429. fincas-0.4.1/golden_erp/addons/google_ads/fixtures/replay-idempotent/case.json +38 -0
  1430. fincas-0.4.1/golden_erp/addons/google_ads/fixtures/replay-idempotent/db.expected.json +37 -0
  1431. fincas-0.4.1/golden_erp/addons/google_ads/fixtures/replay-idempotent/requests.expected.json +1 -0
  1432. fincas-0.4.1/golden_erp/addons/google_ads/fixtures/rewin-needs-review/account.json +9 -0
  1433. fincas-0.4.1/golden_erp/addons/google_ads/fixtures/rewin-needs-review/case.json +43 -0
  1434. fincas-0.4.1/golden_erp/addons/google_ads/fixtures/rewin-needs-review/db.expected.json +52 -0
  1435. fincas-0.4.1/golden_erp/addons/google_ads/fixtures/rewin-needs-review/requests.expected.json +1 -0
  1436. fincas-0.4.1/golden_erp/addons/google_ads/fixtures/touchpoint-post-unknown-email/account.json +9 -0
  1437. fincas-0.4.1/golden_erp/addons/google_ads/fixtures/touchpoint-post-unknown-email/case.json +20 -0
  1438. fincas-0.4.1/golden_erp/addons/google_ads/fixtures/touchpoint-post-unknown-email/db.expected.json +24 -0
  1439. fincas-0.4.1/golden_erp/addons/google_ads/fixtures/touchpoint-post-unknown-email/inbound/001.json +21 -0
  1440. fincas-0.4.1/golden_erp/addons/google_ads/fixtures/touchpoint-post-unknown-email/requests.expected.json +1 -0
  1441. fincas-0.4.1/golden_erp/addons/google_ads/fixtures/two-currencies/account.json +9 -0
  1442. fincas-0.4.1/golden_erp/addons/google_ads/fixtures/two-currencies/case.json +59 -0
  1443. fincas-0.4.1/golden_erp/addons/google_ads/fixtures/two-currencies/db.expected.json +62 -0
  1444. fincas-0.4.1/golden_erp/addons/google_ads/fixtures/two-currencies/requests.expected.json +55 -0
  1445. fincas-0.4.1/golden_erp/addons/google_ads/fixtures/two-currencies/responses/001.json +16 -0
  1446. fincas-0.4.1/golden_erp/addons/google_ads/fixtures/two-currencies/responses/002.json +17 -0
  1447. fincas-0.4.1/golden_erp/addons/google_ads/fixtures/won-no-click/account.json +9 -0
  1448. fincas-0.4.1/golden_erp/addons/google_ads/fixtures/won-no-click/case.json +58 -0
  1449. fincas-0.4.1/golden_erp/addons/google_ads/fixtures/won-no-click/db.expected.json +39 -0
  1450. fincas-0.4.1/golden_erp/addons/google_ads/fixtures/won-no-click/requests.expected.json +1 -0
  1451. fincas-0.4.1/golden_erp/addons/google_ads/fixtures/won-with-gbraid/account.json +9 -0
  1452. fincas-0.4.1/golden_erp/addons/google_ads/fixtures/won-with-gbraid/case.json +41 -0
  1453. fincas-0.4.1/golden_erp/addons/google_ads/fixtures/won-with-gbraid/db.expected.json +44 -0
  1454. fincas-0.4.1/golden_erp/addons/google_ads/fixtures/won-with-gbraid/requests.expected.json +44 -0
  1455. fincas-0.4.1/golden_erp/addons/google_ads/fixtures/won-with-gbraid/responses/001.json +16 -0
  1456. fincas-0.4.1/golden_erp/addons/google_ads/fixtures/won-with-gbraid/responses/002.json +16 -0
  1457. fincas-0.4.1/golden_erp/addons/google_ads/fixtures/won-with-gclid/account.json +9 -0
  1458. fincas-0.4.1/golden_erp/addons/google_ads/fixtures/won-with-gclid/case.json +37 -0
  1459. fincas-0.4.1/golden_erp/addons/google_ads/fixtures/won-with-gclid/db.expected.json +37 -0
  1460. fincas-0.4.1/golden_erp/addons/google_ads/fixtures/won-with-gclid/requests.expected.json +44 -0
  1461. fincas-0.4.1/golden_erp/addons/google_ads/fixtures/won-with-gclid/responses/001.json +16 -0
  1462. fincas-0.4.1/golden_erp/addons/google_ads/fixtures/won-with-gclid/responses/002.json +16 -0
  1463. fincas-0.4.1/golden_erp/addons/google_ads/mapping.py +140 -0
  1464. fincas-0.4.1/golden_erp/addons/google_ads/plugin.py +41 -0
  1465. fincas-0.4.1/golden_erp/addons/google_ads/tests/__init__.py +0 -0
  1466. fincas-0.4.1/golden_erp/addons/google_ads/tests/test_adapter.py +343 -0
  1467. fincas-0.4.1/golden_erp/addons/google_ads/tests/test_contract.py +101 -0
  1468. fincas-0.4.1/golden_erp/addons/google_ads/tests/test_conversions.py +60 -0
  1469. fincas-0.4.1/golden_erp/addons/google_ads/tests/test_mapping.py +87 -0
  1470. fincas-0.4.1/golden_erp/addons/google_ads/values.py +79 -0
  1471. fincas-0.4.1/golden_erp/addons/hubspot_export/__init__.py +4 -0
  1472. fincas-0.4.1/golden_erp/addons/hubspot_export/adapter.py +163 -0
  1473. fincas-0.4.1/golden_erp/addons/hubspot_export/convert.py +750 -0
  1474. fincas-0.4.1/golden_erp/addons/hubspot_export/fixtures/cases/archived-forbidden/case.json +15 -0
  1475. fincas-0.4.1/golden_erp/addons/hubspot_export/fixtures/cases/archived-forbidden/expected/manifest.expected.json +117 -0
  1476. fincas-0.4.1/golden_erp/addons/hubspot_export/fixtures/cases/archived-forbidden/overlay/crawl/errors.json +16 -0
  1477. fincas-0.4.1/golden_erp/addons/hubspot_export/fixtures/cases/archived-not-enumerated/case.json +12 -0
  1478. fincas-0.4.1/golden_erp/addons/hubspot_export/fixtures/cases/archived-not-enumerated/expected/manifest.expected.json +111 -0
  1479. fincas-0.4.1/golden_erp/addons/hubspot_export/fixtures/cases/association-paged/case.json +9 -0
  1480. fincas-0.4.1/golden_erp/addons/hubspot_export/fixtures/cases/association-paged/expected/manifest.expected.json +111 -0
  1481. fincas-0.4.1/golden_erp/addons/hubspot_export/fixtures/cases/association-paged/overlay/crawl/tickets/page-0001.json +95 -0
  1482. fincas-0.4.1/golden_erp/addons/hubspot_export/fixtures/cases/body-truncated/case.json +9 -0
  1483. fincas-0.4.1/golden_erp/addons/hubspot_export/fixtures/cases/body-truncated/expected/manifest.expected.json +111 -0
  1484. fincas-0.4.1/golden_erp/addons/hubspot_export/fixtures/cases/body-truncated/overlay/crawl/notes/page-0001.json +82 -0
  1485. fincas-0.4.1/golden_erp/addons/hubspot_export/fixtures/cases/count-mismatch/case.json +9 -0
  1486. fincas-0.4.1/golden_erp/addons/hubspot_export/fixtures/cases/count-mismatch/expected/manifest.expected.json +111 -0
  1487. fincas-0.4.1/golden_erp/addons/hubspot_export/fixtures/cases/count-mismatch/overlay/crawl/companies/count.json +21 -0
  1488. fincas-0.4.1/golden_erp/addons/hubspot_export/fixtures/cases/crawl-failed/case.json +5 -0
  1489. fincas-0.4.1/golden_erp/addons/hubspot_export/fixtures/cases/crawl-failed/overlay/crawl/errors.json +13 -0
  1490. fincas-0.4.1/golden_erp/addons/hubspot_export/fixtures/cases/export-no-time-zone/case.json +8 -0
  1491. fincas-0.4.1/golden_erp/addons/hubspot_export/fixtures/cases/export-truncated/case.json +12 -0
  1492. fincas-0.4.1/golden_erp/addons/hubspot_export/fixtures/cases/export-truncated/expected/manifest.expected.json +156 -0
  1493. fincas-0.4.1/golden_erp/addons/hubspot_export/fixtures/cases/export-truncated/overlay/export/deals.csv +4 -0
  1494. fincas-0.4.1/golden_erp/addons/hubspot_export/fixtures/cases/file-absent/case.json +12 -0
  1495. fincas-0.4.1/golden_erp/addons/hubspot_export/fixtures/cases/file-absent/expected/manifest.expected.json +111 -0
  1496. fincas-0.4.1/golden_erp/addons/hubspot_export/fixtures/cases/forbidden/case.json +12 -0
  1497. fincas-0.4.1/golden_erp/addons/hubspot_export/fixtures/cases/forbidden/expected/manifest.expected.json +109 -0
  1498. fincas-0.4.1/golden_erp/addons/hubspot_export/fixtures/cases/forbidden/overlay/crawl/errors.json +17 -0
  1499. fincas-0.4.1/golden_erp/addons/hubspot_export/fixtures/cases/history-absent/case.json +11 -0
  1500. fincas-0.4.1/golden_erp/addons/hubspot_export/fixtures/cases/history-absent/expected/manifest.expected.json +101 -0
  1501. fincas-0.4.1/golden_erp/addons/hubspot_export/fixtures/cases/mixed/case.json +15 -0
  1502. fincas-0.4.1/golden_erp/addons/hubspot_export/fixtures/cases/mixed/expected/manifest.expected.json +111 -0
  1503. fincas-0.4.1/golden_erp/addons/hubspot_export/fixtures/cases/mixed/overlay/export/export.json +7 -0
  1504. fincas-0.4.1/golden_erp/addons/hubspot_export/fixtures/cases/mixed/overlay/export/tasks.csv +3 -0
  1505. fincas-0.4.1/golden_erp/addons/hubspot_export/fixtures/cases/newer-schema/case.json +5 -0
  1506. fincas-0.4.1/golden_erp/addons/hubspot_export/fixtures/cases/newer-schema/overlay/crawl/contacts/page-0001.json +107 -0
  1507. fincas-0.4.1/golden_erp/addons/hubspot_export/fixtures/cases/page-missing/case.json +12 -0
  1508. fincas-0.4.1/golden_erp/addons/hubspot_export/fixtures/cases/page-missing/expected/manifest.expected.json +111 -0
  1509. fincas-0.4.1/golden_erp/addons/hubspot_export/fixtures/cases/pair-forbidden/case.json +12 -0
  1510. fincas-0.4.1/golden_erp/addons/hubspot_export/fixtures/cases/pair-forbidden/expected/manifest.expected.json +111 -0
  1511. fincas-0.4.1/golden_erp/addons/hubspot_export/fixtures/cases/pair-forbidden/overlay/crawl/errors.json +13 -0
  1512. fincas-0.4.1/golden_erp/addons/hubspot_export/fixtures/cases/pair-not-exported/case.json +12 -0
  1513. fincas-0.4.1/golden_erp/addons/hubspot_export/fixtures/cases/pair-not-exported/expected/manifest.expected.json +111 -0
  1514. fincas-0.4.1/golden_erp/addons/hubspot_export/fixtures/cases/search-capped/case.json +12 -0
  1515. fincas-0.4.1/golden_erp/addons/hubspot_export/fixtures/cases/search-capped/expected/manifest.expected.json +117 -0
  1516. fincas-0.4.1/golden_erp/addons/hubspot_export/fixtures/cases/search-capped/overlay/crawl/contacts/page-0001.json +115 -0
  1517. fincas-0.4.1/golden_erp/addons/hubspot_export/fixtures/cases/search-capped/overlay/crawl/contacts/page-0002.json +73 -0
  1518. fincas-0.4.1/golden_erp/addons/hubspot_export/fixtures/cases/unknown-owner/case.json +9 -0
  1519. fincas-0.4.1/golden_erp/addons/hubspot_export/fixtures/cases/unknown-owner/expected/manifest.expected.json +111 -0
  1520. fincas-0.4.1/golden_erp/addons/hubspot_export/fixtures/cases/unknown-owner/overlay/crawl/deals/page-0002.json +81 -0
  1521. fincas-0.4.1/golden_erp/addons/hubspot_export/fixtures/crawl-small/crawl/associations/contacts-companies/page-0001.json +144 -0
  1522. fincas-0.4.1/golden_erp/addons/hubspot_export/fixtures/crawl-small/crawl/associations/deals-contacts/page-0001.json +143 -0
  1523. fincas-0.4.1/golden_erp/addons/hubspot_export/fixtures/crawl-small/crawl/calls/archived/page-0001.json +16 -0
  1524. fincas-0.4.1/golden_erp/addons/hubspot_export/fixtures/crawl-small/crawl/calls/page-0001.json +78 -0
  1525. fincas-0.4.1/golden_erp/addons/hubspot_export/fixtures/crawl-small/crawl/companies/archived/page-0001.json +31 -0
  1526. fincas-0.4.1/golden_erp/addons/hubspot_export/fixtures/crawl-small/crawl/companies/count.json +21 -0
  1527. fincas-0.4.1/golden_erp/addons/hubspot_export/fixtures/crawl-small/crawl/companies/page-0001.json +84 -0
  1528. fincas-0.4.1/golden_erp/addons/hubspot_export/fixtures/crawl-small/crawl/contacts/archived/page-0001.json +32 -0
  1529. fincas-0.4.1/golden_erp/addons/hubspot_export/fixtures/crawl-small/crawl/contacts/page-0001.json +107 -0
  1530. fincas-0.4.1/golden_erp/addons/hubspot_export/fixtures/crawl-small/crawl/contacts/page-0002.json +66 -0
  1531. fincas-0.4.1/golden_erp/addons/hubspot_export/fixtures/crawl-small/crawl/deals/archived/page-0001.json +34 -0
  1532. fincas-0.4.1/golden_erp/addons/hubspot_export/fixtures/crawl-small/crawl/deals/page-0001.json +127 -0
  1533. fincas-0.4.1/golden_erp/addons/hubspot_export/fixtures/crawl-small/crawl/deals/page-0002.json +81 -0
  1534. fincas-0.4.1/golden_erp/addons/hubspot_export/fixtures/crawl-small/crawl/emails/archived/page-0001.json +16 -0
  1535. fincas-0.4.1/golden_erp/addons/hubspot_export/fixtures/crawl-small/crawl/emails/page-0001.json +89 -0
  1536. fincas-0.4.1/golden_erp/addons/hubspot_export/fixtures/crawl-small/crawl/errors.json +7 -0
  1537. fincas-0.4.1/golden_erp/addons/hubspot_export/fixtures/crawl-small/crawl/history/contacts/page-0001.json +105 -0
  1538. fincas-0.4.1/golden_erp/addons/hubspot_export/fixtures/crawl-small/crawl/history/deals/page-0001.json +151 -0
  1539. fincas-0.4.1/golden_erp/addons/hubspot_export/fixtures/crawl-small/crawl/meetings/archived/page-0001.json +16 -0
  1540. fincas-0.4.1/golden_erp/addons/hubspot_export/fixtures/crawl-small/crawl/meetings/page-0001.json +79 -0
  1541. fincas-0.4.1/golden_erp/addons/hubspot_export/fixtures/crawl-small/crawl/notes/archived/page-0001.json +16 -0
  1542. fincas-0.4.1/golden_erp/addons/hubspot_export/fixtures/crawl-small/crawl/notes/page-0001.json +81 -0
  1543. fincas-0.4.1/golden_erp/addons/hubspot_export/fixtures/crawl-small/crawl/owners-archived.json +34 -0
  1544. fincas-0.4.1/golden_erp/addons/hubspot_export/fixtures/crawl-small/crawl/owners.json +66 -0
  1545. fincas-0.4.1/golden_erp/addons/hubspot_export/fixtures/crawl-small/crawl/pipelines-deals.json +130 -0
  1546. fincas-0.4.1/golden_erp/addons/hubspot_export/fixtures/crawl-small/crawl/pipelines-tickets.json +68 -0
  1547. fincas-0.4.1/golden_erp/addons/hubspot_export/fixtures/crawl-small/crawl/properties-calls.json +170 -0
  1548. fincas-0.4.1/golden_erp/addons/hubspot_export/fixtures/crawl-small/crawl/properties-companies.json +193 -0
  1549. fincas-0.4.1/golden_erp/addons/hubspot_export/fixtures/crawl-small/crawl/properties-contacts.json +335 -0
  1550. fincas-0.4.1/golden_erp/addons/hubspot_export/fixtures/crawl-small/crawl/properties-deals.json +298 -0
  1551. fincas-0.4.1/golden_erp/addons/hubspot_export/fixtures/crawl-small/crawl/properties-emails.json +150 -0
  1552. fincas-0.4.1/golden_erp/addons/hubspot_export/fixtures/crawl-small/crawl/properties-meetings.json +143 -0
  1553. fincas-0.4.1/golden_erp/addons/hubspot_export/fixtures/crawl-small/crawl/properties-notes.json +107 -0
  1554. fincas-0.4.1/golden_erp/addons/hubspot_export/fixtures/crawl-small/crawl/properties-tasks.json +199 -0
  1555. fincas-0.4.1/golden_erp/addons/hubspot_export/fixtures/crawl-small/crawl/properties-tickets.json +159 -0
  1556. fincas-0.4.1/golden_erp/addons/hubspot_export/fixtures/crawl-small/crawl/recording.json +16 -0
  1557. fincas-0.4.1/golden_erp/addons/hubspot_export/fixtures/crawl-small/crawl/subscriptions/page-0001.json +77 -0
  1558. fincas-0.4.1/golden_erp/addons/hubspot_export/fixtures/crawl-small/crawl/tasks/archived/page-0001.json +16 -0
  1559. fincas-0.4.1/golden_erp/addons/hubspot_export/fixtures/crawl-small/crawl/tasks/page-0001.json +141 -0
  1560. fincas-0.4.1/golden_erp/addons/hubspot_export/fixtures/crawl-small/crawl/tickets/archived/page-0001.json +16 -0
  1561. fincas-0.4.1/golden_erp/addons/hubspot_export/fixtures/crawl-small/crawl/tickets/page-0001.json +89 -0
  1562. fincas-0.4.1/golden_erp/addons/hubspot_export/fixtures/crawl-small/expected/associations.expected.jsonl +19 -0
  1563. fincas-0.4.1/golden_erp/addons/hubspot_export/fixtures/crawl-small/expected/communications.expected.jsonl +8 -0
  1564. fincas-0.4.1/golden_erp/addons/hubspot_export/fixtures/crawl-small/expected/companies.expected.jsonl +5 -0
  1565. fincas-0.4.1/golden_erp/addons/hubspot_export/fixtures/crawl-small/expected/consent.expected.jsonl +5 -0
  1566. fincas-0.4.1/golden_erp/addons/hubspot_export/fixtures/crawl-small/expected/contacts.expected.jsonl +8 -0
  1567. fincas-0.4.1/golden_erp/addons/hubspot_export/fixtures/crawl-small/expected/deals.expected.jsonl +7 -0
  1568. fincas-0.4.1/golden_erp/addons/hubspot_export/fixtures/crawl-small/expected/import-report.expected.json +717 -0
  1569. fincas-0.4.1/golden_erp/addons/hubspot_export/fixtures/crawl-small/expected/manifest.expected.json +105 -0
  1570. fincas-0.4.1/golden_erp/addons/hubspot_export/fixtures/crawl-small/expected/owners.expected.jsonl +4 -0
  1571. fincas-0.4.1/golden_erp/addons/hubspot_export/fixtures/crawl-small/expected/pipelines.expected.jsonl +3 -0
  1572. fincas-0.4.1/golden_erp/addons/hubspot_export/fixtures/crawl-small/expected/property_defs.expected.jsonl +107 -0
  1573. fincas-0.4.1/golden_erp/addons/hubspot_export/fixtures/crawl-small/expected/relationships.expected.jsonl +2 -0
  1574. fincas-0.4.1/golden_erp/addons/hubspot_export/fixtures/crawl-small/expected/tasks.expected.jsonl +4 -0
  1575. fincas-0.4.1/golden_erp/addons/hubspot_export/fixtures/crawl-small/mapping.toml +42 -0
  1576. fincas-0.4.1/golden_erp/addons/hubspot_export/fixtures/export-csv/expected/associations.expected.jsonl +9 -0
  1577. fincas-0.4.1/golden_erp/addons/hubspot_export/fixtures/export-csv/expected/companies.expected.jsonl +2 -0
  1578. fincas-0.4.1/golden_erp/addons/hubspot_export/fixtures/export-csv/expected/consent.expected.jsonl +1 -0
  1579. fincas-0.4.1/golden_erp/addons/hubspot_export/fixtures/export-csv/expected/contacts.expected.jsonl +3 -0
  1580. fincas-0.4.1/golden_erp/addons/hubspot_export/fixtures/export-csv/expected/deals.expected.jsonl +3 -0
  1581. fincas-0.4.1/golden_erp/addons/hubspot_export/fixtures/export-csv/expected/manifest.expected.json +152 -0
  1582. fincas-0.4.1/golden_erp/addons/hubspot_export/fixtures/export-csv/expected/owners.expected.jsonl +4 -0
  1583. fincas-0.4.1/golden_erp/addons/hubspot_export/fixtures/export-csv/expected/pipelines.expected.jsonl +3 -0
  1584. fincas-0.4.1/golden_erp/addons/hubspot_export/fixtures/export-csv/expected/property_defs.expected.jsonl +79 -0
  1585. fincas-0.4.1/golden_erp/addons/hubspot_export/fixtures/export-csv/expected/relationships.expected.jsonl +1 -0
  1586. fincas-0.4.1/golden_erp/addons/hubspot_export/fixtures/export-csv/expected/tasks.expected.jsonl +2 -0
  1587. fincas-0.4.1/golden_erp/addons/hubspot_export/fixtures/export-csv/export/companies.csv +3 -0
  1588. fincas-0.4.1/golden_erp/addons/hubspot_export/fixtures/export-csv/export/contacts.csv +4 -0
  1589. fincas-0.4.1/golden_erp/addons/hubspot_export/fixtures/export-csv/export/deals.csv +4 -0
  1590. fincas-0.4.1/golden_erp/addons/hubspot_export/fixtures/export-csv/export/export.json +15 -0
  1591. fincas-0.4.1/golden_erp/addons/hubspot_export/fixtures/export-csv/export/owners-archived.json +33 -0
  1592. fincas-0.4.1/golden_erp/addons/hubspot_export/fixtures/export-csv/export/owners.json +64 -0
  1593. fincas-0.4.1/golden_erp/addons/hubspot_export/fixtures/export-csv/export/pipelines-deals.json +130 -0
  1594. fincas-0.4.1/golden_erp/addons/hubspot_export/fixtures/export-csv/export/pipelines-tickets.json +68 -0
  1595. fincas-0.4.1/golden_erp/addons/hubspot_export/fixtures/export-csv/export/properties-companies.json +193 -0
  1596. fincas-0.4.1/golden_erp/addons/hubspot_export/fixtures/export-csv/export/properties-contacts.json +335 -0
  1597. fincas-0.4.1/golden_erp/addons/hubspot_export/fixtures/export-csv/export/properties-deals.json +298 -0
  1598. fincas-0.4.1/golden_erp/addons/hubspot_export/fixtures/export-csv/export/properties-tasks.json +199 -0
  1599. fincas-0.4.1/golden_erp/addons/hubspot_export/fixtures/export-csv/export/properties-tickets.json +159 -0
  1600. fincas-0.4.1/golden_erp/addons/hubspot_export/fixtures/export-csv/export/tasks.csv +3 -0
  1601. fincas-0.4.1/golden_erp/addons/hubspot_export/fixtures/export-csv/export/tickets.csv +2 -0
  1602. fincas-0.4.1/golden_erp/addons/hubspot_export/fixtures/export-csv/mapping.toml +5 -0
  1603. fincas-0.4.1/golden_erp/addons/hubspot_export/mapping.py +230 -0
  1604. fincas-0.4.1/golden_erp/addons/hubspot_export/model.py +138 -0
  1605. fincas-0.4.1/golden_erp/addons/hubspot_export/plugin.py +27 -0
  1606. fincas-0.4.1/golden_erp/addons/hubspot_export/reader_crawl.py +346 -0
  1607. fincas-0.4.1/golden_erp/addons/hubspot_export/reader_csv.py +334 -0
  1608. fincas-0.4.1/golden_erp/addons/hubspot_export/recording.py +243 -0
  1609. fincas-0.4.1/golden_erp/addons/hubspot_export/tests/__init__.py +0 -0
  1610. fincas-0.4.1/golden_erp/addons/hubspot_export/tests/helpers.py +77 -0
  1611. fincas-0.4.1/golden_erp/addons/hubspot_export/tests/test_adapter.py +661 -0
  1612. fincas-0.4.1/golden_erp/addons/hubspot_export/values.py +219 -0
  1613. fincas-0.4.1/golden_erp/addons/klaviyo/__init__.py +12 -0
  1614. fincas-0.4.1/golden_erp/addons/klaviyo/adapter.py +816 -0
  1615. fincas-0.4.1/golden_erp/addons/klaviyo/fixtures/erase/account.json +6 -0
  1616. fincas-0.4.1/golden_erp/addons/klaviyo/fixtures/erase/case.json +33 -0
  1617. fincas-0.4.1/golden_erp/addons/klaviyo/fixtures/erase/db.expected.json +17 -0
  1618. fincas-0.4.1/golden_erp/addons/klaviyo/fixtures/erase/requests.expected.json +27 -0
  1619. fincas-0.4.1/golden_erp/addons/klaviyo/fixtures/erase/responses/001.json +12 -0
  1620. fincas-0.4.1/golden_erp/addons/klaviyo/fixtures/erased-profile-skipped/account.json +6 -0
  1621. fincas-0.4.1/golden_erp/addons/klaviyo/fixtures/erased-profile-skipped/case.json +31 -0
  1622. fincas-0.4.1/golden_erp/addons/klaviyo/fixtures/erased-profile-skipped/db.expected.json +20 -0
  1623. fincas-0.4.1/golden_erp/addons/klaviyo/fixtures/erased-profile-skipped/inbound/001-event.json +29 -0
  1624. fincas-0.4.1/golden_erp/addons/klaviyo/fixtures/erased-profile-skipped/requests.expected.json +1 -0
  1625. fincas-0.4.1/golden_erp/addons/klaviyo/fixtures/events-received-opened/account.json +7 -0
  1626. fincas-0.4.1/golden_erp/addons/klaviyo/fixtures/events-received-opened/case.json +60 -0
  1627. fincas-0.4.1/golden_erp/addons/klaviyo/fixtures/events-received-opened/db.expected.json +66 -0
  1628. fincas-0.4.1/golden_erp/addons/klaviyo/fixtures/events-received-opened/requests.expected.json +19 -0
  1629. fincas-0.4.1/golden_erp/addons/klaviyo/fixtures/events-received-opened/responses/001.json +99 -0
  1630. fincas-0.4.1/golden_erp/addons/klaviyo/fixtures/events-received-opened/responses/002.json +73 -0
  1631. fincas-0.4.1/golden_erp/addons/klaviyo/fixtures/existing-profile-opt-out-pulled/account.json +6 -0
  1632. fincas-0.4.1/golden_erp/addons/klaviyo/fixtures/existing-profile-opt-out-pulled/case.json +38 -0
  1633. fincas-0.4.1/golden_erp/addons/klaviyo/fixtures/existing-profile-opt-out-pulled/db.expected.json +64 -0
  1634. fincas-0.4.1/golden_erp/addons/klaviyo/fixtures/existing-profile-opt-out-pulled/requests.expected.json +39 -0
  1635. fincas-0.4.1/golden_erp/addons/klaviyo/fixtures/existing-profile-opt-out-pulled/responses/001.json +17 -0
  1636. fincas-0.4.1/golden_erp/addons/klaviyo/fixtures/existing-profile-opt-out-pulled/responses/002.json +32 -0
  1637. fincas-0.4.1/golden_erp/addons/klaviyo/fixtures/hard-bounce-pulled/account.json +6 -0
  1638. fincas-0.4.1/golden_erp/addons/klaviyo/fixtures/hard-bounce-pulled/case.json +40 -0
  1639. fincas-0.4.1/golden_erp/addons/klaviyo/fixtures/hard-bounce-pulled/db.expected.json +47 -0
  1640. fincas-0.4.1/golden_erp/addons/klaviyo/fixtures/hard-bounce-pulled/inbound/001-event.json +31 -0
  1641. fincas-0.4.1/golden_erp/addons/klaviyo/fixtures/hard-bounce-pulled/requests.expected.json +1 -0
  1642. fincas-0.4.1/golden_erp/addons/klaviyo/fixtures/newer-schema-refused/account.json +6 -0
  1643. fincas-0.4.1/golden_erp/addons/klaviyo/fixtures/newer-schema-refused/case.json +21 -0
  1644. fincas-0.4.1/golden_erp/addons/klaviyo/fixtures/newer-schema-refused/db.expected.json +9 -0
  1645. fincas-0.4.1/golden_erp/addons/klaviyo/fixtures/newer-schema-refused/inbound/001-event.json +29 -0
  1646. fincas-0.4.1/golden_erp/addons/klaviyo/fixtures/newer-schema-refused/requests.expected.json +1 -0
  1647. fincas-0.4.1/golden_erp/addons/klaviyo/fixtures/profile-granted/account.json +6 -0
  1648. fincas-0.4.1/golden_erp/addons/klaviyo/fixtures/profile-granted/case.json +38 -0
  1649. fincas-0.4.1/golden_erp/addons/klaviyo/fixtures/profile-granted/db.expected.json +40 -0
  1650. fincas-0.4.1/golden_erp/addons/klaviyo/fixtures/profile-granted/requests.expected.json +73 -0
  1651. fincas-0.4.1/golden_erp/addons/klaviyo/fixtures/profile-granted/responses/001.json +17 -0
  1652. fincas-0.4.1/golden_erp/addons/klaviyo/fixtures/profile-granted/responses/002.json +12 -0
  1653. fincas-0.4.1/golden_erp/addons/klaviyo/fixtures/profile-no-consent-not-sent/account.json +6 -0
  1654. fincas-0.4.1/golden_erp/addons/klaviyo/fixtures/profile-no-consent-not-sent/case.json +57 -0
  1655. fincas-0.4.1/golden_erp/addons/klaviyo/fixtures/profile-no-consent-not-sent/db.expected.json +41 -0
  1656. fincas-0.4.1/golden_erp/addons/klaviyo/fixtures/profile-no-consent-not-sent/requests.expected.json +1 -0
  1657. fincas-0.4.1/golden_erp/addons/klaviyo/fixtures/profile-withdrawn-unsubscribes/account.json +6 -0
  1658. fincas-0.4.1/golden_erp/addons/klaviyo/fixtures/profile-withdrawn-unsubscribes/case.json +52 -0
  1659. fincas-0.4.1/golden_erp/addons/klaviyo/fixtures/profile-withdrawn-unsubscribes/db.expected.json +47 -0
  1660. fincas-0.4.1/golden_erp/addons/klaviyo/fixtures/profile-withdrawn-unsubscribes/requests.expected.json +32 -0
  1661. fincas-0.4.1/golden_erp/addons/klaviyo/fixtures/profile-withdrawn-unsubscribes/responses/001.json +12 -0
  1662. fincas-0.4.1/golden_erp/addons/klaviyo/fixtures/rate-limited/account.json +6 -0
  1663. fincas-0.4.1/golden_erp/addons/klaviyo/fixtures/rate-limited/case.json +38 -0
  1664. fincas-0.4.1/golden_erp/addons/klaviyo/fixtures/rate-limited/db.expected.json +26 -0
  1665. fincas-0.4.1/golden_erp/addons/klaviyo/fixtures/rate-limited/requests.expected.json +25 -0
  1666. fincas-0.4.1/golden_erp/addons/klaviyo/fixtures/rate-limited/responses/001.json +21 -0
  1667. fincas-0.4.1/golden_erp/addons/klaviyo/fixtures/reconcile-sweep/account.json +6 -0
  1668. fincas-0.4.1/golden_erp/addons/klaviyo/fixtures/reconcile-sweep/case.json +65 -0
  1669. fincas-0.4.1/golden_erp/addons/klaviyo/fixtures/reconcile-sweep/db.expected.json +74 -0
  1670. fincas-0.4.1/golden_erp/addons/klaviyo/fixtures/reconcile-sweep/requests.expected.json +73 -0
  1671. fincas-0.4.1/golden_erp/addons/klaviyo/fixtures/reconcile-sweep/responses/001.json +17 -0
  1672. fincas-0.4.1/golden_erp/addons/klaviyo/fixtures/reconcile-sweep/responses/002.json +12 -0
  1673. fincas-0.4.1/golden_erp/addons/klaviyo/fixtures/segment-lists/account.json +9 -0
  1674. fincas-0.4.1/golden_erp/addons/klaviyo/fixtures/segment-lists/case.json +80 -0
  1675. fincas-0.4.1/golden_erp/addons/klaviyo/fixtures/segment-lists/db.expected.json +50 -0
  1676. fincas-0.4.1/golden_erp/addons/klaviyo/fixtures/segment-lists/requests.expected.json +46 -0
  1677. fincas-0.4.1/golden_erp/addons/klaviyo/fixtures/segment-lists/responses/001.json +17 -0
  1678. fincas-0.4.1/golden_erp/addons/klaviyo/fixtures/segment-lists/responses/002.json +12 -0
  1679. fincas-0.4.1/golden_erp/addons/klaviyo/fixtures/spam-pulled/account.json +6 -0
  1680. fincas-0.4.1/golden_erp/addons/klaviyo/fixtures/spam-pulled/case.json +40 -0
  1681. fincas-0.4.1/golden_erp/addons/klaviyo/fixtures/spam-pulled/db.expected.json +64 -0
  1682. fincas-0.4.1/golden_erp/addons/klaviyo/fixtures/spam-pulled/inbound/001-event.json +29 -0
  1683. fincas-0.4.1/golden_erp/addons/klaviyo/fixtures/spam-pulled/requests.expected.json +1 -0
  1684. fincas-0.4.1/golden_erp/addons/klaviyo/fixtures/subscribed-ignored/account.json +6 -0
  1685. fincas-0.4.1/golden_erp/addons/klaviyo/fixtures/subscribed-ignored/case.json +34 -0
  1686. fincas-0.4.1/golden_erp/addons/klaviyo/fixtures/subscribed-ignored/db.expected.json +28 -0
  1687. fincas-0.4.1/golden_erp/addons/klaviyo/fixtures/subscribed-ignored/inbound/001-event.json +29 -0
  1688. fincas-0.4.1/golden_erp/addons/klaviyo/fixtures/subscribed-ignored/requests.expected.json +1 -0
  1689. fincas-0.4.1/golden_erp/addons/klaviyo/fixtures/suppression-pushed/account.json +6 -0
  1690. fincas-0.4.1/golden_erp/addons/klaviyo/fixtures/suppression-pushed/case.json +53 -0
  1691. fincas-0.4.1/golden_erp/addons/klaviyo/fixtures/suppression-pushed/db.expected.json +48 -0
  1692. fincas-0.4.1/golden_erp/addons/klaviyo/fixtures/suppression-pushed/requests.expected.json +61 -0
  1693. fincas-0.4.1/golden_erp/addons/klaviyo/fixtures/suppression-pushed/responses/001.json +12 -0
  1694. fincas-0.4.1/golden_erp/addons/klaviyo/fixtures/suppression-pushed/responses/002.json +12 -0
  1695. fincas-0.4.1/golden_erp/addons/klaviyo/fixtures/unknown-profile-dropped/account.json +6 -0
  1696. fincas-0.4.1/golden_erp/addons/klaviyo/fixtures/unknown-profile-dropped/case.json +19 -0
  1697. fincas-0.4.1/golden_erp/addons/klaviyo/fixtures/unknown-profile-dropped/db.expected.json +9 -0
  1698. fincas-0.4.1/golden_erp/addons/klaviyo/fixtures/unknown-profile-dropped/inbound/001-event.json +29 -0
  1699. fincas-0.4.1/golden_erp/addons/klaviyo/fixtures/unknown-profile-dropped/requests.expected.json +1 -0
  1700. fincas-0.4.1/golden_erp/addons/klaviyo/fixtures/unsubscribe-pulled/account.json +6 -0
  1701. fincas-0.4.1/golden_erp/addons/klaviyo/fixtures/unsubscribe-pulled/case.json +50 -0
  1702. fincas-0.4.1/golden_erp/addons/klaviyo/fixtures/unsubscribe-pulled/db.expected.json +71 -0
  1703. fincas-0.4.1/golden_erp/addons/klaviyo/fixtures/unsubscribe-pulled/inbound/001-event.json +29 -0
  1704. fincas-0.4.1/golden_erp/addons/klaviyo/fixtures/unsubscribe-pulled/requests.expected.json +1 -0
  1705. fincas-0.4.1/golden_erp/addons/klaviyo/mapping.py +272 -0
  1706. fincas-0.4.1/golden_erp/addons/klaviyo/plugin.py +31 -0
  1707. fincas-0.4.1/golden_erp/addons/klaviyo/segments.py +120 -0
  1708. fincas-0.4.1/golden_erp/addons/klaviyo/tests/__init__.py +0 -0
  1709. fincas-0.4.1/golden_erp/addons/klaviyo/tests/seed.py +78 -0
  1710. fincas-0.4.1/golden_erp/addons/klaviyo/tests/test_contract.py +39 -0
  1711. fincas-0.4.1/golden_erp/addons/klaviyo/tests/test_klaviyo.py +640 -0
  1712. fincas-0.4.1/golden_erp/addons/klaviyo/values.py +70 -0
  1713. fincas-0.4.1/golden_erp/integrations.py +134 -0
  1714. fincas-0.4.1/golden_erp/paths.py +15 -0
  1715. fincas-0.4.1/golden_erp/settings/__init__.py +0 -0
  1716. fincas-0.4.1/golden_erp/settings/base.py +810 -0
  1717. fincas-0.4.1/golden_erp/settings/prod.py +190 -0
  1718. fincas-0.4.1/golden_erp/static/assets/css/auth.css +318 -0
  1719. fincas-0.4.1/golden_erp/static/assets/css/erp-compat.css +241 -0
  1720. fincas-0.4.1/golden_erp/static/assets/css/erp-custom.css +264 -0
  1721. fincas-0.4.1/golden_erp/static/assets/css/tabler-bindings.css +188 -0
  1722. fincas-0.4.1/golden_erp/static/assets/css/tabler-icons.css +126 -0
  1723. fincas-0.4.1/golden_erp/static/assets/css/tabler-vendors.min.css +8 -0
  1724. fincas-0.4.1/golden_erp/static/assets/css/tabler.min.css +9 -0
  1725. fincas-0.4.1/golden_erp/static/assets/css/themes/ember.css +58 -0
  1726. fincas-0.4.1/golden_erp/static/assets/css/themes/eva-01.css +446 -0
  1727. fincas-0.4.1/golden_erp/static/assets/css/themes/fincas.css +58 -0
  1728. fincas-0.4.1/golden_erp/static/assets/css/themes/golden.css +58 -0
  1729. fincas-0.4.1/golden_erp/static/assets/css/themes/graphite.css +58 -0
  1730. fincas-0.4.1/golden_erp/static/assets/css/themes/midnight.css +58 -0
  1731. fincas-0.4.1/golden_erp/static/assets/css/themes/paper.css +58 -0
  1732. fincas-0.4.1/golden_erp/static/assets/css/themes/sage.css +58 -0
  1733. fincas-0.4.1/golden_erp/static/assets/css/themes/slate.css +58 -0
  1734. fincas-0.4.1/golden_erp/static/assets/fonts/docs/barlow-400.ttf +0 -0
  1735. fincas-0.4.1/golden_erp/static/assets/fonts/docs/barlow-600.ttf +0 -0
  1736. fincas-0.4.1/golden_erp/static/assets/fonts/docs/barlow-700.ttf +0 -0
  1737. fincas-0.4.1/golden_erp/static/assets/fonts/docs/barlow-800.ttf +0 -0
  1738. fincas-0.4.1/golden_erp/static/assets/fonts/docs/roboto-mono-400.ttf +0 -0
  1739. fincas-0.4.1/golden_erp/static/assets/fonts/docs/roboto-mono-500.ttf +0 -0
  1740. fincas-0.4.1/golden_erp/static/assets/fonts/docs/source-sans-3-400.ttf +0 -0
  1741. fincas-0.4.1/golden_erp/static/assets/fonts/docs/source-sans-3-600.ttf +0 -0
  1742. fincas-0.4.1/golden_erp/static/assets/fonts/tabler-icons-subset.ttf +0 -0
  1743. fincas-0.4.1/golden_erp/static/assets/fonts/tabler-icons-subset.woff +0 -0
  1744. fincas-0.4.1/golden_erp/static/assets/fonts/tabler-icons-subset.woff2 +0 -0
  1745. fincas-0.4.1/golden_erp/static/assets/img/apple-icon.png +0 -0
  1746. fincas-0.4.1/golden_erp/static/assets/img/bg-smart-home-1.jpg +0 -0
  1747. fincas-0.4.1/golden_erp/static/assets/img/bg-smart-home-2.jpg +0 -0
  1748. fincas-0.4.1/golden_erp/static/assets/img/bruce-mars.jpg +0 -0
  1749. fincas-0.4.1/golden_erp/static/assets/img/curved-images/curved0.jpg +0 -0
  1750. fincas-0.4.1/golden_erp/static/assets/img/curved-images/curved1.jpg +0 -0
  1751. fincas-0.4.1/golden_erp/static/assets/img/curved-images/curved10.jpg +0 -0
  1752. fincas-0.4.1/golden_erp/static/assets/img/curved-images/curved11.jpg +0 -0
  1753. fincas-0.4.1/golden_erp/static/assets/img/curved-images/curved14.jpg +0 -0
  1754. fincas-0.4.1/golden_erp/static/assets/img/curved-images/curved6.jpg +0 -0
  1755. fincas-0.4.1/golden_erp/static/assets/img/curved-images/curved7.jpg +0 -0
  1756. fincas-0.4.1/golden_erp/static/assets/img/curved-images/curved8.jpg +0 -0
  1757. fincas-0.4.1/golden_erp/static/assets/img/curved-images/curved9.jpg +0 -0
  1758. fincas-0.4.1/golden_erp/static/assets/img/curved-images/white-curved.jpg +0 -0
  1759. fincas-0.4.1/golden_erp/static/assets/img/down-arrow-dark.svg +11 -0
  1760. fincas-0.4.1/golden_erp/static/assets/img/down-arrow-white.svg +1 -0
  1761. fincas-0.4.1/golden_erp/static/assets/img/down-arrow.svg +11 -0
  1762. fincas-0.4.1/golden_erp/static/assets/img/favicon.png +0 -0
  1763. fincas-0.4.1/golden_erp/static/assets/img/favicon.svg +13 -0
  1764. fincas-0.4.1/golden_erp/static/assets/img/home-decor-1.jpg +0 -0
  1765. fincas-0.4.1/golden_erp/static/assets/img/home-decor-2.jpg +0 -0
  1766. fincas-0.4.1/golden_erp/static/assets/img/home-decor-3.jpg +0 -0
  1767. fincas-0.4.1/golden_erp/static/assets/img/icons/flags/AU.png +0 -0
  1768. fincas-0.4.1/golden_erp/static/assets/img/icons/flags/BR.png +0 -0
  1769. fincas-0.4.1/golden_erp/static/assets/img/icons/flags/DE.png +0 -0
  1770. fincas-0.4.1/golden_erp/static/assets/img/icons/flags/GB.png +0 -0
  1771. fincas-0.4.1/golden_erp/static/assets/img/icons/flags/US.png +0 -0
  1772. fincas-0.4.1/golden_erp/static/assets/img/illustrations/chat.png +0 -0
  1773. fincas-0.4.1/golden_erp/static/assets/img/illustrations/danger-chat-ill.png +0 -0
  1774. fincas-0.4.1/golden_erp/static/assets/img/illustrations/dark-lock-ill.png +0 -0
  1775. fincas-0.4.1/golden_erp/static/assets/img/illustrations/error-404.png +0 -0
  1776. fincas-0.4.1/golden_erp/static/assets/img/illustrations/error-500.png +0 -0
  1777. fincas-0.4.1/golden_erp/static/assets/img/illustrations/lock.png +0 -0
  1778. fincas-0.4.1/golden_erp/static/assets/img/illustrations/rocket-white.png +0 -0
  1779. fincas-0.4.1/golden_erp/static/assets/img/ivana-square.jpg +0 -0
  1780. fincas-0.4.1/golden_erp/static/assets/img/ivana-squares.jpg +0 -0
  1781. fincas-0.4.1/golden_erp/static/assets/img/ivancik.jpg +0 -0
  1782. fincas-0.4.1/golden_erp/static/assets/img/kal-visuals-square.jpg +0 -0
  1783. fincas-0.4.1/golden_erp/static/assets/img/logo-ct-dark.png +0 -0
  1784. fincas-0.4.1/golden_erp/static/assets/img/logo-ct.png +0 -0
  1785. fincas-0.4.1/golden_erp/static/assets/img/logo.svg +11 -0
  1786. fincas-0.4.1/golden_erp/static/assets/img/logos/gray-logos/logo-coinbase.svg +16 -0
  1787. fincas-0.4.1/golden_erp/static/assets/img/logos/gray-logos/logo-nasa.svg +9 -0
  1788. fincas-0.4.1/golden_erp/static/assets/img/logos/gray-logos/logo-netflix.svg +9 -0
  1789. fincas-0.4.1/golden_erp/static/assets/img/logos/gray-logos/logo-pinterest.svg +9 -0
  1790. fincas-0.4.1/golden_erp/static/assets/img/logos/gray-logos/logo-spotify.svg +9 -0
  1791. fincas-0.4.1/golden_erp/static/assets/img/logos/gray-logos/logo-vodafone.svg +9 -0
  1792. fincas-0.4.1/golden_erp/static/assets/img/logos/mastercard.png +0 -0
  1793. fincas-0.4.1/golden_erp/static/assets/img/logos/visa.png +0 -0
  1794. fincas-0.4.1/golden_erp/static/assets/img/marie.jpg +0 -0
  1795. fincas-0.4.1/golden_erp/static/assets/img/meeting.jpg +0 -0
  1796. fincas-0.4.1/golden_erp/static/assets/img/mercedes-eqc.png +0 -0
  1797. fincas-0.4.1/golden_erp/static/assets/img/office-dark.jpg +0 -0
  1798. fincas-0.4.1/golden_erp/static/assets/img/shapes/pattern-lines.svg +91 -0
  1799. fincas-0.4.1/golden_erp/static/assets/img/shapes/waves-white.svg +48 -0
  1800. fincas-0.4.1/golden_erp/static/assets/img/small-logos/icon-bulb.svg +37 -0
  1801. fincas-0.4.1/golden_erp/static/assets/img/small-logos/icon-sun-cloud.png +0 -0
  1802. fincas-0.4.1/golden_erp/static/assets/img/small-logos/logo-asana.svg +16 -0
  1803. fincas-0.4.1/golden_erp/static/assets/img/small-logos/logo-atlassian.svg +16 -0
  1804. fincas-0.4.1/golden_erp/static/assets/img/small-logos/logo-invision.svg +10 -0
  1805. fincas-0.4.1/golden_erp/static/assets/img/small-logos/logo-jira.svg +21 -0
  1806. fincas-0.4.1/golden_erp/static/assets/img/small-logos/logo-slack.svg +12 -0
  1807. fincas-0.4.1/golden_erp/static/assets/img/small-logos/logo-spotify.svg +9 -0
  1808. fincas-0.4.1/golden_erp/static/assets/img/small-logos/logo-xd.svg +11 -0
  1809. fincas-0.4.1/golden_erp/static/assets/img/team-1.jpg +0 -0
  1810. fincas-0.4.1/golden_erp/static/assets/img/team-2.jpg +0 -0
  1811. fincas-0.4.1/golden_erp/static/assets/img/team-3.jpg +0 -0
  1812. fincas-0.4.1/golden_erp/static/assets/img/team-4.jpg +0 -0
  1813. fincas-0.4.1/golden_erp/static/assets/img/team-5.jpg +0 -0
  1814. fincas-0.4.1/golden_erp/static/assets/img/vr-bg.jpg +0 -0
  1815. fincas-0.4.1/golden_erp/static/assets/js/plugins/amcharts/animated.js +13 -0
  1816. fincas-0.4.1/golden_erp/static/assets/js/plugins/amcharts/core.js +39339 -0
  1817. fincas-0.4.1/golden_erp/static/assets/js/plugins/amcharts/maps.js +6133 -0
  1818. fincas-0.4.1/golden_erp/static/assets/js/plugins/amcharts/worldLow.js +16230 -0
  1819. fincas-0.4.1/golden_erp/static/assets/js/plugins/chartjs.min.js +13 -0
  1820. fincas-0.4.1/golden_erp/static/assets/js/plugins/choices.min.js +11 -0
  1821. fincas-0.4.1/golden_erp/static/assets/js/plugins/countup.min.js +1 -0
  1822. fincas-0.4.1/golden_erp/static/assets/js/plugins/datatables.js +1283 -0
  1823. fincas-0.4.1/golden_erp/static/assets/js/plugins/dragula/dragula.js +1079 -0
  1824. fincas-0.4.1/golden_erp/static/assets/js/plugins/dragula/dragula.min.js +1 -0
  1825. fincas-0.4.1/golden_erp/static/assets/js/plugins/dropzone.min.js +1 -0
  1826. fincas-0.4.1/golden_erp/static/assets/js/plugins/flatpickr.min.js +2 -0
  1827. fincas-0.4.1/golden_erp/static/assets/js/plugins/fullcalendar.min.js +6 -0
  1828. fincas-0.4.1/golden_erp/static/assets/js/plugins/jkanban/jkanban.js +1870 -0
  1829. fincas-0.4.1/golden_erp/static/assets/js/plugins/jkanban/jkanban.min.js +1 -0
  1830. fincas-0.4.1/golden_erp/static/assets/js/plugins/leaflet.js +4629 -0
  1831. fincas-0.4.1/golden_erp/static/assets/js/plugins/moment.min.js +8 -0
  1832. fincas-0.4.1/golden_erp/static/assets/js/plugins/multistep-form.js +167 -0
  1833. fincas-0.4.1/golden_erp/static/assets/js/plugins/nouislider.min.js +2 -0
  1834. fincas-0.4.1/golden_erp/static/assets/js/plugins/orbit-controls.js +1049 -0
  1835. fincas-0.4.1/golden_erp/static/assets/js/plugins/photoswipe-ui-default.min.js +858 -0
  1836. fincas-0.4.1/golden_erp/static/assets/js/plugins/photoswipe.min.js +4 -0
  1837. fincas-0.4.1/golden_erp/static/assets/js/plugins/quill.min.js +8 -0
  1838. fincas-0.4.1/golden_erp/static/assets/js/plugins/round-slider.min.js +271 -0
  1839. fincas-0.4.1/golden_erp/static/assets/js/plugins/sweetalert.min.js +5 -0
  1840. fincas-0.4.1/golden_erp/static/assets/js/plugins/threejs.js +52759 -0
  1841. fincas-0.4.1/golden_erp/static/assets/js/plugins/tilt.min.js +508 -0
  1842. fincas-0.4.1/golden_erp/static/assets/js/tabler.min.js +13 -0
  1843. fincas-0.4.1/golden_erp/static/images/logo-80.webp +0 -0
  1844. fincas-0.4.1/golden_erp/templates/403.html +7 -0
  1845. fincas-0.4.1/golden_erp/templates/404.html +6 -0
  1846. fincas-0.4.1/golden_erp/templates/500.html +5 -0
  1847. fincas-0.4.1/golden_erp/templates/base.html +155 -0
  1848. fincas-0.4.1/golden_erp/templates/content/detail.html +97 -0
  1849. fincas-0.4.1/golden_erp/templates/discounts/detail.html +132 -0
  1850. fincas-0.4.1/golden_erp/templates/discounts/generate.html +108 -0
  1851. fincas-0.4.1/golden_erp/templates/erp/_column_chooser.html +42 -0
  1852. fincas-0.4.1/golden_erp/templates/erp/_definition_fieldsets.html +43 -0
  1853. fincas-0.4.1/golden_erp/templates/erp/_definition_groups.html +21 -0
  1854. fincas-0.4.1/golden_erp/templates/erp/_doc_people.html +37 -0
  1855. fincas-0.4.1/golden_erp/templates/erp/_list_a11y_js.html +28 -0
  1856. fincas-0.4.1/golden_erp/templates/erp/_list_a11y_script.html +6 -0
  1857. fincas-0.4.1/golden_erp/templates/erp/_list_caption.html +1 -0
  1858. fincas-0.4.1/golden_erp/templates/erp/_list_export.html +11 -0
  1859. fincas-0.4.1/golden_erp/templates/erp/_list_live_region.html +2 -0
  1860. fincas-0.4.1/golden_erp/templates/erp/_list_responsive.html +27 -0
  1861. fincas-0.4.1/golden_erp/templates/erp/_list_sort_inputs.html +1 -0
  1862. fincas-0.4.1/golden_erp/templates/erp/_list_tools_js.html +47 -0
  1863. fincas-0.4.1/golden_erp/templates/erp/_other_data.html +26 -0
  1864. fincas-0.4.1/golden_erp/templates/erp/_party_search_js.html +146 -0
  1865. fincas-0.4.1/golden_erp/templates/erp/_report_heading.html +1 -0
  1866. fincas-0.4.1/golden_erp/templates/erp/_saved_filters.html +44 -0
  1867. fincas-0.4.1/golden_erp/templates/erp/_tracking_section.html +44 -0
  1868. fincas-0.4.1/golden_erp/templates/erp/_tracking_section_js.html +115 -0
  1869. fincas-0.4.1/golden_erp/templates/erp/_unify_upload_form.html +16 -0
  1870. fincas-0.4.1/golden_erp/templates/erp/account.html +52 -0
  1871. fincas-0.4.1/golden_erp/templates/erp/account_edit.html +39 -0
  1872. fincas-0.4.1/golden_erp/templates/erp/accounting_account_register.html +129 -0
  1873. fincas-0.4.1/golden_erp/templates/erp/accounting_dashboard.html +175 -0
  1874. fincas-0.4.1/golden_erp/templates/erp/accounting_entries.html +112 -0
  1875. fincas-0.4.1/golden_erp/templates/erp/accounting_entry_detail.html +72 -0
  1876. fincas-0.4.1/golden_erp/templates/erp/accounting_import.html +171 -0
  1877. fincas-0.4.1/golden_erp/templates/erp/accounting_periods.html +82 -0
  1878. fincas-0.4.1/golden_erp/templates/erp/accounting_recon.html +98 -0
  1879. fincas-0.4.1/golden_erp/templates/erp/accounting_trial_balance.html +112 -0
  1880. fincas-0.4.1/golden_erp/templates/erp/crm/_communication.html +23 -0
  1881. fincas-0.4.1/golden_erp/templates/erp/crm/_list_header.html +9 -0
  1882. fincas-0.4.1/golden_erp/templates/erp/crm/_log_form.html +67 -0
  1883. fincas-0.4.1/golden_erp/templates/erp/crm/_new_party_link.html +2 -0
  1884. fincas-0.4.1/golden_erp/templates/erp/crm/_pager.html +16 -0
  1885. fincas-0.4.1/golden_erp/templates/erp/crm/_task_row_actions.html +17 -0
  1886. fincas-0.4.1/golden_erp/templates/erp/crm/_timeline.html +65 -0
  1887. fincas-0.4.1/golden_erp/templates/erp/crm/admin_form.html +37 -0
  1888. fincas-0.4.1/golden_erp/templates/erp/crm/create_form.html +60 -0
  1889. fincas-0.4.1/golden_erp/templates/erp/crm/engagement_detail.html +417 -0
  1890. fincas-0.4.1/golden_erp/templates/erp/crm/engagement_form.html +45 -0
  1891. fincas-0.4.1/golden_erp/templates/erp/crm/engagement_list.html +248 -0
  1892. fincas-0.4.1/golden_erp/templates/erp/crm/lead_list.html +95 -0
  1893. fincas-0.4.1/golden_erp/templates/erp/crm/log_form.html +16 -0
  1894. fincas-0.4.1/golden_erp/templates/erp/crm/my_day.html +86 -0
  1895. fincas-0.4.1/golden_erp/templates/erp/crm/pipeline_list.html +74 -0
  1896. fincas-0.4.1/golden_erp/templates/erp/crm/task_list.html +107 -0
  1897. fincas-0.4.1/golden_erp/templates/erp/crm/timeline.html +22 -0
  1898. fincas-0.4.1/golden_erp/templates/erp/crm_import/_queue_header.html +14 -0
  1899. fincas-0.4.1/golden_erp/templates/erp/crm_import/_queue_row.html +175 -0
  1900. fincas-0.4.1/golden_erp/templates/erp/crm_import/bulk_confirm.html +24 -0
  1901. fincas-0.4.1/golden_erp/templates/erp/crm_import/job_list.html +15 -0
  1902. fincas-0.4.1/golden_erp/templates/erp/crm_import/job_overview.html +157 -0
  1903. fincas-0.4.1/golden_erp/templates/erp/crm_import/queue.html +292 -0
  1904. fincas-0.4.1/golden_erp/templates/erp/crm_import/report.html +139 -0
  1905. fincas-0.4.1/golden_erp/templates/erp/crm_report.html +184 -0
  1906. fincas-0.4.1/golden_erp/templates/erp/customer_address_form.html +147 -0
  1907. fincas-0.4.1/golden_erp/templates/erp/customer_detail.html +421 -0
  1908. fincas-0.4.1/golden_erp/templates/erp/dashboard.html +242 -0
  1909. fincas-0.4.1/golden_erp/templates/erp/document_form.html +2980 -0
  1910. fincas-0.4.1/golden_erp/templates/erp/document_library.html +165 -0
  1911. fincas-0.4.1/golden_erp/templates/erp/email_verify.html +25 -0
  1912. fincas-0.4.1/golden_erp/templates/erp/email_verify_email.html +11 -0
  1913. fincas-0.4.1/golden_erp/templates/erp/form.html +89 -0
  1914. fincas-0.4.1/golden_erp/templates/erp/integrations.html +257 -0
  1915. fincas-0.4.1/golden_erp/templates/erp/invoice_detail.html +168 -0
  1916. fincas-0.4.1/golden_erp/templates/erp/list.html +321 -0
  1917. fincas-0.4.1/golden_erp/templates/erp/parties/party_detail.html +550 -0
  1918. fincas-0.4.1/golden_erp/templates/erp/parties/party_list.html +198 -0
  1919. fincas-0.4.1/golden_erp/templates/erp/parties_merge/review.html +256 -0
  1920. fincas-0.4.1/golden_erp/templates/erp/password_change.html +50 -0
  1921. fincas-0.4.1/golden_erp/templates/erp/pick_ticket_print.html +168 -0
  1922. fincas-0.4.1/golden_erp/templates/erp/price_list_detail.html +136 -0
  1923. fincas-0.4.1/golden_erp/templates/erp/product_detail.html +312 -0
  1924. fincas-0.4.1/golden_erp/templates/erp/product_profile.html +807 -0
  1925. fincas-0.4.1/golden_erp/templates/erp/purchase_order_receive.html +125 -0
  1926. fincas-0.4.1/golden_erp/templates/erp/report.html +187 -0
  1927. fincas-0.4.1/golden_erp/templates/erp/settings/labels.html +56 -0
  1928. fincas-0.4.1/golden_erp/templates/erp/settings/team_form.html +52 -0
  1929. fincas-0.4.1/golden_erp/templates/erp/settings/teams.html +46 -0
  1930. fincas-0.4.1/golden_erp/templates/erp/unify_batch_detail.html +117 -0
  1931. fincas-0.4.1/golden_erp/templates/erp/unify_batch_list.html +57 -0
  1932. fincas-0.4.1/golden_erp/templates/erp/unify_batch_upload.html +26 -0
  1933. fincas-0.4.1/golden_erp/templates/erp/user_create.html +69 -0
  1934. fincas-0.4.1/golden_erp/templates/erp/user_list.html +97 -0
  1935. fincas-0.4.1/golden_erp/templates/erp/user_roles.html +43 -0
  1936. fincas-0.4.1/golden_erp/templates/errors/base.html +59 -0
  1937. fincas-0.4.1/golden_erp/templates/includes/footer.html +11 -0
  1938. fincas-0.4.1/golden_erp/templates/includes/navigation.html +92 -0
  1939. fincas-0.4.1/golden_erp/templates/includes/scripts.html +81 -0
  1940. fincas-0.4.1/golden_erp/templates/includes/scroll_regions.html +44 -0
  1941. fincas-0.4.1/golden_erp/templates/includes/sidebar.html +106 -0
  1942. fincas-0.4.1/golden_erp/templates/includes/submit_guard.html +61 -0
  1943. fincas-0.4.1/golden_erp/templates/registration/auth_base.html +44 -0
  1944. fincas-0.4.1/golden_erp/templates/registration/login.html +71 -0
  1945. fincas-0.4.1/golden_erp/templates/registration/password_reset.html +24 -0
  1946. fincas-0.4.1/golden_erp/templates/registration/password_reset_complete.html +10 -0
  1947. fincas-0.4.1/golden_erp/templates/registration/password_reset_confirm.html +49 -0
  1948. fincas-0.4.1/golden_erp/templates/registration/password_reset_done.html +11 -0
  1949. fincas-0.4.1/golden_erp/templates/registration/password_reset_email.html +9 -0
  1950. fincas-0.4.1/golden_erp/templates/registration/password_reset_subject.txt +1 -0
  1951. fincas-0.4.1/golden_erp/urls.py +103 -0
  1952. fincas-0.4.1/inventory/__init__.py +0 -0
  1953. fincas-0.4.1/inventory/admin.py +33 -0
  1954. fincas-0.4.1/inventory/apps.py +5 -0
  1955. fincas-0.4.1/inventory/erp_urls.py +15 -0
  1956. fincas-0.4.1/inventory/erp_views.py +107 -0
  1957. fincas-0.4.1/inventory/forms.py +31 -0
  1958. fincas-0.4.1/inventory/migrations/0001_initial.py +156 -0
  1959. fincas-0.4.1/inventory/migrations/0002_initial.py +39 -0
  1960. fincas-0.4.1/inventory/migrations/0003_warehouse_company.py +26 -0
  1961. fincas-0.4.1/inventory/migrations/__init__.py +0 -0
  1962. fincas-0.4.1/inventory/models.py +198 -0
  1963. fincas-0.4.1/inventory/serializers.py +19 -0
  1964. fincas-0.4.1/inventory/tests.py +158 -0
  1965. fincas-0.4.1/inventory/urls.py +9 -0
  1966. fincas-0.4.1/inventory/views.py +43 -0
  1967. fincas-0.4.1/llmhub/__init__.py +15 -0
  1968. fincas-0.4.1/llmhub/admin.py +48 -0
  1969. fincas-0.4.1/llmhub/apps.py +15 -0
  1970. fincas-0.4.1/llmhub/audit.py +97 -0
  1971. fincas-0.4.1/llmhub/checks.py +40 -0
  1972. fincas-0.4.1/llmhub/client.py +680 -0
  1973. fincas-0.4.1/llmhub/conf.py +310 -0
  1974. fincas-0.4.1/llmhub/crypto.py +106 -0
  1975. fincas-0.4.1/llmhub/drift.py +101 -0
  1976. fincas-0.4.1/llmhub/erp_forms.py +125 -0
  1977. fincas-0.4.1/llmhub/erp_urls.py +14 -0
  1978. fincas-0.4.1/llmhub/erp_views.py +467 -0
  1979. fincas-0.4.1/llmhub/management/__init__.py +0 -0
  1980. fincas-0.4.1/llmhub/management/commands/__init__.py +0 -0
  1981. fincas-0.4.1/llmhub/management/commands/llmhub_check.py +100 -0
  1982. fincas-0.4.1/llmhub/middleware.py +40 -0
  1983. fincas-0.4.1/llmhub/migrations/0001_initial.py +237 -0
  1984. fincas-0.4.1/llmhub/migrations/__init__.py +0 -0
  1985. fincas-0.4.1/llmhub/models.py +288 -0
  1986. fincas-0.4.1/llmhub/purposes.py +141 -0
  1987. fincas-0.4.1/llmhub/signals.py +81 -0
  1988. fincas-0.4.1/llmhub/static/llmhub/settings.js +131 -0
  1989. fincas-0.4.1/llmhub/templates/llmhub/settings.html +392 -0
  1990. fincas-0.4.1/llmhub/tests/__init__.py +0 -0
  1991. fincas-0.4.1/llmhub/tests/helpers.py +138 -0
  1992. fincas-0.4.1/llmhub/tests/test_audit.py +175 -0
  1993. fincas-0.4.1/llmhub/tests/test_chat_registry.py +103 -0
  1994. fincas-0.4.1/llmhub/tests/test_client.py +474 -0
  1995. fincas-0.4.1/llmhub/tests/test_commands.py +222 -0
  1996. fincas-0.4.1/llmhub/tests/test_conf.py +248 -0
  1997. fincas-0.4.1/llmhub/tests/test_purposes.py +66 -0
  1998. fincas-0.4.1/llmhub/tests/test_security_guards.py +102 -0
  1999. fincas-0.4.1/llmhub/tests/test_views.py +445 -0
  2000. fincas-0.4.1/orders/__init__.py +0 -0
  2001. fincas-0.4.1/orders/admin.py +177 -0
  2002. fincas-0.4.1/orders/apps.py +8 -0
  2003. fincas-0.4.1/orders/convert.py +283 -0
  2004. fincas-0.4.1/orders/duplicate.py +178 -0
  2005. fincas-0.4.1/orders/erp_urls.py +41 -0
  2006. fincas-0.4.1/orders/erp_views.py +1493 -0
  2007. fincas-0.4.1/orders/forms.py +451 -0
  2008. fincas-0.4.1/orders/line_locks.py +91 -0
  2009. fincas-0.4.1/orders/management/__init__.py +0 -0
  2010. fincas-0.4.1/orders/management/commands/__init__.py +0 -0
  2011. fincas-0.4.1/orders/management/commands/import_bc_invoice.py +237 -0
  2012. fincas-0.4.1/orders/migrations/0001_initial.py +920 -0
  2013. fincas-0.4.1/orders/migrations/0002_initial.py +91 -0
  2014. fincas-0.4.1/orders/migrations/0003_initial.py +440 -0
  2015. fincas-0.4.1/orders/migrations/0004_order_guest_email_alter_order_customer.py +35 -0
  2016. fincas-0.4.1/orders/migrations/0005_order_uniq_order_stripe_pi.py +21 -0
  2017. fincas-0.4.1/orders/migrations/0006_quote_legacy_pipeline_fields.py +63 -0
  2018. fincas-0.4.1/orders/migrations/0007_quote_order_engagement.py +50 -0
  2019. fincas-0.4.1/orders/migrations/0008_document_contact.py +92 -0
  2020. fincas-0.4.1/orders/migrations/0009_us_english_choice_labels.py +103 -0
  2021. fincas-0.4.1/orders/migrations/__init__.py +0 -0
  2022. fincas-0.4.1/orders/models.py +1373 -0
  2023. fincas-0.4.1/orders/people.py +144 -0
  2024. fincas-0.4.1/orders/posting.py +80 -0
  2025. fincas-0.4.1/orders/revisions.py +62 -0
  2026. fincas-0.4.1/orders/serializers.py +299 -0
  2027. fincas-0.4.1/orders/shipping_service.py +406 -0
  2028. fincas-0.4.1/orders/signals.py +56 -0
  2029. fincas-0.4.1/orders/test_m3_mass_assignment.py +151 -0
  2030. fincas-0.4.1/orders/test_m3_xss.py +99 -0
  2031. fincas-0.4.1/orders/test_stripe_pi_unique.py +47 -0
  2032. fincas-0.4.1/orders/tests/__init__.py +0 -0
  2033. fincas-0.4.1/orders/tests/test_company_scoping.py +193 -0
  2034. fincas-0.4.1/orders/tests/test_convert.py +113 -0
  2035. fincas-0.4.1/orders/tests/test_default_company.py +48 -0
  2036. fincas-0.4.1/orders/tests/test_document_people.py +246 -0
  2037. fincas-0.4.1/orders/tests/test_double_submit.py +172 -0
  2038. fincas-0.4.1/orders/tests/test_duplicate.py +147 -0
  2039. fincas-0.4.1/orders/tests/test_full_chain_totals.py +191 -0
  2040. fincas-0.4.1/orders/tests/test_line_item_blank_row.py +343 -0
  2041. fincas-0.4.1/orders/tests/test_m2d_token_isolation.py +101 -0
  2042. fincas-0.4.1/orders/tests/test_order_create_requires_line.py +168 -0
  2043. fincas-0.4.1/orders/tests/test_order_idempotency.py +110 -0
  2044. fincas-0.4.1/orders/tests/test_quote_document_views.py +230 -0
  2045. fincas-0.4.1/orders/tests/test_quote_list_engagement.py +39 -0
  2046. fincas-0.4.1/orders/tests/test_quote_revisions.py +127 -0
  2047. fincas-0.4.1/orders/tests/test_quote_to_order.py +349 -0
  2048. fincas-0.4.1/orders/tests/test_recalculate.py +549 -0
  2049. fincas-0.4.1/orders/tests/test_sales_invoice_by_token.py +107 -0
  2050. fincas-0.4.1/orders/tests/test_sales_invoice_model.py +75 -0
  2051. fincas-0.4.1/orders/tests/test_sales_invoice_reconcile.py +196 -0
  2052. fincas-0.4.1/orders/tests/test_serializer_enforcement.py +241 -0
  2053. fincas-0.4.1/orders/tests/test_shipment_group_moves.py +670 -0
  2054. fincas-0.4.1/orders/tests/test_sibling_quotes.py +86 -0
  2055. fincas-0.4.1/orders/tests/test_status_transitions.py +202 -0
  2056. fincas-0.4.1/orders/tests/test_stripe_pi_race.py +140 -0
  2057. fincas-0.4.1/orders/tests/test_suborder_status_guard.py +89 -0
  2058. fincas-0.4.1/orders/urls.py +37 -0
  2059. fincas-0.4.1/orders/views.py +666 -0
  2060. fincas-0.4.1/parties/__init__.py +5 -0
  2061. fincas-0.4.1/parties/_registry.py +52 -0
  2062. fincas-0.4.1/parties/admin.py +98 -0
  2063. fincas-0.4.1/parties/apps.py +52 -0
  2064. fincas-0.4.1/parties/backfill.py +861 -0
  2065. fincas-0.4.1/parties/checks.py +61 -0
  2066. fincas-0.4.1/parties/classification_registry.py +186 -0
  2067. fincas-0.4.1/parties/consent.py +228 -0
  2068. fincas-0.4.1/parties/constants.py +16 -0
  2069. fincas-0.4.1/parties/dedupe.py +334 -0
  2070. fincas-0.4.1/parties/dedupe_legacy.py +275 -0
  2071. fincas-0.4.1/parties/dedupe_parties.py +158 -0
  2072. fincas-0.4.1/parties/display.py +39 -0
  2073. fincas-0.4.1/parties/envelope.py +291 -0
  2074. fincas-0.4.1/parties/erasure.py +1460 -0
  2075. fincas-0.4.1/parties/erasure_api.py +66 -0
  2076. fincas-0.4.1/parties/erasure_urls.py +9 -0
  2077. fincas-0.4.1/parties/erp_urls.py +38 -0
  2078. fincas-0.4.1/parties/erp_views.py +1109 -0
  2079. fincas-0.4.1/parties/forms.py +638 -0
  2080. fincas-0.4.1/parties/management/__init__.py +0 -0
  2081. fincas-0.4.1/parties/management/commands/__init__.py +0 -0
  2082. fincas-0.4.1/parties/management/commands/backfill_parties.py +69 -0
  2083. fincas-0.4.1/parties/management/commands/check_erasure.py +55 -0
  2084. fincas-0.4.1/parties/management/commands/erase_party.py +57 -0
  2085. fincas-0.4.1/parties/management/commands/party_dedupe_propose.py +44 -0
  2086. fincas-0.4.1/parties/management/commands/party_dedupe_report.py +278 -0
  2087. fincas-0.4.1/parties/management/commands/reconcile_parties.py +67 -0
  2088. fincas-0.4.1/parties/management/commands/seed_parties.py +212 -0
  2089. fincas-0.4.1/parties/match.py +55 -0
  2090. fincas-0.4.1/parties/merge.py +807 -0
  2091. fincas-0.4.1/parties/merge_queue.py +279 -0
  2092. fincas-0.4.1/parties/merge_urls.py +9 -0
  2093. fincas-0.4.1/parties/merge_views.py +507 -0
  2094. fincas-0.4.1/parties/migrations/0001_initial.py +797 -0
  2095. fincas-0.4.1/parties/migrations/0002_backfill.py +54 -0
  2096. fincas-0.4.1/parties/migrations/0003_partymergelog.py +98 -0
  2097. fincas-0.4.1/parties/migrations/0004_promoted_columns.py +61 -0
  2098. fincas-0.4.1/parties/migrations/0005_stamp_owner_team.py +27 -0
  2099. fincas-0.4.1/parties/migrations/0006_party_metadata_gin.py +21 -0
  2100. fincas-0.4.1/parties/migrations/0007_export_pii_permission.py +25 -0
  2101. fincas-0.4.1/parties/migrations/0008_us_english_choice_labels.py +21 -0
  2102. fincas-0.4.1/parties/migrations/__init__.py +0 -0
  2103. fincas-0.4.1/parties/mirror.py +178 -0
  2104. fincas-0.4.1/parties/models.py +807 -0
  2105. fincas-0.4.1/parties/normalize.py +253 -0
  2106. fincas-0.4.1/parties/ownership.py +113 -0
  2107. fincas-0.4.1/parties/portal.py +411 -0
  2108. fincas-0.4.1/parties/receivers.py +19 -0
  2109. fincas-0.4.1/parties/reconcile.py +310 -0
  2110. fincas-0.4.1/parties/relationship_registry.py +200 -0
  2111. fincas-0.4.1/parties/role_registry.py +173 -0
  2112. fincas-0.4.1/parties/serializers.py +696 -0
  2113. fincas-0.4.1/parties/sync.py +678 -0
  2114. fincas-0.4.1/parties/tests/__init__.py +0 -0
  2115. fincas-0.4.1/parties/tests/factories.py +51 -0
  2116. fincas-0.4.1/parties/tests/test_api.py +589 -0
  2117. fincas-0.4.1/parties/tests/test_backfill.py +549 -0
  2118. fincas-0.4.1/parties/tests/test_classification.py +208 -0
  2119. fincas-0.4.1/parties/tests/test_consent_writebacks.py +94 -0
  2120. fincas-0.4.1/parties/tests/test_dedupe.py +350 -0
  2121. fincas-0.4.1/parties/tests/test_envelope.py +139 -0
  2122. fincas-0.4.1/parties/tests/test_erasure.py +967 -0
  2123. fincas-0.4.1/parties/tests/test_erasure_sweep.py +367 -0
  2124. fincas-0.4.1/parties/tests/test_erasure_sweep_adapters.py +486 -0
  2125. fincas-0.4.1/parties/tests/test_erp_views.py +485 -0
  2126. fincas-0.4.1/parties/tests/test_merge.py +544 -0
  2127. fincas-0.4.1/parties/tests/test_merge_views.py +208 -0
  2128. fincas-0.4.1/parties/tests/test_metadata_merge.py +126 -0
  2129. fincas-0.4.1/parties/tests/test_models.py +558 -0
  2130. fincas-0.4.1/parties/tests/test_normalize.py +285 -0
  2131. fincas-0.4.1/parties/tests/test_reconcile.py +164 -0
  2132. fincas-0.4.1/parties/tests/test_registries.py +242 -0
  2133. fincas-0.4.1/parties/tests/test_relationship_picker.py +157 -0
  2134. fincas-0.4.1/parties/tests/test_signals.py +172 -0
  2135. fincas-0.4.1/parties/tests/test_sync.py +317 -0
  2136. fincas-0.4.1/parties/urls.py +26 -0
  2137. fincas-0.4.1/parties/views.py +389 -0
  2138. fincas-0.4.1/parties/widgets.py +75 -0
  2139. fincas-0.4.1/payments/__init__.py +0 -0
  2140. fincas-0.4.1/payments/admin.py +64 -0
  2141. fincas-0.4.1/payments/apps.py +5 -0
  2142. fincas-0.4.1/payments/erp_urls.py +23 -0
  2143. fincas-0.4.1/payments/erp_views.py +355 -0
  2144. fincas-0.4.1/payments/forms.py +86 -0
  2145. fincas-0.4.1/payments/gateways/__init__.py +17 -0
  2146. fincas-0.4.1/payments/gateways/base.py +111 -0
  2147. fincas-0.4.1/payments/gateways/manual.py +55 -0
  2148. fincas-0.4.1/payments/gateways/registry.py +43 -0
  2149. fincas-0.4.1/payments/gateways/stripe_gateway.py +238 -0
  2150. fincas-0.4.1/payments/gateways/usdc.py +100 -0
  2151. fincas-0.4.1/payments/migrations/0001_initial.py +240 -0
  2152. fincas-0.4.1/payments/migrations/0002_payment_idempotency_key.py +20 -0
  2153. fincas-0.4.1/payments/migrations/0003_us_english_choice_labels.py +31 -0
  2154. fincas-0.4.1/payments/migrations/__init__.py +0 -0
  2155. fincas-0.4.1/payments/models.py +238 -0
  2156. fincas-0.4.1/payments/posting.py +83 -0
  2157. fincas-0.4.1/payments/serializers.py +19 -0
  2158. fincas-0.4.1/payments/services.py +355 -0
  2159. fincas-0.4.1/payments/tests/__init__.py +0 -0
  2160. fincas-0.4.1/payments/tests/test_closed_period.py +182 -0
  2161. fincas-0.4.1/payments/tests/test_gateways.py +97 -0
  2162. fincas-0.4.1/payments/tests/test_invoice_fk.py +50 -0
  2163. fincas-0.4.1/payments/tests/test_invoice_links.py +68 -0
  2164. fincas-0.4.1/payments/tests/test_payment_idempotency.py +65 -0
  2165. fincas-0.4.1/payments/tests/test_record_payment.py +243 -0
  2166. fincas-0.4.1/payments/tests/test_refund.py +210 -0
  2167. fincas-0.4.1/payments/tests/test_trackc.py +204 -0
  2168. fincas-0.4.1/payments/urls.py +8 -0
  2169. fincas-0.4.1/payments/views.py +65 -0
  2170. fincas-0.4.1/portal/__init__.py +0 -0
  2171. fincas-0.4.1/portal/admin.py +2 -0
  2172. fincas-0.4.1/portal/apps.py +6 -0
  2173. fincas-0.4.1/portal/migrations/__init__.py +0 -0
  2174. fincas-0.4.1/portal/models.py +2 -0
  2175. fincas-0.4.1/portal/serializers.py +385 -0
  2176. fincas-0.4.1/portal/test_party.py +312 -0
  2177. fincas-0.4.1/portal/tests.py +168 -0
  2178. fincas-0.4.1/portal/urls.py +36 -0
  2179. fincas-0.4.1/portal/views.py +301 -0
  2180. fincas-0.4.1/pricing/__init__.py +1 -0
  2181. fincas-0.4.1/pricing/admin.py +38 -0
  2182. fincas-0.4.1/pricing/apps.py +5 -0
  2183. fincas-0.4.1/pricing/erp_urls.py +15 -0
  2184. fincas-0.4.1/pricing/erp_views.py +95 -0
  2185. fincas-0.4.1/pricing/forms.py +41 -0
  2186. fincas-0.4.1/pricing/migrations/0001_initial.py +156 -0
  2187. fincas-0.4.1/pricing/migrations/0002_initial.py +30 -0
  2188. fincas-0.4.1/pricing/migrations/__init__.py +0 -0
  2189. fincas-0.4.1/pricing/models/__init__.py +13 -0
  2190. fincas-0.4.1/pricing/models/price_book.py +89 -0
  2191. fincas-0.4.1/pricing/serializers.py +28 -0
  2192. fincas-0.4.1/pricing/urls.py +14 -0
  2193. fincas-0.4.1/pricing/views.py +47 -0
  2194. fincas-0.4.1/products/__init__.py +0 -0
  2195. fincas-0.4.1/products/admin.py +172 -0
  2196. fincas-0.4.1/products/apps.py +12 -0
  2197. fincas-0.4.1/products/data/cw_energy_solar_panel_specs.json +548 -0
  2198. fincas-0.4.1/products/data/seo_quality_defaults.json +25 -0
  2199. fincas-0.4.1/products/erp_urls.py +37 -0
  2200. fincas-0.4.1/products/erp_views.py +670 -0
  2201. fincas-0.4.1/products/forms.py +133 -0
  2202. fincas-0.4.1/products/management/__init__.py +0 -0
  2203. fincas-0.4.1/products/management/commands/__init__.py +0 -0
  2204. fincas-0.4.1/products/management/commands/audit_mpn_coverage.py +185 -0
  2205. fincas-0.4.1/products/management/commands/backfill_enphase_iq8.py +337 -0
  2206. fincas-0.4.1/products/management/commands/create_grid_interactive_inverters.py +84 -0
  2207. fincas-0.4.1/products/management/commands/create_kara_firma_products.py +300 -0
  2208. fincas-0.4.1/products/management/commands/export_prices.py +109 -0
  2209. fincas-0.4.1/products/management/commands/fix_forge_image_ids.py +55 -0
  2210. fincas-0.4.1/products/management/commands/import_products.py +246 -0
  2211. fincas-0.4.1/products/management/commands/populate_suresine_options.py +191 -0
  2212. fincas-0.4.1/products/management/commands/restructure_dc_appliances.py +419 -0
  2213. fincas-0.4.1/products/management/commands/set_structured_specs.py +205 -0
  2214. fincas-0.4.1/products/management/commands/update_prices.py +160 -0
  2215. fincas-0.4.1/products/migrations/0001_initial.py +735 -0
  2216. fincas-0.4.1/products/migrations/0002_initial.py +73 -0
  2217. fincas-0.4.1/products/migrations/0003_category_body_copy.py +22 -0
  2218. fincas-0.4.1/products/migrations/0004_product_safety_warnings.py +22 -0
  2219. fincas-0.4.1/products/migrations/0005_variant_seo.py +30 -0
  2220. fincas-0.4.1/products/migrations/__init__.py +0 -0
  2221. fincas-0.4.1/products/models.py +615 -0
  2222. fincas-0.4.1/products/seo_checks.py +121 -0
  2223. fincas-0.4.1/products/seo_quality.py +330 -0
  2224. fincas-0.4.1/products/serializers.py +488 -0
  2225. fincas-0.4.1/products/templatetags/__init__.py +0 -0
  2226. fincas-0.4.1/products/templatetags/bunny_images.py +58 -0
  2227. fincas-0.4.1/products/test_category_body_copy.py +186 -0
  2228. fincas-0.4.1/products/test_m3_xss.py +125 -0
  2229. fincas-0.4.1/products/test_product_profile_slots.py +106 -0
  2230. fincas-0.4.1/products/test_product_safety_warnings.py +128 -0
  2231. fincas-0.4.1/products/test_seo_quality.py +203 -0
  2232. fincas-0.4.1/products/test_variant_seo.py +69 -0
  2233. fincas-0.4.1/products/tests.py +649 -0
  2234. fincas-0.4.1/products/tests_storefront_catalog.py +195 -0
  2235. fincas-0.4.1/products/tests_storefront_taxonomy.py +319 -0
  2236. fincas-0.4.1/products/urls.py +24 -0
  2237. fincas-0.4.1/products/views.py +304 -0
  2238. fincas-0.4.1/purchasing/__init__.py +0 -0
  2239. fincas-0.4.1/purchasing/admin.py +57 -0
  2240. fincas-0.4.1/purchasing/apps.py +8 -0
  2241. fincas-0.4.1/purchasing/duplicate.py +86 -0
  2242. fincas-0.4.1/purchasing/erp_urls.py +25 -0
  2243. fincas-0.4.1/purchasing/erp_views.py +600 -0
  2244. fincas-0.4.1/purchasing/forms.py +233 -0
  2245. fincas-0.4.1/purchasing/migrations/0001_initial.py +774 -0
  2246. fincas-0.4.1/purchasing/migrations/0002_us_english_choice_labels.py +34 -0
  2247. fincas-0.4.1/purchasing/migrations/__init__.py +0 -0
  2248. fincas-0.4.1/purchasing/models.py +581 -0
  2249. fincas-0.4.1/purchasing/posting.py +90 -0
  2250. fincas-0.4.1/purchasing/serializers.py +84 -0
  2251. fincas-0.4.1/purchasing/services.py +193 -0
  2252. fincas-0.4.1/purchasing/signals.py +33 -0
  2253. fincas-0.4.1/purchasing/tests/__init__.py +0 -0
  2254. fincas-0.4.1/purchasing/tests/test_company_scoping.py +163 -0
  2255. fincas-0.4.1/purchasing/tests/test_duplicate.py +86 -0
  2256. fincas-0.4.1/purchasing/tests/test_landed_cost.py +165 -0
  2257. fincas-0.4.1/purchasing/tests/test_po_editor.py +219 -0
  2258. fincas-0.4.1/purchasing/tests/test_po_editor_transitions.py +123 -0
  2259. fincas-0.4.1/purchasing/tests/test_po_transitions.py +103 -0
  2260. fincas-0.4.1/purchasing/tests/test_recalculate.py +223 -0
  2261. fincas-0.4.1/purchasing/tests/test_receiving.py +253 -0
  2262. fincas-0.4.1/purchasing/tests/test_serializer_enforcement.py +129 -0
  2263. fincas-0.4.1/purchasing/urls.py +16 -0
  2264. fincas-0.4.1/purchasing/views.py +157 -0
  2265. fincas-0.4.1/pyproject.toml +155 -0
  2266. fincas-0.4.1/reporting/__init__.py +0 -0
  2267. fincas-0.4.1/reporting/admin.py +11 -0
  2268. fincas-0.4.1/reporting/api.py +439 -0
  2269. fincas-0.4.1/reporting/api_urls.py +19 -0
  2270. fincas-0.4.1/reporting/apps.py +5 -0
  2271. fincas-0.4.1/reporting/crm_reports.py +800 -0
  2272. fincas-0.4.1/reporting/erp_urls.py +11 -0
  2273. fincas-0.4.1/reporting/erp_views.py +711 -0
  2274. fincas-0.4.1/reporting/migrations/0001_initial.py +38 -0
  2275. fincas-0.4.1/reporting/migrations/__init__.py +0 -0
  2276. fincas-0.4.1/reporting/models.py +19 -0
  2277. fincas-0.4.1/reporting/serializers.py +10 -0
  2278. fincas-0.4.1/reporting/test_crm_report_api.py +520 -0
  2279. fincas-0.4.1/reporting/test_crm_reports.py +610 -0
  2280. fincas-0.4.1/reporting/tests.py +317 -0
  2281. fincas-0.4.1/reporting/urls.py +8 -0
  2282. fincas-0.4.1/reporting/views.py +17 -0
  2283. fincas-0.4.1/setup.cfg +4 -0
  2284. fincas-0.4.1/unify/__init__.py +0 -0
  2285. fincas-0.4.1/unify/admin.py +39 -0
  2286. fincas-0.4.1/unify/appliers.py +153 -0
  2287. fincas-0.4.1/unify/apply.py +226 -0
  2288. fincas-0.4.1/unify/apps.py +5 -0
  2289. fincas-0.4.1/unify/erp_urls.py +17 -0
  2290. fincas-0.4.1/unify/erp_views.py +298 -0
  2291. fincas-0.4.1/unify/ingest.py +161 -0
  2292. fincas-0.4.1/unify/management/__init__.py +0 -0
  2293. fincas-0.4.1/unify/management/commands/__init__.py +0 -0
  2294. fincas-0.4.1/unify/management/commands/unify_apply.py +79 -0
  2295. fincas-0.4.1/unify/migrations/0001_initial.py +279 -0
  2296. fincas-0.4.1/unify/migrations/0002_dedupe_source_kind.py +35 -0
  2297. fincas-0.4.1/unify/migrations/0003_crm_source_kind.py +27 -0
  2298. fincas-0.4.1/unify/migrations/0004_us_english_choice_labels.py +27 -0
  2299. fincas-0.4.1/unify/migrations/__init__.py +0 -0
  2300. fincas-0.4.1/unify/models.py +239 -0
  2301. fincas-0.4.1/unify/propose.py +409 -0
  2302. fincas-0.4.1/unify/tests.py +192 -0
  2303. fincas-0.4.1/unify/tests_appliers.py +70 -0
  2304. fincas-0.4.1/unify/tests_propose.py +231 -0
  2305. fincas-0.4.1/unify/tests_views.py +152 -0
  2306. fincas-0.4.1/unify/views.py +2 -0
  2307. fincas-0.4.1/webhooks/__init__.py +1 -0
  2308. fincas-0.4.1/webhooks/admin.py +32 -0
  2309. fincas-0.4.1/webhooks/apps.py +14 -0
  2310. fincas-0.4.1/webhooks/erp_urls.py +11 -0
  2311. fincas-0.4.1/webhooks/erp_views.py +134 -0
  2312. fincas-0.4.1/webhooks/events.py +401 -0
  2313. fincas-0.4.1/webhooks/migrations/0001_initial.py +113 -0
  2314. fincas-0.4.1/webhooks/migrations/0002_webhookdeliverylog_attempts_and_more.py +31 -0
  2315. fincas-0.4.1/webhooks/migrations/0003_webhookdeliverylog_delivery_id.py +18 -0
  2316. fincas-0.4.1/webhooks/migrations/__init__.py +0 -0
  2317. fincas-0.4.1/webhooks/models.py +104 -0
  2318. fincas-0.4.1/webhooks/outbox.py +330 -0
  2319. fincas-0.4.1/webhooks/serializers.py +53 -0
  2320. fincas-0.4.1/webhooks/services.py +244 -0
  2321. fincas-0.4.1/webhooks/tests/__init__.py +1 -0
  2322. fincas-0.4.1/webhooks/tests/test_api.py +61 -0
  2323. fincas-0.4.1/webhooks/tests/test_company_scoping.py +143 -0
  2324. fincas-0.4.1/webhooks/tests/test_crm_events.py +133 -0
  2325. fincas-0.4.1/webhooks/tests/test_erp_screens.py +149 -0
  2326. fincas-0.4.1/webhooks/tests/test_outbox_delivery.py +283 -0
  2327. fincas-0.4.1/webhooks/tests/test_payload_versions.py +317 -0
  2328. fincas-0.4.1/webhooks/tests/test_services.py +167 -0
  2329. fincas-0.4.1/webhooks/tests/test_trackc.py +160 -0
  2330. fincas-0.4.1/webhooks/urls.py +11 -0
  2331. fincas-0.4.1/webhooks/views.py +60 -0
fincas-0.4.1/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Fincas Contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
fincas-0.4.1/PKG-INFO ADDED
@@ -0,0 +1,216 @@
1
+ Metadata-Version: 2.4
2
+ Name: fincas
3
+ Version: 0.4.1
4
+ Summary: Django commerce and back-office platform: orders, invoicing, accounting, inventory, CRM and a storefront API
5
+ Author: Fincas Contributors
6
+ License-Expression: MIT
7
+ Project-URL: Homepage, https://github.com/Logos-Flux/fincas
8
+ Project-URL: Repository, https://github.com/Logos-Flux/fincas
9
+ Project-URL: Documentation, https://github.com/Logos-Flux/fincas/blob/main/docs/README.md
10
+ Project-URL: Changelog, https://github.com/Logos-Flux/fincas/blob/main/CHANGELOG.md
11
+ Project-URL: Issues, https://github.com/Logos-Flux/fincas/issues
12
+ Keywords: django,erp,commerce,crm,accounting,inventory,back-office,headless-commerce,orders,invoicing
13
+ Classifier: Development Status :: 4 - Beta
14
+ Classifier: Environment :: Web Environment
15
+ Classifier: Framework :: Django
16
+ Classifier: Framework :: Django :: 6.0
17
+ Classifier: Intended Audience :: Developers
18
+ Classifier: Operating System :: OS Independent
19
+ Classifier: Programming Language :: Python :: 3
20
+ Classifier: Programming Language :: Python :: 3 :: Only
21
+ Classifier: Programming Language :: Python :: 3.12
22
+ Classifier: Topic :: Office/Business
23
+ Classifier: Topic :: Office/Business :: Financial :: Accounting
24
+ Requires-Python: >=3.12
25
+ Description-Content-Type: text/markdown
26
+ License-File: LICENSE
27
+ Requires-Dist: django<6.1,>=6.0
28
+ Requires-Dist: djangorestframework<4,>=3.16
29
+ Requires-Dist: django-filter<26,>=25.2
30
+ Requires-Dist: django-cors-headers<5,>=4.9
31
+ Requires-Dist: python-dotenv<2,>=1.2
32
+ Requires-Dist: dj-database-url<4,>=3.1
33
+ Requires-Dist: whitenoise<7,>=6.12
34
+ Requires-Dist: requests<3,>=2.32
35
+ Requires-Dist: django-anymail[mailgun]<14,>=13.0
36
+ Requires-Dist: weasyprint<71,>=70.0
37
+ Requires-Dist: openpyxl<4,>=3.1
38
+ Requires-Dist: easypost<10,>=9.0
39
+ Requires-Dist: PyJWT<3,>=2.15
40
+ Requires-Dist: cryptography<51,>=50.0
41
+ Requires-Dist: httpx<1,>=0.28
42
+ Requires-Dist: mcp<2,>=1.0
43
+ Requires-Dist: boto3<2,>=1.43
44
+ Requires-Dist: pypdf<7,>=6.19
45
+ Requires-Dist: urllib3<3,>=2.8
46
+ Requires-Dist: psycopg2-binary<3,>=2.9
47
+ Requires-Dist: redis<6,>=5.0
48
+ Requires-Dist: drf-spectacular<1,>=0.28
49
+ Requires-Dist: phonenumbers<10,>=9.0
50
+ Provides-Extra: prod
51
+ Requires-Dist: uvicorn<1,>=0.51; extra == "prod"
52
+ Requires-Dist: gunicorn<26,>=25.1; extra == "prod"
53
+ Requires-Dist: sentry-sdk[django]<3,>=2.0; extra == "prod"
54
+ Dynamic: license-file
55
+
56
+ # Fincas
57
+
58
+ [![CI](https://github.com/Logos-Flux/fincas/actions/workflows/ci.yml/badge.svg)](https://github.com/Logos-Flux/fincas/actions/workflows/ci.yml)
59
+ [![PyPI](https://img.shields.io/pypi/v/fincas.svg)](https://pypi.org/project/fincas/)
60
+ [![Python 3.12](https://img.shields.io/badge/python-3.12-blue.svg)](https://www.python.org/)
61
+ [![Django 6.0](https://img.shields.io/badge/django-6.0-green.svg)](https://www.djangoproject.com/)
62
+ [![License: MIT](https://img.shields.io/badge/license-MIT-yellow.svg)](LICENSE)
63
+
64
+ Fincas is an open-source commerce and back-office platform built on Django:
65
+ quotes and orders, invoicing and a double-entry ledger, inventory and
66
+ purchasing, a CRM, and a REST API for a headless storefront. You install it as
67
+ a Python package and run it as your own Django project, extended with plugins
68
+ instead of forks.
69
+
70
+ **Status:** actively maintained, beta. One company per instance. Python 3.12,
71
+ PostgreSQL 17, Django 6.0.
72
+
73
+ > **Import name:** the PyPI distribution is `fincas`, but the Python package is
74
+ > `golden_erp` (the project's earlier name), and settings keep the `GOLDEN_*`
75
+ > prefix. You write `pip install fincas`, then
76
+ > `from golden_erp.settings.prod import *` and `include("golden_erp.urls")`.
77
+ > Both names stay as they are so existing deployments and plugins keep working.
78
+
79
+ ## Install
80
+
81
+ ### From PyPI (to run Fincas)
82
+
83
+ ```bash
84
+ python3.12 -m venv .venv && . .venv/bin/activate
85
+ pip install "fincas[prod]"
86
+ ```
87
+
88
+ Fincas is a library: your deployment is a small Django project with a
89
+ `config/settings.py` that starts from `golden_erp.settings.prod` and a
90
+ `config/urls.py` that mounts `golden_erp.urls`.
91
+ [docs/getting-started.md](docs/getting-started.md) takes you from an empty
92
+ directory to a first login; [docs/packaging.md](docs/packaging.md) covers the
93
+ settings overlay and version pinning.
94
+
95
+ WeasyPrint renders the PDFs and needs Cairo and Pango from your OS
96
+ (`libpango-1.0-0 libpangocairo-1.0-0 libcairo2` on Debian and Ubuntu).
97
+
98
+ ### From source (to work on Fincas)
99
+
100
+ ```bash
101
+ git clone https://github.com/Logos-Flux/fincas.git
102
+ cd fincas
103
+ python3.12 -m venv .venv && . .venv/bin/activate
104
+ pip install -r requirements/dev.txt
105
+ make migrate # SQLite in the working directory
106
+ make seed # demo company, catalog, customers, chart of accounts
107
+ make run # http://localhost:8000/erp/
108
+ ```
109
+
110
+ `make seed` creates the superuser `admin` with the password `admin`. That is
111
+ for a local machine only; pass `--admin-password` to `manage.py seed_demo_data`
112
+ anywhere else. The API docs are at `http://localhost:8000/api/docs/`.
113
+
114
+ [CONTRIBUTING.md](CONTRIBUTING.md) has the full development setup, including
115
+ Docker Compose and the storefront.
116
+
117
+ ## What's in it
118
+
119
+ - **Sales:** quotes with revisions, sales orders with shipment groups and
120
+ drop-ship lines, sales invoices, payments through pluggable gateways
121
+ (Stripe and manual included), coupon codes, price lists with customer-tier
122
+ breaks, tax rates.
123
+ - **Operations:** multi-warehouse stock, purchase orders and receiving, pick
124
+ tickets, carrier rates and labels (EasyPost), PDF quotes, orders, invoices
125
+ and purchase orders (WeasyPrint).
126
+ - **Accounting:** chart of accounts, fiscal periods, journal entries posted
127
+ from documents by configurable rules, trial balance checks.
128
+ - **CRM:** one party record per person or organization (merge, undo, GDPR-style
129
+ erasure), leads, pipelines and engagements with stage history, tasks,
130
+ communications, custom fields, imports from another CRM's export, and
131
+ adapters for Aircall, Gmail, ClickUp, Klaviyo and Google Ads.
132
+ - **API and storefront:** a REST API with an OpenAPI 3 schema (Swagger UI and
133
+ Redoc included), a least-privilege storefront identity, a customer portal,
134
+ and a Qwik City storefront in `storefront/`.
135
+ - **Extending it:** plugins add navigation, dashboard widgets, payment
136
+ gateways, carriers, CRM adapters, outbox consumers and URLs; HMAC-signed
137
+ outbound webhooks; a label layer to rename nouns in the staff UI; generated,
138
+ WCAG AA-checked back-office themes.
139
+ - **Assistant:** an optional AI chat drawer for staff, routed through
140
+ `llmhub`: direct provider keys (Anthropic or any OpenAI-compatible endpoint)
141
+ or your own gateway.
142
+
143
+ ## One company per instance
144
+
145
+ Each Fincas instance serves one company: one database, one `core.Company` row,
146
+ one deployment. Another company gets its own instance. System check
147
+ `core.E070` refuses a second Company
148
+ ([docs/deployment.md](docs/deployment.md#one-instance-per-company)).
149
+
150
+ ## Plugins
151
+
152
+ Fincas is extended without editing core files. A plugin is a class listed in
153
+ `GOLDEN_PLUGINS`:
154
+
155
+ ```python
156
+ # hello_fincas/plugin.py
157
+ from core.plugins import BasePlugin
158
+
159
+
160
+ class HelloPlugin(BasePlugin):
161
+ name = "hello"
162
+ verbose_name = "Hello, Fincas"
163
+ version = "0.1.0"
164
+
165
+ def get_nav_items(self):
166
+ return [{
167
+ "type": "link",
168
+ "label": "Hello",
169
+ "section": "analytics",
170
+ "url_name": "erp-dashboard",
171
+ "icon": "fas fa-chart-line",
172
+ }]
173
+ ```
174
+
175
+ ```python
176
+ # config/settings.py
177
+ GOLDEN_PLUGINS = ["hello_fincas.plugin.HelloPlugin"]
178
+ ```
179
+
180
+ [docs/plugins.md](docs/plugins.md) covers every hook, lifecycle signals, the
181
+ outbox, plugin URLs and testing a plugin.
182
+
183
+ ## LLM features
184
+
185
+ Every LLM call goes through `llmhub` and is configured on the staff-only
186
+ `/erp/llm/` page or by environment: direct provider keys (`ANTHROPIC_API_KEY`,
187
+ or `OPENAI_BASE_URL` and `OPENAI_API_KEY` for any OpenAI-compatible endpoint),
188
+ or an OpenAI-compatible gateway (`LLMHUB_MODE=gateway`,
189
+ `LLMHUB_GATEWAY_BASE_URL`). `python manage.py llmhub_check` makes one small
190
+ test call per configured purpose (`--no-live` checks resolution only).
191
+
192
+ Set `LLMHUB_ALLOWED_BASE_URLS` in production. It is empty by default, and while
193
+ it is empty any staff user can point LLM traffic, including ERP data in
194
+ prompts, at a host of their choosing from the settings page.
195
+
196
+ ## Documentation
197
+
198
+ The full index is [docs/README.md](docs/README.md). Start with:
199
+
200
+ - [Getting started](docs/getting-started.md): from `pip install` to a first login
201
+ - [Architecture](docs/architecture.md): the apps, the plugin seam, the storefront contract
202
+ - [Deployment](docs/deployment.md): Docker Compose, systemd and Fly.io, required secrets
203
+ - [Upgrading](docs/upgrading.md): versioning, deprecations and the migration contract
204
+ - [Plugins](docs/plugins.md) and [Webhooks](docs/webhooks.md)
205
+ - [Changelog](CHANGELOG.md)
206
+
207
+ ## Contributing and security
208
+
209
+ Bug reports, fixes and documentation are welcome: see
210
+ [CONTRIBUTING.md](CONTRIBUTING.md) and the [code of conduct](CODE_OF_CONDUCT.md).
211
+ Report security issues privately, as described in [SECURITY.md](SECURITY.md),
212
+ not in a public issue.
213
+
214
+ ## License
215
+
216
+ [MIT](LICENSE). Logo and brand assets: `fincas-grid-brand/`.
fincas-0.4.1/README.md ADDED
@@ -0,0 +1,161 @@
1
+ # Fincas
2
+
3
+ [![CI](https://github.com/Logos-Flux/fincas/actions/workflows/ci.yml/badge.svg)](https://github.com/Logos-Flux/fincas/actions/workflows/ci.yml)
4
+ [![PyPI](https://img.shields.io/pypi/v/fincas.svg)](https://pypi.org/project/fincas/)
5
+ [![Python 3.12](https://img.shields.io/badge/python-3.12-blue.svg)](https://www.python.org/)
6
+ [![Django 6.0](https://img.shields.io/badge/django-6.0-green.svg)](https://www.djangoproject.com/)
7
+ [![License: MIT](https://img.shields.io/badge/license-MIT-yellow.svg)](LICENSE)
8
+
9
+ Fincas is an open-source commerce and back-office platform built on Django:
10
+ quotes and orders, invoicing and a double-entry ledger, inventory and
11
+ purchasing, a CRM, and a REST API for a headless storefront. You install it as
12
+ a Python package and run it as your own Django project, extended with plugins
13
+ instead of forks.
14
+
15
+ **Status:** actively maintained, beta. One company per instance. Python 3.12,
16
+ PostgreSQL 17, Django 6.0.
17
+
18
+ > **Import name:** the PyPI distribution is `fincas`, but the Python package is
19
+ > `golden_erp` (the project's earlier name), and settings keep the `GOLDEN_*`
20
+ > prefix. You write `pip install fincas`, then
21
+ > `from golden_erp.settings.prod import *` and `include("golden_erp.urls")`.
22
+ > Both names stay as they are so existing deployments and plugins keep working.
23
+
24
+ ## Install
25
+
26
+ ### From PyPI (to run Fincas)
27
+
28
+ ```bash
29
+ python3.12 -m venv .venv && . .venv/bin/activate
30
+ pip install "fincas[prod]"
31
+ ```
32
+
33
+ Fincas is a library: your deployment is a small Django project with a
34
+ `config/settings.py` that starts from `golden_erp.settings.prod` and a
35
+ `config/urls.py` that mounts `golden_erp.urls`.
36
+ [docs/getting-started.md](docs/getting-started.md) takes you from an empty
37
+ directory to a first login; [docs/packaging.md](docs/packaging.md) covers the
38
+ settings overlay and version pinning.
39
+
40
+ WeasyPrint renders the PDFs and needs Cairo and Pango from your OS
41
+ (`libpango-1.0-0 libpangocairo-1.0-0 libcairo2` on Debian and Ubuntu).
42
+
43
+ ### From source (to work on Fincas)
44
+
45
+ ```bash
46
+ git clone https://github.com/Logos-Flux/fincas.git
47
+ cd fincas
48
+ python3.12 -m venv .venv && . .venv/bin/activate
49
+ pip install -r requirements/dev.txt
50
+ make migrate # SQLite in the working directory
51
+ make seed # demo company, catalog, customers, chart of accounts
52
+ make run # http://localhost:8000/erp/
53
+ ```
54
+
55
+ `make seed` creates the superuser `admin` with the password `admin`. That is
56
+ for a local machine only; pass `--admin-password` to `manage.py seed_demo_data`
57
+ anywhere else. The API docs are at `http://localhost:8000/api/docs/`.
58
+
59
+ [CONTRIBUTING.md](CONTRIBUTING.md) has the full development setup, including
60
+ Docker Compose and the storefront.
61
+
62
+ ## What's in it
63
+
64
+ - **Sales:** quotes with revisions, sales orders with shipment groups and
65
+ drop-ship lines, sales invoices, payments through pluggable gateways
66
+ (Stripe and manual included), coupon codes, price lists with customer-tier
67
+ breaks, tax rates.
68
+ - **Operations:** multi-warehouse stock, purchase orders and receiving, pick
69
+ tickets, carrier rates and labels (EasyPost), PDF quotes, orders, invoices
70
+ and purchase orders (WeasyPrint).
71
+ - **Accounting:** chart of accounts, fiscal periods, journal entries posted
72
+ from documents by configurable rules, trial balance checks.
73
+ - **CRM:** one party record per person or organization (merge, undo, GDPR-style
74
+ erasure), leads, pipelines and engagements with stage history, tasks,
75
+ communications, custom fields, imports from another CRM's export, and
76
+ adapters for Aircall, Gmail, ClickUp, Klaviyo and Google Ads.
77
+ - **API and storefront:** a REST API with an OpenAPI 3 schema (Swagger UI and
78
+ Redoc included), a least-privilege storefront identity, a customer portal,
79
+ and a Qwik City storefront in `storefront/`.
80
+ - **Extending it:** plugins add navigation, dashboard widgets, payment
81
+ gateways, carriers, CRM adapters, outbox consumers and URLs; HMAC-signed
82
+ outbound webhooks; a label layer to rename nouns in the staff UI; generated,
83
+ WCAG AA-checked back-office themes.
84
+ - **Assistant:** an optional AI chat drawer for staff, routed through
85
+ `llmhub`: direct provider keys (Anthropic or any OpenAI-compatible endpoint)
86
+ or your own gateway.
87
+
88
+ ## One company per instance
89
+
90
+ Each Fincas instance serves one company: one database, one `core.Company` row,
91
+ one deployment. Another company gets its own instance. System check
92
+ `core.E070` refuses a second Company
93
+ ([docs/deployment.md](docs/deployment.md#one-instance-per-company)).
94
+
95
+ ## Plugins
96
+
97
+ Fincas is extended without editing core files. A plugin is a class listed in
98
+ `GOLDEN_PLUGINS`:
99
+
100
+ ```python
101
+ # hello_fincas/plugin.py
102
+ from core.plugins import BasePlugin
103
+
104
+
105
+ class HelloPlugin(BasePlugin):
106
+ name = "hello"
107
+ verbose_name = "Hello, Fincas"
108
+ version = "0.1.0"
109
+
110
+ def get_nav_items(self):
111
+ return [{
112
+ "type": "link",
113
+ "label": "Hello",
114
+ "section": "analytics",
115
+ "url_name": "erp-dashboard",
116
+ "icon": "fas fa-chart-line",
117
+ }]
118
+ ```
119
+
120
+ ```python
121
+ # config/settings.py
122
+ GOLDEN_PLUGINS = ["hello_fincas.plugin.HelloPlugin"]
123
+ ```
124
+
125
+ [docs/plugins.md](docs/plugins.md) covers every hook, lifecycle signals, the
126
+ outbox, plugin URLs and testing a plugin.
127
+
128
+ ## LLM features
129
+
130
+ Every LLM call goes through `llmhub` and is configured on the staff-only
131
+ `/erp/llm/` page or by environment: direct provider keys (`ANTHROPIC_API_KEY`,
132
+ or `OPENAI_BASE_URL` and `OPENAI_API_KEY` for any OpenAI-compatible endpoint),
133
+ or an OpenAI-compatible gateway (`LLMHUB_MODE=gateway`,
134
+ `LLMHUB_GATEWAY_BASE_URL`). `python manage.py llmhub_check` makes one small
135
+ test call per configured purpose (`--no-live` checks resolution only).
136
+
137
+ Set `LLMHUB_ALLOWED_BASE_URLS` in production. It is empty by default, and while
138
+ it is empty any staff user can point LLM traffic, including ERP data in
139
+ prompts, at a host of their choosing from the settings page.
140
+
141
+ ## Documentation
142
+
143
+ The full index is [docs/README.md](docs/README.md). Start with:
144
+
145
+ - [Getting started](docs/getting-started.md): from `pip install` to a first login
146
+ - [Architecture](docs/architecture.md): the apps, the plugin seam, the storefront contract
147
+ - [Deployment](docs/deployment.md): Docker Compose, systemd and Fly.io, required secrets
148
+ - [Upgrading](docs/upgrading.md): versioning, deprecations and the migration contract
149
+ - [Plugins](docs/plugins.md) and [Webhooks](docs/webhooks.md)
150
+ - [Changelog](CHANGELOG.md)
151
+
152
+ ## Contributing and security
153
+
154
+ Bug reports, fixes and documentation are welcome: see
155
+ [CONTRIBUTING.md](CONTRIBUTING.md) and the [code of conduct](CODE_OF_CONDUCT.md).
156
+ Report security issues privately, as described in [SECURITY.md](SECURITY.md),
157
+ not in a public issue.
158
+
159
+ ## License
160
+
161
+ [MIT](LICENSE). Logo and brand assets: `fincas-grid-brand/`.
File without changes
@@ -0,0 +1,167 @@
1
+ """Django admin for the general ledger.
2
+
3
+ The inline formset carries real validation rather than the usual field-level
4
+ defaults, because the admin is a *writer* of journal entries and the two
5
+ invariants that matter here span rows:
6
+
7
+ * an entry's debits must equal its credits
8
+ * every line's account must belong to the entry's company
9
+
10
+ Neither can be a database constraint (both need sibling or two-hop context), so
11
+ without this the admin is a hole straight through the guarantees the importer
12
+ maintains — you can save a ledger the importer would have refused to write.
13
+ """
14
+
15
+ from django import forms
16
+ from django.contrib import admin
17
+ from django.core.exceptions import ValidationError
18
+ from django.db.models import Sum
19
+
20
+ from .models import ZERO, Account, FiscalPeriod, JournalEntry, JournalLine
21
+
22
+
23
+ @admin.register(Account)
24
+ class AccountAdmin(admin.ModelAdmin):
25
+ list_display = [
26
+ "account_number", "full_name", "account_type",
27
+ "account_subtype", "is_active", "company",
28
+ ]
29
+ list_filter = ["account_type", "account_subtype", "is_active", "company"]
30
+ search_fields = ["account_number", "name", "full_name", "qbo_id"]
31
+ readonly_fields = ["id", "created_at", "updated_at"]
32
+ autocomplete_fields = ["parent"]
33
+ ordering = ["account_number", "full_name"]
34
+
35
+
36
+ @admin.register(FiscalPeriod)
37
+ class FiscalPeriodAdmin(admin.ModelAdmin):
38
+ list_display = ["name", "start_date", "end_date", "status", "company"]
39
+ list_filter = ["status", "company"]
40
+ search_fields = ["name"]
41
+ readonly_fields = ["id", "created_at", "updated_at"]
42
+
43
+
44
+ class JournalLineInlineFormSet(forms.BaseInlineFormSet):
45
+ """Enforces the two cross-row invariants the database cannot."""
46
+
47
+ def clean(self):
48
+ super().clean()
49
+ if any(self.errors):
50
+ # Field-level errors already failed the save; a totals check on
51
+ # half-parsed rows would only add noise.
52
+ return
53
+
54
+ company_id = self.instance.company_id if self.instance else None
55
+ total_debit = ZERO
56
+ total_credit = ZERO
57
+ live_lines = 0
58
+
59
+ for form in self.forms:
60
+ # `cleaned_data` is absent on a form that never got validated, so
61
+ # read it defensively — an AttributeError here would surface as a
62
+ # 500 on save instead of a validation message.
63
+ cleaned = getattr(form, "cleaned_data", None)
64
+ if not isinstance(cleaned, dict) or cleaned.get("DELETE"):
65
+ continue
66
+ account = cleaned.get("account")
67
+ if account is None:
68
+ continue
69
+ live_lines += 1
70
+ total_debit += cleaned.get("debit_amount") or ZERO
71
+ total_credit += cleaned.get("credit_amount") or ZERO
72
+
73
+ if company_id and account.company_id != company_id:
74
+ raise ValidationError(
75
+ f"Line account {account} belongs to a different company "
76
+ f"than this journal entry."
77
+ )
78
+
79
+ if live_lines == 0:
80
+ raise ValidationError(
81
+ "A journal entry needs at least one line."
82
+ )
83
+ if total_debit != total_credit:
84
+ raise ValidationError(
85
+ f"Journal entry does not balance: debits {total_debit} != "
86
+ f"credits {total_credit}."
87
+ )
88
+
89
+
90
+ class JournalLineInline(admin.TabularInline):
91
+ model = JournalLine
92
+ formset = JournalLineInlineFormSet
93
+ extra = 0
94
+ fields = [
95
+ "sort_order", "account", "description",
96
+ "debit_amount", "credit_amount", "entity_name",
97
+ ]
98
+ ordering = ["sort_order"]
99
+
100
+ def formfield_for_foreignkey(self, db_field, request, **kwargs):
101
+ """Offer only the relevant company's accounts.
102
+
103
+ An unscoped dropdown lists every tenant's chart, which makes a
104
+ cross-company line a two-click mistake rather than something you have
105
+ to work at. On the change view the company comes from the entry; on the
106
+ add view there is no entry yet, so it comes from whatever company the
107
+ form is being submitted with.
108
+
109
+ This is a usability guard, not the boundary — a hand-crafted POST can
110
+ still name any account id. ``JournalLineInlineFormSet.clean()`` is what
111
+ actually rejects it, on both flows.
112
+ """
113
+ if db_field.name == "account":
114
+ company_id = None
115
+ entry = getattr(request, "_journalentry_being_edited", None)
116
+ if entry is not None and entry.company_id:
117
+ company_id = entry.company_id
118
+ else:
119
+ # Add flow: the chosen company is in the submitted data.
120
+ company_id = (
121
+ request.POST.get("company") or request.GET.get("company") or None
122
+ )
123
+ if company_id:
124
+ kwargs["queryset"] = Account.objects.filter(company_id=company_id)
125
+ else:
126
+ kwargs["queryset"] = Account.objects.all()
127
+ return super().formfield_for_foreignkey(db_field, request, **kwargs)
128
+
129
+
130
+ @admin.register(JournalEntry)
131
+ class JournalEntryAdmin(admin.ModelAdmin):
132
+ list_display = [
133
+ "entry_number", "entry_date", "entry_source",
134
+ "source_reference", "status", "balanced", "company",
135
+ ]
136
+ list_filter = ["entry_source", "status", "company", "entry_date"]
137
+ search_fields = ["entry_number", "source_reference", "memo", "qbo_id"]
138
+ readonly_fields = ["id", "created_at", "updated_at", "import_hash"]
139
+ date_hierarchy = "entry_date"
140
+ inlines = [JournalLineInline]
141
+
142
+ def get_queryset(self, request):
143
+ # Annotate the totals once for the whole page. Aggregating per row in
144
+ # `balanced()` is an extra query per entry on every changelist load.
145
+ return (
146
+ super()
147
+ .get_queryset(request)
148
+ .annotate(
149
+ _total_debit=Sum("lines__debit_amount"),
150
+ _total_credit=Sum("lines__credit_amount"),
151
+ )
152
+ )
153
+
154
+ @admin.display(boolean=True, description="Balanced")
155
+ def balanced(self, obj):
156
+ debit = getattr(obj, "_total_debit", None)
157
+ credit = getattr(obj, "_total_credit", None)
158
+ if debit is None and credit is None:
159
+ # Not annotated (e.g. the change form) — fall back to a query.
160
+ debit, credit = obj.totals()
161
+ return (debit or ZERO) == (credit or ZERO)
162
+
163
+ def get_form(self, request, obj=None, **kwargs):
164
+ # Stashed so the inline can scope its account dropdown to this entry's
165
+ # company; the inline has no other route to the parent object.
166
+ request._journalentry_being_edited = obj
167
+ return super().get_form(request, obj, **kwargs)
@@ -0,0 +1,66 @@
1
+ """Accounting DRF API (Step 1b): fiscal periods + close/reopen actions."""
2
+
3
+ from django.db.models import Count, F, Q
4
+ from rest_framework import status as drf_status
5
+ from rest_framework.decorators import action
6
+ from rest_framework.response import Response
7
+
8
+ from core.views import CompanyScopedViewSet
9
+
10
+ from .models import FiscalPeriod, JournalEntry
11
+ from .periods import PeriodCloseError, close_period, reopen_period
12
+ from .serializers import FiscalPeriodSerializer
13
+
14
+
15
+ class FiscalPeriodViewSet(CompanyScopedViewSet):
16
+ queryset = FiscalPeriod.objects.order_by("-start_date")
17
+ serializer_class = FiscalPeriodSerializer
18
+ filterset_fields = ["status", "company"]
19
+ search_fields = ["name"]
20
+ ordering_fields = ["start_date", "end_date"]
21
+
22
+ def get_queryset(self):
23
+ qs = super().get_queryset()
24
+ return qs.annotate(
25
+ draft_entry_count=Count(
26
+ "company__journal_entries",
27
+ filter=Q(
28
+ company__journal_entries__status=JournalEntry.Status.DRAFT,
29
+ company__journal_entries__entry_date__gte=F("start_date"),
30
+ company__journal_entries__entry_date__lte=F("end_date"),
31
+ ),
32
+ )
33
+ )
34
+
35
+ def _refuse(self, exc: PeriodCloseError):
36
+ return Response(
37
+ {"detail": str(exc)}, status=drf_status.HTTP_409_CONFLICT
38
+ )
39
+
40
+ @action(detail=True, methods=["post"], url_path="close")
41
+ def close(self, request, pk=None):
42
+ if not request.user.is_staff:
43
+ return Response(
44
+ {"detail": "Staff only."},
45
+ status=drf_status.HTTP_403_FORBIDDEN,
46
+ )
47
+ period = self.get_object()
48
+ try:
49
+ close_period(period)
50
+ except PeriodCloseError as exc:
51
+ return self._refuse(exc)
52
+ return Response(self.get_serializer(period).data)
53
+
54
+ @action(detail=True, methods=["post"], url_path="reopen")
55
+ def reopen(self, request, pk=None):
56
+ if not request.user.is_staff:
57
+ return Response(
58
+ {"detail": "Staff only."},
59
+ status=drf_status.HTTP_403_FORBIDDEN,
60
+ )
61
+ period = self.get_object()
62
+ try:
63
+ reopen_period(period)
64
+ except PeriodCloseError as exc:
65
+ return self._refuse(exc)
66
+ return Response(self.get_serializer(period).data)
@@ -0,0 +1,7 @@
1
+ from django.apps import AppConfig
2
+
3
+
4
+ class AccountingConfig(AppConfig):
5
+ default_auto_field = "django.db.models.BigAutoField"
6
+ name = "accounting"
7
+ verbose_name = "Accounting (General Ledger)"