OpenERP is a wholesale distribution ERP inspired by Prophet 21 / Epicor P21. It targets companies that buy goods, warehouse them, and resell them: industrial supply, HVAC, electrical, plumbing, fasteners, flow parts, and similar B2B distributors.
Built on SAP ADS / SAP ACE (ADT format), PHP REST API, and Vue 3 + Vite frontend. Not affiliated with Odoo or the historical OpenERP product.
Phase 1-6 complete. The system handles a full B2B distribution workflow end-to-end: procurement through receiving, sales through invoicing, multi-warehouse inventory with FIFO costing, bank reconciliation, multi-currency, US sales tax, sales operations depth, and audit logging throughout.
General Ledger
- Chart of accounts with account types and subtypes
- Fiscal years and periods; period close flag
- Journal batches with balanced journal entries; batch posting
- Subledger-to-GL auto-posting from every AR, AP, SO, inventory, and memo event
- Trial Balance, Income Statement, Balance Sheet
- GL account balances with cumulative YTD recomputation after out-of-order posting
Accounts Receivable
- Customer master with credit limit, credit hold, and on-hold enforcement at SO entry
- Customer classes
- Customer contacts
- Multiple ship-to addresses per customer
- AR invoices with lines, subtotal, tax, total, balance
- US sales tax engine: jurisdiction rates (city → county → state cascade), exemption certificates per customer, per-line jurisdiction override on invoices
- Cash receipts and payment application to invoices
- Credit memos with application to open invoices
- Invoice write-off (bad debt GL posting)
- Void controls for invoices and payments
- AR aging report, customer statement view
- Recurring invoice templates
- Customer-specific price lists with per-item overrides and price lookup on SO entry
- Customer contracts with fixed item pricing
- Customer deposits / prepayments with invoice application and void workflow
- Sales quotes (DRAFT/SENT/ACCEPTED/EXPIRED; convert to SO)
- Credit hold enforcement: hard-block SO creation if on hold or over credit limit
Accounts Payable
- Vendor master with tax ID, 1099 flag, and foreign currency support
- AP bills with lines; vendor invoice number capture
- Multi-currency bills: foreign amount + exchange rate; FX gain/loss computed on payment application
- Payment entry and application to bills
- Debit memos with application to open bills
- Void controls for bills and payments
- AP aging report
- Purchase requisitions → PO approval workflow (DRAFT/PENDING/APPROVED/REJECTED/CONVERTED)
- RFQ with vendor quote comparison; select winner; convert to PO
- Vendor item catalog: vendor SKU, lead times, MOQ, packing qty, last cost, preferred flag
- Vendor rebate agreements: accrue at PO receipt, settle to AP debit memo
- 1099 vendor report: year-end payment summary by vendor with minimum amount filter
Items and Inventory
- Item master: categories, UOM, UOM conversions, cost methods, list price, ABC class, reorder point/qty, min/max
- Lot number tracking with received and expiry dates
- Item cross-references (CUSTOMER, COMPETITOR, UPC, MPN)
- Item substitutes with priority ranking
- HTS codes, country of origin, tariff rates; TARIFF landed cost component auto-computed
- Inventory transaction history (RECEIPT, SHIPMENT, ADJUSTMENT, TRANSFER_OUT/IN, RETURN_IN/OUT)
- Manual inventory adjustments with GL posting
- On-hand quantity computed from signed transaction sum
Multi-Warehouse
- Warehouse master with bin/rack/shelf locations
- Warehouse transfer orders (TRANSFER_OUT + TRANSFER_IN inventory transactions)
- Per-warehouse inventory view
- Bin assignment on inventory adjustments, SO shipments, and PO receipts
FIFO Cost Layers and Landed Cost
- FIFO cost layers: PO receipts push layers; SO shipments consume oldest-first
- Landed cost allocation to PO receipt FIFO layers (ocean freight, customs duty, brokerage, insurance, tariff)
- Tariff component auto-computed from item HTS tariff rates
- Inventory valuation report (FIFO layers by item and warehouse)
Inventory Planning and Counting
- Physical inventory count with snapshot, variance entry, variance approval, and GL posting
- Cycle count scheduling by item, warehouse, and ABC class
- Reorder point / min-max; reorder suggestions report
- Inbound container/shipment register: vessel, voyage, ports, ETA/ATA, customs status, linked POs
Sales Orders
- SO header + lines with customer, item, qty, price, tax, discount
- FIFO cost consumption for COGS on shipment
- Open/partial/shipped/invoiced/cancelled status flow
- SO → AR invoice action
- Back-order creation from partially shipped orders
- Available-to-promise (ATP) display on SO lines
- Promise dates per SO line
- Quantity price breaks in price lookup
- Matrix pricing by customer class and item category
- Blanket orders with release-to-SO workflow
- Counter sales: ship, invoice, receive payment, and post GL in one flow
- RMA workflow: receive returns, create RETURN_IN inventory transactions, and approve credits
- Will call / dock slip workflow
- Sales rep assignment and commission reporting
- Carrier and freight fields
- Drop shipment: SO line flagged drop-ship; linked PO created with customer ship-to address; PO receive marks SO line SHIPPED
- Credit hold + credit limit enforcement at SO entry; live credit status banner
- Print view for sales orders
Carriers and Shipping
- Carrier master
- Ship method master
- Carrier assignment on SO and PO headers
- Freight amount on sales orders
- Dock slip print view for will-call/customer pickup
Purchase Orders
- PO header + lines with vendor, item, qty, unit cost
- Receiving against open PO lines; receipt records and receipt lines
- FIFO layer push on receipt; drop-ship POs skip inventory and link directly to SO lines
- PO → AP bill action; po_line_id stored on bill lines for three-way matching
- Three-way matching report (PO qty vs received qty vs billed qty; exception filter)
- Print view for purchase orders
Procurement Workflow
- Purchase requisitions: create → submit → approve/reject → convert to PO
- RFQ: send to multiple vendors → vendors respond with quote lines → select winner → convert to PO
- Vendor rebates: PERCENT or FIXED_PER_UNIT rates; accrue on PO receipts by date range; settle to AP debit memo
Multi-Currency
- Currencies table with base currency flag; exchange rates by currency and date
- AP vendors and bills support foreign currency: foreign_amount + exchange_rate stored
- FX gain/loss computed on AP payment application (proportion of foreign amount × payment-date rate vs booked amount)
- GL: FX gain/loss posted to configured gl_fx_gain_loss_account
Bank Reconciliation
- Bank account master linked to GL cash account
- Statement lines (manual entry); positive = deposit, negative = payment
- Match/unmatch each statement line to an AR or AP payment
- Reconciliation view: summary tiles + all statement lines + unmatched book payments side panel
Security and Admin
- JWT authentication; RBAC groups and permissions; route-level permission guards
- User and group administration screens
- Audit log on all data-changing routes (35 call sites)
- ADS-level DD security: openerp_app (full R/W) / openerp_ro (read-only) per-table grants
- Company configuration key-value store; GL account defaults for auto-posting
Infrastructure
- Pagination and search on all list endpoints
- Frontend + backend input validation (useValidation.js / Validator.php)
- Error boundary wrapping router-view
- Shared Pagination.vue component across all list pages
- Dashboard KPIs: cash, AR, AP, overdue, open SO/PO count and value
See todo.md for the full prioritized backlog. Key gaps:
- Item supersession (permanent replacement, different from substitutes)
- Serial number tracking
- Item kits / light assembly (BOM)
- Packaging configuration (inner/master/pallet qty)
- Freight class, weight, and dimensions on items
- Item stocking analysis (turns, EOQ, safety stock)
- Auto-replenishment (nightly job: below reorder point → draft PO)
- Year-end close workflow
- GL budgeting and budget-vs-actual report
- Fixed assets and depreciation
- Cash application batch
- Check printing and positive pay file
- ACH/EFT payment file export
- Vendor scorecard (on-time delivery %, fill rate)
- PDF generation (invoices, POs, packing lists, statements)
- CSV/Excel export across all lists
- EDI (850/856/810) and e-commerce order import
- Multi-branch / multi-entity
| Phase | Theme | Status |
|---|---|---|
| 1 | GL, AR, AP, Items core | Complete |
| 2 | Auth, SO/PO, inventory quantity, audit | Complete |
| 3 | Multi-warehouse, FIFO, landed cost, lot tracking, cycle counts | Complete |
| 4 | Procurement depth, sales quotes, multi-currency, sales tax, credit hold, drop ship | Complete |
| 5 | Bank reconciliation, 1099 reporting | Complete |
| 6 | Sales operations depth: backorders, ship-to, reps, ATP, pricing depth, blankets, RMA, counter sales, will call, deposits, carriers | Complete |
| 7 | Item and inventory depth: supersession, serial tracking, kitting, consignment, auto-replenishment | Planned |
| 8 | Financial completeness: year-end close, budgets, fixed assets, check printing, ACH, positive pay | Planned |
| 9 | Documents and communication: PDF generation, email, EDI setup | Planned |
| 10 | Automation and integration: EDI, e-commerce, scheduled reports, vendor scorecard | Planned |
| 11 | Enterprise: CRM, portals, multi-branch, BI, 2FA, CPQ | Long-term |
The intended core flow is:
- Create vendors, items, customers, warehouses, bins, tax settings, terms, and GL defaults.
- Enter purchase requisitions or RFQs when buying needs appear.
- Convert approved procurement demand into purchase orders.
- Receive purchase orders into warehouses and bins.
- Push received quantities into FIFO cost layers and inventory transactions.
- Allocate landed costs and tariffs onto receipt layers when applicable.
- Enter sales quotes, blanket releases, counter sales, or sales orders.
- Price sales lines through contract pricing, customer price lists, matrix pricing, quantity breaks, and list price fallback.
- Check credit holds, credit limits, ATP, promised dates, ship-to address, carrier, and will-call handling at order entry.
- Ship sales orders, consume FIFO layers, create SHIPMENT transactions, and post COGS.
- Invoice shipped orders into AR.
- Apply customer payments, deposits, credit memos, or write-offs.
- Match AP bills to POs and receipts; pay vendors.
- Reconcile bank statement lines against AR and AP payments.
- Review GL, inventory valuation, three-way matching, AR/AP aging, commissions, 1099, and operational reports.
Recommended README screenshots once the UI stabilizes:
- Dashboard KPI view
- Sales order entry with ATP, promise dates, ship-to, carrier, and pricing
- Purchase order receiving with FIFO/warehouse/bin fields
- Inventory item detail with lots, substitutes, xrefs, and valuation
- GL reports: Trial Balance, Income Statement, Balance Sheet
- Bank reconciliation screen
- RMA and counter sales screens
- Admin users/groups and ADS security overview
backend/php/
api/ REST front controller (index.php) and module route files
auth/ Login, JWT issue
gl/ General Ledger
ar/ Accounts Receivable
ap/ Accounts Payable
items/ Item master, categories, UOM, lots, xrefs, substitutes
so/ Sales Orders + drop-ship
po/ Purchase Orders + receiving + three-way match
pricelists/ Price lists and customer assignment
reports/ Trial Balance, Income Statement, Balance Sheet, orders, 1099
admin/ Company config, audit log, users, groups, permissions
recurring/ Recurring AR invoice templates
warehouses/ Warehouse master, bins, per-warehouse inventory
transfers/ Warehouse transfer orders
landed-costs/ Landed cost shipments and allocations
counts/ Physical inventory counts
cycle-counts/ Cycle count scheduling
vendor-items/ Vendor item catalog
inbound-shipments/ Inbound container/shipment register
requisitions/ Purchase requisitions + approval workflow
rebates/ Vendor rebate agreements and accruals
rfq/ RFQ and vendor quote comparison
sq/ Sales quotes
currencies/ Currencies and exchange rates
sales-tax/ US sales tax jurisdictions and exemptions
bank-recon/ Bank accounts and statement reconciliation
dashboard/ Dashboard KPI endpoint
config/ database.php default development config; keep real credentials local
lib/ Connection.php Response.php Router.php Auth.php
Validator.php GlPost.php Inventory.php
frontend/
src/
pages/ Vue page components by module
services/ api.js (Axios client with all API namespaces)
router/ index.js (route definitions with perm guards)
store/ Pinia stores (auth)
components/ Pagination.vue, ErrorBoundary.vue
composables/ useValidation.js
package.json Vite/Vue dependency definitions
schema/
01_shared.sql Sequences, payment_terms, tax_codes
02_gl.sql GL accounts, fiscal years, periods, batches, entries, balances
03_ar.sql AR customers, invoices, invoice lines, payments, payment apps
04_ap.sql AP vendors, bills, bill lines, payments, payment apps
05_items.sql Item master, categories, UOM
06_newseqkey.sql Reference — NewSeqKey function SQL (installed by create_dd.php)
07_auth.sql user_groups, permissions, group_permissions, users
08_company.sql company_config key-value store
09_inventory.sql inventory_transactions
10_so.sql so_headers, so_lines
11_po.sql po_headers, po_lines, po_receipts, po_receipt_lines
12_price_lists.sql price_lists, price_list_items, customer_price_lists
13_audit.sql audit_log
14_recurring.sql recurring_templates, recurring_lines
15_memos.sql ar_credit_memos, ar_cm_apps, ar_write_offs, ap_debit_memos, ap_dm_apps
16_warehouses.sql warehouses, bin_locations (+ ALTERs on inventory_transactions, items)
17_transfers.sql wh_transfers, wh_transfer_lines
18_fifo.sql inv_cost_layers (FIFO)
19_landed_cost.sql lc_shipments, lc_allocations
20_counts.sql pi_headers, pi_lines, cycle_counts (+ reorder/min/max/abc on items)
21_lots.sql lot_numbers (+ ALTER inventory_transactions ADD lot_id)
22_xrefs.sql xref_items, item_substitutes
23_hts.sql ALTER items ADD hts_code, country_of_origin, tariff_rate
24_vendor_items.sql vendor_items
25_threeway.sql ALTER ap_bill_lines ADD po_line_id
26_containers.sql inbound_shipments, shipment_pos
27_requisitions.sql pr_headers, pr_lines
28_rebates.sql rebate_agreements, rebate_accruals
29_rfq.sql rfq_headers, rfq_lines, rfq_quotes, rfq_quote_lines
30_sales_quotes.sql sq_headers, sq_lines
31_currencies.sql currencies, exchange_rates (+ ALTER ap_vendors, ap_bills)
32_sales_tax.sql sales_tax_jurisdictions, tax_exemptions (+ ALTER ar_invoice_lines)
33_credit_limits.sql ALTER ar_customers ADD on_credit_hold
34_drop_ship.sql ALTER so_lines, po_headers, po_lines for drop-ship fields
35_bank_recon.sql bank_accounts, bank_statement_lines
36_shipto.sql customer_shipto and SO ship-to fields
37_backorders.sql back-order source link and backorder reporting
38_price_breaks.sql quantity price breaks
39_sales_reps.sql sales reps, customer defaults, commissions
40_promise_dates.sql promised ship dates on SO lines
41_customer_classes.sql customer class master and customer FK
42_contacts.sql customer contacts
43_contracts.sql customer contract pricing
44_matrix_pricing.sql customer-class/category matrix pricing
45_rma.sql RMA headers, lines, and return reasons
46_counter_sales.sql counter-sale flags and payment links
47_blanket_orders.sql blanket order headers and lines
48_will_call.sql will-call flag and dock slip support
49_deposits.sql customer deposits / prepayments
50_carriers.sql carriers and ship methods
tools/
create_dd.php Create/update SAP ADS data dictionary and schema (run to bootstrap)
setup_users.php One-time ADS user/permissions bootstrap (run after create_dd.php)
seed.php Seed payment terms, tax codes, chart of accounts
seed_auth.php Seed permissions, groups, and default admin user
diag_*.php Local-only SAP ADS diagnostics (not committed)
Generated ADS data files (data/), frontend build output (frontend/dist), and node_modules are intentionally excluded from version control.
SAP ADS / SAP ACE:
| File type | Extension |
|---|---|
| Data dictionary | .add |
| Tables | .adt |
| Indexes | .adi |
| Memo fields | .adm |
| PHP extension | php_ads |
| SQL dialect | ADS SQL |
Primary keys are CHAR(13) generated by the NewSeqKey(cField) DD function:
AC26-00000001
^^ two-char entity mnemonic
^^ two-digit year
^^^^^^^^ zero-padded sequence
Logical values use .T. / .F. (not TRUE/FALSE/1/0).
Plain PHP REST API:
api/index.php— front controller; loads all route filesapi/*/routes.php— module route handlers registered on a sharedRouterinstancelib/Connection.php— ADS connection,esc(),fk_val(),bool_val(),db_new_key(),db_fetch_all(),db_execute(),db_audit(),db_exists(),db_count(),db_now(),pagination_sql()lib/GlPost.php—gl_post_batch()for subledger-to-GL auto-postinglib/Inventory.php—fifo_push(),fifo_consume(),fifo_avg_cost()for FIFO cost layers
All module routes require JWT authentication except POST /auth/login.
Vue 3 SPA with Vite:
- Vue 3 Composition API with
<script setup> - Vue Router with per-route permission guards
- Pinia for auth state
- Axios with JWT interceptor
- Sidebar nav with collapsible sections: Financials, Sales, Purchasing, Inventory, Admin
cv(obj, key)helper normalises SAP ACE uppercase field names to lowercase on all components
C:\php\php.exe -c C:\php\php_sapads.ini F:\OpenERP\tools\create_dd.phpDefault dictionary path: E:\Development\OpenERP\data\openerp.add
Re-running is safe — existing tables and indexes are silently skipped.
C:\php\php.exe -c C:\php\php_sapads.ini F:\OpenERP\tools\setup_users.phpCreates openerp_app (full R/W) and openerp_ro (read-only) database users, registers all tables in the DD catalog, grants per-table permissions, and enables anonymous-connection blocking. Idempotent.
Run seed scripts before setup_users.php enables anonymous-connection blocking, or update them to use openerp_app credentials first.
C:\php\php.exe -c C:\php\php_sapads.ini F:\OpenERP\tools\seed.php
C:\php\php.exe -c C:\php\php_sapads.ini F:\OpenERP\tools\seed_auth.phpDefault login after seeding: admin / admin — change immediately.
C:\php\php.exe -c C:\php\php_sapads.ini -S localhost:8081 -t F:\OpenERP\backend\php\api F:\OpenERP\backend\php\api\index.phpThe trailing index.php is the router script and is required. Port: 8081.
cd E:\Development\OpenERP\frontend
node node_modules\vite\bin\vite.jsUse the real E:\ path — F:\OpenERP is a subst alias and breaks Vite's path-containment check, causing source files to be served untransformed (blank page). Port: 5173.
After a fresh bootstrap, verify the application with this smoke test:
- Run
create_dd.phpwithC:\php\php_sapads.ini. - Run
seed.phpandseed_auth.php. - Run
setup_users.phpif ADS DD security is being enabled. - Start the PHP API on port
8081. - Start Vite from
E:\Development\OpenERP\frontendon port5173. - Log in as the seeded admin user, then change the password.
- Open the dashboard and confirm KPIs load.
- Create or inspect a customer, vendor, item, warehouse, and GL account.
- Create a purchase order, receive it, and confirm inventory on-hand changes.
- Create a sales order, ship it, invoice it, and confirm AR/inventory/GL effects.
- Run AR aging, AP aging, inventory valuation, three-way matching, and GL reports.
- Create a bank statement line and match it to an AR or AP payment.
- Confirm audit log entries appear for data-changing actions.
backend/php/config/database.php defines:
- SAP ADS DD path (use real
E:\path) - ADS username + password (
openerp_appafter setup) - Server type (
ADS_REMOTE_SERVER) - JWT signing secret
The repository contains a default development database.php. Do not commit local edits that contain real ADS credentials or production JWT secrets. backend/php/config/database.local.php is reserved for local overrides and is gitignored.
- Treat ADS usernames, ADS passwords, and JWT secrets as local secrets.
- Keep production values out of Git history.
- Rotate the seeded
adminpassword immediately outside a throwaway local environment. - Use
openerp_appfor normal application access aftersetup_users.phpprovisions DD permissions. - Use
openerp_roonly for read-only reporting or diagnostics. - Keep local diagnostic scripts and ADS security notes out of the public repository unless they are intentionally sanitized.
| File | Extension | Used by |
|---|---|---|
C:\php\php.ini |
php_ads + php_openads |
Default (avoid for OpenERP) |
C:\php\php_sapads.ini |
php_ads only |
OpenERP — use this |
C:\php\php_openads.ini |
php_openads only |
OpenADS standalone |
This README reflects the current Windows development machine:
- Project source is accessed as
F:\OpenERP. - The real path is
E:\Development\OpenERP. - Vite should be started from the real
E:\path. - PHP is installed under
C:\php. - SAP ADS development uses
C:\php\php_sapads.ini. - Backend development server uses port
8081. - Frontend Vite server uses port
5173. - Generated ADS files live under
data/and are not source files.
Representative endpoints (not exhaustive — see route files for full list):
POST /auth/login
GET /auth/me
GET /dashboard
GET /gl/accounts
POST /gl/accounts
GET /gl/fiscal-years
POST /gl/fiscal-years
GET /gl/periods
POST /gl/periods
POST /gl/periods/{id}/close
GET /gl/batches
POST /gl/batches
POST /gl/batches/{id}/entries
POST /gl/batches/{id}/post
GET /gl/reports/trial-balance
GET /gl/reports/income-statement
GET /gl/reports/balance-sheet
GET /ar/customers
POST /ar/customers
PUT /ar/customers/{id}
GET /ar/customers/{id}/credit-check
POST /ar/customers/{id}/credit-hold
POST /ar/customers/{id}/credit-release
GET /ar/invoices
POST /ar/invoices
POST /ar/invoices/{id}/void
POST /ar/invoices/{id}/write-off
GET /ar/payments
POST /ar/payments
POST /ar/payments/{id}/apply
POST /ar/payments/{id}/void
GET /ar/credit-memos
POST /ar/credit-memos
POST /ar/credit-memos/{id}/apply
POST /ar/credit-memos/{id}/void
GET /ar/aging
GET /ap/vendors
POST /ap/vendors
PUT /ap/vendors/{id}
GET /ap/bills
POST /ap/bills
POST /ap/bills/{id}/void
GET /ap/payments
POST /ap/payments
POST /ap/payments/{id}/apply
POST /ap/payments/{id}/void
GET /ap/debit-memos
POST /ap/debit-memos
POST /ap/debit-memos/{id}/apply
POST /ap/debit-memos/{id}/void
GET /ap/aging
GET /items
POST /items
PUT /items/{id}
POST /items/{id}/adjust
GET /items/reorder-suggestions
GET /items/{id}/lots
POST /items/{id}/lots
GET /items/{id}/xrefs
POST /items/{id}/xrefs
DELETE /items/xrefs/{xref_id}
GET /items/{id}/substitutes
POST /items/{id}/substitutes
DELETE /items/substitutes/{sub_id}
GET /warehouses
POST /warehouses
PUT /warehouses/{id}
GET /warehouses/{id}/bins
POST /warehouses/{id}/bins
GET /warehouses/{id}/inventory
GET /transfers
POST /transfers
GET /transfers/{id}
POST /transfers/{id}/post
POST /transfers/{id}/cancel
GET /landed-costs
POST /landed-costs
GET /landed-costs/{id}
POST /landed-costs/{id}/allocate
POST /landed-costs/{id}/compute-tariff
POST /landed-costs/{id}/post
GET /physical-counts
POST /physical-counts
GET /physical-counts/{id}
PUT /physical-counts/{id}/lines
POST /physical-counts/{id}/post
GET /cycle-counts
POST /cycle-counts
PUT /cycle-counts/{id}/count
POST /cycle-counts/{id}/approve
GET /so
POST /so
PUT /so/{id}
POST /so/{id}/ship
POST /so/{id}/invoice
POST /so/{id}/drop-ship
POST /so/{id}/cancel
GET /po
POST /po
PUT /po/{id}
POST /po/{id}/receive
POST /po/{id}/bill
POST /po/{id}/cancel
GET /price-lists
POST /price-lists
PUT /price-lists/{id}
POST /price-lists/{id}/items
DELETE /price-lists/{id}/items/{item_id}
GET /price-lookup
GET /reports/backorders
GET /reports/commissions
GET /items/{id}/atp
GET /sales-reps
POST /sales-reps
PUT /sales-reps/{id}
GET /customer-classes
POST /customer-classes
PUT /customer-classes/{id}
GET /matrix-pricing
POST /matrix-pricing
PUT /matrix-pricing/{id}
DELETE /matrix-pricing/{id}
GET /contracts
POST /contracts
PUT /contracts/{id}
DELETE /contracts/{id}
GET /rma
POST /rma
PUT /rma/{id}
POST /rma/{id}/receive
POST /rma/{id}/approve
POST /rma/{id}/cancel
GET /blanket-orders
POST /blanket-orders
PUT /blanket-orders/{id}
POST /blanket-orders/{id}/release
POST /blanket-orders/{id}/cancel
GET /ar/deposits
POST /ar/deposits
POST /ar/deposits/{id}/apply
POST /ar/deposits/{id}/void
GET /carriers
POST /carriers
PUT /carriers/{id}
GET /ship-methods
POST /ship-methods
PUT /ship-methods/{id}
GET /sq
POST /sq
PUT /sq/{id}
POST /sq/{id}/send
POST /sq/{id}/accept
POST /sq/{id}/expire
POST /sq/{id}/cancel
GET /requisitions
POST /requisitions
GET /requisitions/{id}
PUT /requisitions/{id}
POST /requisitions/{id}/submit
POST /requisitions/{id}/approve
POST /requisitions/{id}/reject
POST /requisitions/{id}/convert
POST /requisitions/{id}/cancel
GET /rfq
POST /rfq
GET /rfq/{id}
POST /rfq/{id}/send
POST /rfq/{id}/quotes
POST /rfq/{id}/select/{quote_id}
POST /rfq/{id}/convert
POST /rfq/{id}/close
GET /rebates
POST /rebates
PUT /rebates/{id}
GET /rebates/{id}/accruals
POST /rebates/{id}/compute
POST /rebates/{id}/settle
GET /vendor-items
POST /vendor-items
GET /vendor-items/{id}
PUT /vendor-items/{id}
DELETE /vendor-items/{id}
GET /inbound-shipments
POST /inbound-shipments
GET /inbound-shipments/{id}
PUT /inbound-shipments/{id}
POST /inbound-shipments/{id}/add-po
DELETE /inbound-shipments/{id}/pos/{po_id}
GET /currencies
POST /currencies
PUT /currencies/{id}
GET /exchange-rates
POST /exchange-rates
GET /exchange-rates/on/{currency_id}/{date}
GET /sales-tax/jurisdictions
POST /sales-tax/jurisdictions
GET /sales-tax/customer-rate
GET /sales-tax/exemptions
POST /sales-tax/exemptions
PUT /sales-tax/exemptions/{id}
DELETE /sales-tax/exemptions/{id}
GET /bank-accounts
POST /bank-accounts
GET /bank-accounts/{id}
PUT /bank-accounts/{id}
GET /bank-accounts/{id}/statement-lines
POST /bank-accounts/{id}/statement-lines
POST /bank-accounts/{id}/statement-lines/{lid}/match
POST /bank-accounts/{id}/statement-lines/{lid}/unmatch
GET /bank-accounts/{id}/reconciliation
GET /recurring
POST /recurring
PUT /recurring/{id}
POST /recurring/{id}/run
POST /recurring/{id}/deactivate
GET /reports/inventory-valuation
GET /reports/inventory-valuation/summary
GET /reports/three-way-matching
GET /reports/orders
GET /reports/1099
GET /admin/company
PUT /admin/company
GET /admin/audit-log
GET /admin/users
POST /admin/users
PUT /admin/users/{id}
POST /admin/users/{id}/change-password
GET /admin/groups
POST /admin/groups
PUT /admin/groups/{id}
GET /admin/permissions
- Always use
C:\php\php_sapads.ini— notphp.ini— for this project. - Use the real
E:\Development\OpenERP\frontendpath for Vite, not theF:subst alias. - SAP ACE reads LOGICAL fields back as
1/0integers. The frontend usesv == 1 || v === true || v === '.T.'everywhere. - Dates are stored as
CHAR(8)(YYYYMMDD) in most tables. The frontend converts withfmtDate(). - Do not commit real credential changes in
backend/php/config/database.php,diag_*.phpfiles, orADS-Users-Groups-Permissions.md. CLAUDE.mdis intentionally local and should not be committed.- Keep generated ADS files (
data/*.adt,data/*.adi, etc.) andfrontend/node_modulesout of Git.