Commit Graph

177 Commits

Author SHA1 Message Date
Ali 6c395f9e3b fix(bank-integration): no checkbox flicker + keep "use original description" on mode change
Two BRT polish fixes:
- The checkbox column was added by destroying and rebuilding the
  DataTable after each "Get Unreconciled Entries", which visibly redrew
  the rows. Replaced with a wholesale override of DataTableManager's
  get_datatable that creates the table with checkboxColumn:true from the
  start and injects the toolbar there — no rebuild, no flicker. The
  render-event polling is gone.
- _applyModeVisibility unconditionally un-hid "Custom Purpose Keyword"
  when leaving "Documents & Reconcile" mode, overriding the effect of
  the "Use original description" checkbox. Now it re-applies the
  checkbox state after the mode-driven visibility pass.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-11 13:21:52 +00:00
Ali 71e2c06a35 fix(bank-integration): port kapital_bank's proven BRT dialog into jey_erp
The first jey_erp BRT implementation read row.name from dtm.transactions,
but those rows are arrays (per ERPNext's DataTableManager.format_row), so
the BT name was always undefined ("Could not resolve Bank Transaction
names"). Replaced it with a faithful port of kapital_bank's BRT
extension: the same checkbox column, "Create & Reconcile" toolbar, and
3-mode dialog (Both / Mappings Only / Documents & Reconcile), reading
the BT name from the row array the way kb did.

The dialog gains a "Mapping Source" select (defaulting from the Bank
Account's hidden bank_integration field, written back on submit). For a
Bank Integration source it calls the new
jey_erp.bank_integration.create_reconcile.create_purpose_mappings (a
port of kapital_bank/mapping.py adapted for the multi-record Bank
Integration doctype and Bank Integration Purpose); for a Kapital Bank
Settings source it calls kapital_bank.mapping.create_purpose_mappings
directly, leaving kb's proven backend untouched.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-11 13:10:11 +00:00
Ali b4b1d1b9b6 fix(bank-integration): re-add BRT checkbox column on every "Get Unreconciled Entries"
The checkbox column + Create & Reconcile toolbar setup was on the form's
`refresh` event, which fires only once. On a second "Get Unreconciled
Entries" ERPNext rebuilds the DataTableManager without the checkbox
column and the polling interval never restarted. Moved the enhancement
to the `render` event (fires on every rebuild), matching the pattern
the kapital_bank BRT extension used. The prototype patch that adds the
"Bank Transaction" column stays on `refresh` since it is idempotent.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-11 13:02:53 +00:00
Ali f1876b6088 reverse changes push 2026-05-11 12:45:28 +00:00
Ali 3c1dee9a72 feat(bank-integration): redesign Excel Preset UX with Detect & preview
Standard Field is now a Link to a new "Bank Integration Standard Field"
doctype (autoname=Prompt). Each entry holds a display name like "Date" /
"Reference Number" — the field that the user picks in Column Mappings —
and a `field_name` column with the technical key used by the parser.
Twelve standard fields ship as a fixture. The change replaces the old
Select with technical names (date, reference_number, debit, ...) which
were noisy in the UI.

Excel Preset gets two new fields:
  - sample_file (Attach) — user uploads a sample of their bank's xlsx
  - preview_html (HTML) — first 5 rows are rendered after detection

A "Detect Columns from Sample" custom button on the form calls a new
whitelisted endpoint detect_columns_from_sample() that reads the header
row + first 5 data rows. The Column Mappings table is repopulated with
one row per Excel header (Standard Field left empty for the user to
fill in), and the preview HTML shows what the parser actually sees so
the user can validate header_row / skip_rows. After detection the
sample File doc is removed via delete_sample_file().

excel_parser now resolves row.standard_field through Standard Field
to obtain the technical field_name. The Generic Bank Statement fixture
is updated to reference the new Link values.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-08 16:53:10 +00:00
Ali f35b19cf14 feat(bank-integration): universal Excel-based bank statement import
Adds 10 doctypes (Bank Integration + 4 child mapping tables + 3
registries + Excel Preset + Excel Column Mapping), 7 backend modules
(parser, import API, matching, creation, mapping resolver, create &
reconcile, migrations), 3 JS files, and a Generic Excel preset fixture.

Two hidden Dynamic Link custom fields on Bank Account
(bank_integration_type / bank_integration) point to either the new
Bank Integration record or the existing Kapital Bank Settings, letting
the universal Create & Reconcile in BRT read mappings from either source
through one resolver. Both apps now share an "Import From..." dropdown
on Bank Transaction list.

Plan and rationale: BANK_INTEGRATION_PLAN.md.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-08 16:23:44 +00:00
Ali cae1de7682 feat(landed-cost-voucher): item-driven taxes table with vendor invoice import
Replaces the free-text description in Landed Cost Taxes and Charges with a
service-item link, drives expense_account from a new Item.default_landed_cost_account,
adds an in-form "Get Items from Vendor Invoices" button, and validates totals
against vendor invoices on submit. Also fixes ERPNext's no-op items_remove
(its `this.trigger` call hits a non-existent method) so applicable_charges
recalculate correctly when rows are deleted from items or taxes.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-06 16:01:41 +00:00
Ali 91268cc466 feat(default-data): auto-sync leave types and company defaults on migrate
Mirrors the salary-component pattern for two more pieces of master data:

- sync_leave_types(): full upsert from default_data/leave_types.json.
  Creates missing, updates existing, deletes those no longer in JSON.
  Leave Type has no `disabled` field, so when a deletion fails due to
  linked Leave Allocation/Application records, the sync logs and skips
  (vs. marking disabled like Salary Component does).

- sync_company_defaults(): for every Company, resolves each account_number
  in default_data/company_defaults.json to the company-scoped Account
  name and sets the corresponding Company field. Non-destructive: if
  the company has no account with that number, the field is left as-is.

Both hooked into after_migrate_combined after sync_salary_components,
since Leave Type's earning_component references a Salary Component.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-01 12:55:27 +00:00
Ali eef0c82032 chore(default-data): refresh salary components and leave types from accountant
Updated bookkeeper-supplied master data:
- leave_types.json: leave types restructured per AZ Labor Code articles
  (Maddə 95, 130.e, 143.1.4, …) — names now reference statute, flags
  adjusted accordingly.
- salary_components.json: "Keyfiim bonusu" renamed to "Premiya";
  obsolete disabled components removed.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-01 12:48:15 +00:00
Ali 408bacfc84 feat(salary-components): auto-sync from default_data on migrate
Adds sync_salary_components() — full upsert from default_data JSON:
creates missing components, updates existing ones (formula, condition,
flags, accounts), and deletes those no longer in the JSON. If a
component cannot be deleted due to linked records, it is marked
disabled instead. Idempotent and safe to re-run.

Hooked into after_migrate_combined so every "bench migrate" picks up
the latest formulas — single source of truth is the JSON file.

Replaced default_data/salary_components.json with the current
production export (14 components, formulas use the f(base) + g(LE)
pattern for separate ƏH/MK accounting).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-01 12:45:11 +00:00
Ali 3aa4e61a1d perf: idempotent bulk update for custom fields on migrate
Replace per-field delete+create loop (which forced ALTER TABLE on all 222
custom fields every migrate) with idempotent bulk update that only writes
when a field's definition actually changed. Saves with ignore_version=True
to bypass the Frappe Version diff bug that crashes on certain int values.

Also remove the top-level create_custom_fields() call so the function only
runs from after_migrate, not on every module import.

Optional JEY_ERP_FORCE_RECREATE_FIELDS=1 env var preserves the old
delete+create path for development.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-28 10:55:21 +00:00
Ali 511e91cbf1 new translations 2026-04-24 20:29:53 +00:00
Ali 5d1e2adee3 feat(company): add E-Taxes reference sections to Tax Policy tab
Adds six new collapsible sections at the very end of the Tax Policy
tab on Company form, each with an HTML field for a reference-data
table rendered by invoice_az/client/company.js:
- E-Taxes Objects
- Cash Registers
- POS Terminals
- Bank Accounts
- Obligation Pacts
- Presented Certificates

Tax Closing Wizards moved to the bottom (insert_after changed from
accounting_method to presented_certificates_list_html) so wizards
sit under the new sections.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-21 13:59:41 +00:00
Ali cf4d66c2d2 feat: add Tax Free tab to Salary Slip with Tax Free Indicator DocType
Adds a Tax Free tab to Salary Slip with 4 nested sub-tabs (Vergi, MDSS,
İşsizlik sığorta, İcbari Tibbi Sığorta) rendered via the custom_subtabs
app. Each sub-tab has a Göstəricilər (Link to Tax Free Indicator, filtered
by group) and an Amount (Currency) field arranged in two columns.

Introduces a new Tax Free Indicator tree DocType mirroring the tax_article
pattern from taxes_az, seeded via fixtures with 74 indicators scraped from
the e-taxes.gov.az unified declaration (32 Vergi + 30 MDSS + 5 İşsizlik
+ 7 İcbari Tibbi Sığorta) grouped under 4 roots.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-14 11:06:04 +00:00
Ali 72f9973000 feat: also rename default groups after setup wizard completion
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-06 15:33:23 +04:00
Ali 5ea710d77c feat: rename default Item/Supplier Groups to Azerbaijani
Add rename_default_groups.py that uses frappe.rename_doc to rename
standard ERPNext groups (Products -> Məhsullar, etc.) instead of
modifying ERPNext source files directly. Runs on after_migrate.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-06 15:30:00 +04:00
Ali 09af27e22b added new fields 2026-04-02 20:36:50 +04:00
Ali a9d18c05db fix Link field dropdown not opening on focus when value is already set
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 19:34:44 +04:00
Ali aa9d5640c0 remove broken account_tree_custom.js, fix COA balance offset
Removed account_tree_custom.js which caused console errors due to
accessing undefined treeview fields. Export functionality is already
available via account_list.js.

Added CSS fix for Chart of Accounts tree view where account balances
were visually shifted down by one row due to float:right on balance-area.
Fix uses flexbox on tree nodes instead.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-27 17:04:35 +04:00
Ali fa1efba44d renewed company_defaults 2026-03-26 17:44:45 +04:00
Ali ad1f6783b5 use account_number instead of account_name for company defaults export/import
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-26 17:35:31 +04:00
Ali ac7a3fe42e move Company Export Defaults button from list to form view
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-26 17:23:37 +04:00
Ali ee421cf613 add Company default accounts export/import
- Export: company_export.py exports all Link-to-Account fields as account_name
- Import: create_default_company_accounts() resolves account names to full accounts in new company, applied via setup_wizard_complete
- JS: Export Defaults button in Company list view downloads company_defaults.json
- default_data/company_defaults.json: initial defaults

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-26 17:10:46 +04:00
Ali ea5847b353 fix NameError: restore company variable in create_default_salary_components
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-26 16:41:41 +04:00
Ali 6b3324704c update default salary components data with accounts
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-26 16:36:48 +04:00
Ali fae51ca7ef export SC accounts as account_name, resolve to full account on import
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-26 16:31:24 +04:00
Ali 0699beb3ba fix SC accounts validation error; delete default HRMS leave types on setup
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-26 16:26:18 +04:00
Ali b91ff07f56 add default leave types data
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-26 16:16:21 +04:00
Ali 4c2eb7e400 add Leave Type export button and default setup from JSON
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-26 16:04:06 +04:00
Ali dc273b3f2b fix IBAN masking: support alphanumeric chars, keep AZ prefix
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-26 15:43:16 +04:00
Ali df9f72be11 add Chart of Accounts export button to list and tree views
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-26 15:24:00 +04:00
Ali 989cce52b4 delete default HRMS salary components on setup wizard complete
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-26 15:03:42 +04:00
Ali 6f17b644f2 update default salary components data
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-26 14:53:18 +04:00
Ali 7cd7b5d887 add salary component export button and default setup from JSON
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-26 14:46:40 +04:00
Ali 116efda4f2 add test setup_wizard_complete hook that creates TEST COMP salary component
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-26 14:27:41 +04:00
Ali 24934219f1 added test salary component create 2026-03-26 14:19:38 +04:00
Ali b8b111b74a hide residence_permit_fin when not_available checkbox is checked
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-26 13:55:44 +04:00
Ali 0a0ef3d032 add Employee custom fields: citizenship_country, residence_permit_fin, residence_permit_not_available
Fields added as Small Text (TEXT in MySQL) to bypass tabEmployee's 65535-byte
row size limit. Added two pre_model_sync patches to fix row format and add
columns directly before Frappe schema sync runs.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-25 20:56:34 +04:00
Ali f7d283cdf1 add job_applicant custom field to Employee to fix EmployeeMaster AttributeError
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-25 20:08:54 +04:00
Ali 1c292a130f add Employee custom fields: father_name, identification_number, ssn
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-25 18:45:45 +04:00
Ali 2c7eadc1cd add absent_reason field to Attendance doctype
Adds a Select field 'Absence Reason' visible only when status is Absent,
with 12 predefined Azerbaijani-language absence reason options.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-25 17:24:40 +04:00
Ali a66945f7d7 added load from cbar currency import 2026-03-12 18:53:47 +04:00
Ali eb62cafbcf brt is now wide and has a bt links 2026-03-11 15:33:33 +04:00
Ali 67518bf4a0 added tittles to je 2026-03-06 23:45:56 +04:00
Ali 0eaa407c1d revert all JE title changes, keep only deductions logic
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-06 23:34:44 +04:00
Ali 378ccd33ee added tittles to je 2026-03-06 23:24:12 +04:00
Ali f76b09116b added tittles to je 2026-03-06 23:18:50 +04:00
Ali a7deb77e09 added tittles to je 2026-03-06 23:12:53 +04:00
Ali d9c3b02fdc added tittles to je 2026-03-06 23:06:06 +04:00
Ali 4a15e83498 added tittles to je 2026-03-06 22:56:24 +04:00