@startuml

skinparam stereotypeCBackgroundColor<<Value>> White

package infrastructure {
    package service.delivery {
        interface InvoiceHandler {
            + handleInvoice(user, invoice)
        }

        interface InvoiceHandler

        InvoiceHandler <|-- MailingInvoiceHandler
    }

    package repository {
        class Invoices << (D,orchid) Database >> {
            - invoice
        }

        class Users << (D,orchid) Database >> {
            - user
            - tax payment date
        }
    }
}

package domain {
    package model {
        class User {
            - uuid
            - ownerships
            - email
        }

        class Invoice<<Value>> {
            - id
            - userId
            - creationDate
            - taxesByOwnerships
            + getFullTax()
        }

        class Ownership<<Value>>

        Invoices o-- Invoice
        Users o-- User
        User *-- Ownership
    }

    package service {
        interface InvoiceService {
            + serviceUser(user)
        }

        InvoiceService ... Invoice : produces >

        package accountancy {
            interface TaxCalculator {
                - taxResolvers
                + countTax(user)
            }

            interface TaxResolverContainer {
                + getTaxResolverByOwnership(ownership)
            }

            TaxCalculator --> TaxResolverContainer
            InvoiceService --> TaxCalculator

            package resolvers {
                interface TaxResolver<? extends Ownership> {
                    tax rates knowledge for specific
                    ownership type
                    + resolveTax(ownership)
                }

                TaxResolverContainer o--> TaxResolver
            }
        }
    }
}

package app {
    package listener {
        interface OnDateListener << (>,red) Entry point >> {
            counts taxes for users
            on payment dates
            + onPaymentDate(date)
        }
    }

    OnDateListener --> InvoiceService : triggers
    InvoiceService --> InvoiceHandler : triggers

    package webapi {
        class Controller << (>,red) Entry point >> {
        }
    }
}

@enduml