---
# System prepended metadata

title: V1 Week Finale
tags: [OneLeap v1]

---

# V1 Week Finale

# Accounting analysis / Bookkeeping

###### tags: `OneLeap v1`

# Concepts

Definition: Recording money flow from one entity to another

## Stages
1. Enter records of financial nature
2. Analize the financial records based on Accounts and assiciates (Customers, Suppliers .. etc)
    * Movables - Account, Customer, Supplier, Curiour, Transporter, Partner, .. etc
4. Extract financial reports and lists

```python=

class MovableMixin(models.Model):
    class Meta:
        abstract = True

    # stock_activity
    # customer
    # supplier
    # employee
    # inventory
    # freight
    # project
    # cost_center
    # profit_center


class AbstractLeg(IntEntity, MovableMixin):
    account = models.ForeignKey('accounting.Account', verbose_name='الحساب', related_name='legs',
                                on_delete=models.CASCADE)
    transaction = models.ForeignKey('accounting.Transaction', verbose_name='السند', related_name='legs',
                                    on_delete=models.CASCADE)
    amount = MoneyField(
        max_digits=defaults.MAX_DIGITS,
        decimal_places=defaults.DECIMAL_PLACES,
        default_currency=defaults.DEFAULT_CURRENCY,
        verbose_name='المقدار',
        blank=True,
    )
    is_posted = models.BooleanField('حالة الترحيل', default=False)
    memo = models.TextField(default='', blank=True, verbose_name='البيان')
    type = models.CharField('نوع القيد', max_length=255, choices=Transaction.TransactionTypeChoices.choices, null=True,
                            blank=True)
    date = models.DateTimeField('تأريخ القيد', default=timezone.now, null=True, blank=True)
```


## types of accounts

There are two types of accounts:
* Real accounts: (Assets, Liabilities)
* Virtual accounts: (Income, Expenses)

## Types of expenses
* Cost: all expeses made to support an asset
* Expense: all expenses made with/without supporting assets
* Loss: all expenses made without benefits
* Capital expenses: Fixed assets expenses (Purchases to support the business)

## process
* Document Lifecycle
    * When and How does the document starts
    * When and How does the document ends
    * Determin whether the document should include financial records, inventory records, or both!
* Accounting analysis / Bookkeeping
    * What types of records should be listed, whether financial or inventory
    * To determin what records should be added financially
* Supportive documents
    * All documents that supports the original document, which represents a component of its lifecycle
    * eg. PaymentRecord, ExpenseRecord, CostRecord, CreditNote, DebitNote, .. etc
* Movables
    * are accounts, each account is a combination of multiple sources of money movement, each account is a true real actual category, and muliple combinations of account movables (Customer, Supplier, Employee, Cost center, etc)

# Types of Documents Lifecycle

> *Purchase, Sales, Inventory: Are part of the SCM*
> *Income, Expenses, Bill, Invoice, PayrollSlip: Are part of the ACCOUNTING*
> *Payroll, HR: Is part of HCM*
> *DMS*

> There are three types of records that generate Legs, which could be included inside Transactions: StockActivity, AssetLine, PayrollLine

## Purchase cycle
* Purchase requisition
    * Initiator
    * Approval workflow
    * StockActivity - uncommitted items
    * Next step - purchase order
* Purchase order
    * Initiator
    * Approval workflow
    * StockActivity - uncommitted items
    * Supplier
    * Next step - Bill
        * Upfront payment
* Purchase Bill
    * Initiator
    * Approval workflow
    * StockActivity - uncommitted items -> Vendor
    * Supplier
    * Curiour
    * Extra
        * Earned discount
        * Debit note
    * Next step - Inventory takein
        * Settlement - ExpenseRecord - Legs

## Sales cycle
* Sales qoutation
    * Initiator
    * Approval workflow
    * StockActivity - uncommitted items
    * Customer
    * Sales rep - optional
    * Next step - Sales Order
* Sales Order
    * Initiator
    * Approval Workflow
    * StockActivity - uncommitted items
    * Customer
    * Sales rep - optional
    * Next step - Sales Invoice
        * Unfront payment
* Sales Invoice
    * Initiator
    * Approval Workflow
    * StockActivity - uncommitted items
    * Customer
    * Curiour
    * Extra
        * Allowed discount
        * Credit note
    * Sales rep - optional
    * Next step - Inventory takeout
        * Settlement - PaymentRecord - Legs

## POS Sales
* POS invoice
* POS bill

## Inventory cycle
* Inventory takein
    * Initiator
    * Approval workflow - automatic
    * Stockactivity - committed -> Vendor
    * Supplier
    * Curiour
    * Next step - None
        * Settlement already done, ExpenseRecords already done, Legs already posted, DONE
