vendor_payment_diff_amount/REQUIREMENT_EXPENSE_ACCOUNT.md
2025-12-06 10:24:16 +07:00

270 lines
6.4 KiB
Markdown

# Requirement: Expense Account for Deductions
## Summary
**Payment deductions require the Expense Account field to be set.**
This is a mandatory requirement enforced by validation.
## Why This Requirement?
### Technical Reason
When creating a payment with deductions, the journal entry structure is:
```
Expense Account (Debit) ← Must be specified
Tax Accounts (Credit) ← Deductions
Bank Account (Credit) ← Net payment
```
Without the Expense Account, the system cannot determine which account should receive the debit entry.
### Accounting Reason
The Expense Account represents:
- The full cost/expense being incurred
- The account that should be debited for the total amount
- The proper classification of the expense
Example:
- Telepon & Internet expense: Rp 2,000,000
- Less: PPh 21 withheld: Rp 100,000
- Less: PPh 29 withheld: Rp 50,000
- Net payment to vendor: Rp 1,850,000
The Expense Account (Telepon & Internet) gets the full Rp 2,000,000 debit.
## Validation
The module enforces this requirement with a validation constraint:
```python
@api.constrains('amount', 'amount_substract', 'expense_account_id', 'deduction_line_ids')
def _check_amount_substract(self):
for payment in self:
# ... other validations ...
# Require expense account when using deductions
if payment.deduction_line_ids and not payment.expense_account_id:
raise ValidationError(_(
"Expense Account is required when using payment deductions.\n\n"
"Please set the Expense Account field before adding deductions."
))
```
### When Validation Triggers
The validation error appears when:
1. You add deduction lines
2. But haven't set the Expense Account field
3. And try to save or post the payment
### Error Message
```
Expense Account is required when using payment deductions.
Please set the Expense Account field before adding deductions.
```
## How to Use
### Correct Workflow
```
1. Create Payment
2. Set Expense Account ✅ (e.g., "Telepon & Internet")
3. Add Deductions (e.g., PPh 21, PPh 29)
4. Post Payment ✅
```
### Incorrect Workflow (Will Fail)
```
1. Create Payment
2. Add Deductions ❌
3. Try to Post ❌
Error: "Expense Account is required..."
```
## Alternative: Without Deductions
If you don't need deductions, you can use the standard payment flow:
```
1. Create Payment
2. Don't set Expense Account (optional)
3. Don't add Deductions
4. Post Payment ✅
```
In this case, the system uses the standard Accounts Payable account.
## Comparison
### With Expense Account + Deductions
**Journal Entry:**
```
Expense Account Debit: 2,000,000
PPh 21 Credit: 100,000
PPh 29 Credit: 50,000
Bank Credit: 1,850,000
```
**Use Case:** Direct expense recording with tax withholding
### Without Expense Account (Standard)
**Journal Entry:**
```
Accounts Payable Debit: 2,000,000
Bank Credit: 2,000,000
```
**Use Case:** Standard vendor payment without deductions
## Benefits of This Requirement
### 1. Clear Accounting
Forces users to specify exactly which expense account should be used, ensuring:
- Proper expense classification
- Accurate financial reporting
- Clear audit trail
### 2. Prevents Errors
Prevents common mistakes like:
- Missing expense account
- Unclear journal entries
- Unbalanced entries
### 3. Consistent Behavior
Ensures all payments with deductions follow the same pattern:
- Always have an expense account
- Always have proper journal entries
- Always have correct tax treatment
## Configuration
### Required Accounts
Before using deductions, set up:
#### 1. Expense Accounts
```
Chart of Accounts > Create Account
- Name: Telepon & Internet
- Code: 611505
- Type: Expenses
```
#### 2. Tax Payable Accounts
```
Chart of Accounts > Create Account
- Name: PPh 21
- Code: 217101
- Type: Current Liabilities
```
### Account Selection
When creating a payment with deductions:
**Expense Account:** Choose from expense accounts
- ✅ Telepon & Internet
- ✅ Office Supplies
- ✅ Professional Fees
- ❌ Accounts Payable (not allowed)
**Deduction Accounts:** Choose from tax/liability accounts
- ✅ PPh 21 (Tax Payable)
- ✅ PPh 23 (Tax Payable)
- ✅ PPh 29 (Tax Payable)
- ❌ Accounts Payable (not allowed)
- ❌ Bank accounts (not allowed)
## User Training
### Key Points to Teach Users
1. **Always set Expense Account first** when using deductions
2. **Choose the right expense account** for the type of expense
3. **Use tax accounts** for deductions, not payable accounts
4. **Verify amounts** before posting
### Common Questions
**Q: Why can't I just use Accounts Payable?**
A: When using deductions, you're recording the expense directly. Accounts Payable is for tracking vendor balances, not expenses.
**Q: What if I forget to set Expense Account?**
A: You'll get a validation error. Just set the Expense Account field and try again.
**Q: Can I change the Expense Account after adding deductions?**
A: Yes, as long as the payment hasn't been posted yet.
## Technical Details
### Module Integration
This requirement is part of the `vendor_payment_diff_amount` module v2.0.0.
It works with:
- `vendor_batch_payment_merge` (provides expense_account_id field)
- Standard Odoo accounting (account.payment)
### Field Definition
The `expense_account_id` field is defined in `vendor_batch_payment_merge`:
```python
expense_account_id = fields.Many2one(
'account.account',
string='Expense Account',
domain="[('account_type', 'not in', ('asset_receivable', 'liability_payable'))]",
help="Account used for expense instead of the default payable/receivable account"
)
```
### Validation Logic
The validation is in `vendor_payment_diff_amount`:
```python
if payment.deduction_line_ids and not payment.expense_account_id:
raise ValidationError("Expense Account is required...")
```
## Summary
**DO:** Set Expense Account before adding deductions
**DO:** Use expense accounts for Expense Account field
**DO:** Use tax accounts for deduction accounts
**DON'T:** Try to add deductions without Expense Account
**DON'T:** Use Accounts Payable for deductions
---
**Remember: Expense Account is REQUIRED when using deductions!**
For more information, see:
- USER_GUIDE.md - Step-by-step instructions
- README.md - Module overview
- FINAL_FIX.md - Technical details