* Inventory takeout
    * Initiator
    * Approval workflow - automatic
    * StockActivity - committed
    * Customer
    * Curiour
    * Next step - None
        * Settlement already done, PaymentRecord already done, Legs already posted, DONE
* Inventory damage
    * Initiator
    * Approval workflow - approval committee
    * Disposal mechanism
        * Disposal expenses - ExpenseRecord
    * Next step - None
        * Disposal accounts - cost centers, accounts, records (Legs), extra cost
* Inventory transfer
    * Initiator
    * Approval workflow
    * From inventory, To inventory
    * Accounts - from -> to
    * Next step - None
        * Extra expenses - curiour, loading unloading costs
    * Combination of two notes, Inventory Takein, Inventory Takeout
* Inventory adjustment
    * Inventory
    * Inventory adjustment increase
    * Inventory adjustment decrease
        * Initator
        * Approval workflow - committee
        * On single inventory level, and combines with other inventories to produce general inventory adjustment report
        * Accounts, records the increase or dicrease in invetory levels
        * StockActivity which is either increase or dicrease, committed
* Asset requisition
    * Initiator
    * Approval workflow
    * AssetLine - uncommitted items
    * Next step - Asset order
* Asset order/Bill/Takein
    * Initiator
    * Approval workflow
    * AssetLine - uncommitted items -> committed items - Vendor
    * Supplier
    * Next step - Bill
        * Upfront payment
        * Settlements
    * Extra
        * Earned discount
        * Debit note
    * Next step - None
* Asset write-off
    * Depriciation until write off
* Asset purchase


## Income cycle
* Payment record
* Debit Memo
* Loan interest

## Expense cycles
* Credit Memo
* Payroll Slip
* Expenses

## Ledger cycle
* --SPLIT-- records


# Special care for

## Workflow module

Basically it is the logic that defines who can do what and when

## Workflow
* relationship with workflow assiciates (Transaction)
    * depends on the State of the associate
* is_template
* steps - reverse relationship to Step
* step permissions
* is_mandatory

## Step
* permitted position
* step name
* step target
* is_approved

### approval template doesn't exist
- Transaction Created -> state DRAFT
- Mid states are irrelivant
- Transaction finalization (POSTING)

### approval template exists
- Transaction Created -> state DRAFT
    - step 1 -> state PENDING
    - step n -> state PENDING
    - step final -> state NEW
- Transaction Uapproved by last or mid approved step
    - step n -> state PENDING
    - step n -> unapprove all upper steps
- Transaction Uapproved by first step
    - same as mid step -> state DRAFT
- Transaction finalization (POSTING)

## Subscription module

* Recurring Transaction (PayrollSlip, Invoice, etc)
* Recurring Leg (PayrollLine, StockActivity, AssetLine which inclues depreciation records, )

### examples
* Recurring invoice (Subscription) -> Invoice
* Recurring debits (Installments) -> Installment
* Recurring Payroll (PaySlips) -> PaySlip

### rules
* you identify the upcoming event, but don't execute the operation (optional)
* the main subscription operation is cloning of a current transaction that should have a recurring event
* some operation should have a time/value limit
* we should have an option to pre-create the upcoming events

```python=
class Subscription(IntEntity):
    name
    description
    start_date
    end_date
    tags
    grace_period
    period = ['daily', 'weekly', 'monthly', 'yearly']
    unit = ['time', 'value']
    time_based = checkbox
    value_based = checkbox
    type = ['once', 'periodic']
    # in case of running once, end_date should be set to today
    recurrence_cost = max_value
    depletion_cost = min_value
    
    should_execute = bool
    pre_create = bool
    
    callable = what to call
    
    def is_expired(self):
        return if the subscription end_date passed today date
    
    def force_expire(self):
        sets the end_date to today
    
    def type_of(self):
        return the type
    
    def validate_periodic(self):
        if periodic is selected, check that period and at least start_date are set
        
    def validate_time(self):
        if time is selected, check that start_date and end_date and period are set
        
    def validate_value(self):
        check at least recurrence_cost or depletion_cost are set
        
    def subscribers(self):
        return all subscribers within categories, returns the upcoming events
        invoice
        deprecition 
        payslip
        installment
        bill
        
    def global_validator(self):
        performs all global validations
        
    def depletion_limit(self, value):
        if validate_value():
            return whether the depletion_cost has been reached or not
    
    def recurrence_limit(self, value):
        return whether the recurrence_cost has been reached or not
    
    
        
    
    
    
    
```


Depreciation:
* initial value: 20,000 USD
* current value
* cumulative value
* min_value: 10,000 USD
* depreciation value: 10%
* depreciation period: 5 years
* depreciation subscription
    * periodic: montly|yearly
    * unit: value
    * depletion_cost: start: initial -> ends: min_value
* types:
    * linear
    * non-linear
    * regressive


Invoice:
* subscription:
    * periodic: weekly|monthly|yearly
    * unit: time
    * when to expire