Kapitola 5: Technická Reference - Business Logika
5.1 Výpočetní Jádro InvoiceLike
Třída: Classes\Abstract\Services\InvoiceLike (Invoice, ProformaInvoice, CreditNote, Quote, SalesOrder, PurchaseOrder, SupplierInvoice).
- Načítá record listy (
items,additionalCosts,advanceDeductions,summaryVatRates) podle potřeby, aby výpočty vycházely z uložených dat. - Položky nákladů:
Core\Hooks\AbstractRecalculatematerializujeshippingCost/wrappingCostdo samostatných řádků (typshipping/wrapping) a při nulové částce je odstraní. - Položky slev: Procentní slevy z linku
discountsse převádějí do záporných řádků v pořadí (typdiscount) proti nediskontním položkám. - Alokace vedlejších nákladů:
calculatePurchasePrice+computeAdditionalCostAllocationrozdělují vedlejší náklady metodou největšího zbytku tak, aby zaokrouhlené alokace přesně seděly na celkovou částku. - Výpočet položek (
recalculateItem): Umí ceny s/bez DPH, slevy, cenovou marži %, reverse charge, zahraniční fakturaci (taxRate = 0), zaokrouhlení po řádcích, hmotnost z Product a nákupní cenu položky. - Součty (
recalculateTotals): Agreguje DPH podle sazeb na zaokrouhlených základech, skládásummaryVatRatesRecordList, nastavujepreDiscountedAmount,discountAmount,amount,taxAmount,grandTotalAmount. - Zaokrouhlení (
handleTotalAmountRounding): Aplikuje roundToCrowns/10h/50h s matematickým/nahoru/dolů; rozdíl ukládá doroundinga přidává dosummaryVatRatesRecordListjako nulovou sazbu. - Platby/zálohy (
recalculatePaidAmounts): Sčítá napojenéPayment(včetně konverze měn), zálohové odpočty, nastavujepaid,paidAdvances,remainingToPay,invoicedAmount.
Diagram Přepočtu
Klikněte pro zobrazení Diagramu Přepočtu
5.2 Platby a Práce se Statusem
Služba: Services\Payment
createPaymentForInvoice|SupplierInvoice|ProformaInvoice:- Nastaví
statusrodiče naUhrazeno, jinakČástečně uhrazeno(podlemarkAsPaid). - Vytvoří
Paymentsamount,amountCurrency,date(paidOn),variableSymbol,parentId/parentType,assignedUserId. - Spustí
recalculaterodiče, uloží; konverze částky využívá uloženécurrencyRates, takže platby v jiné měně správně doplnípaid.
- Nastaví
- Proforma navíc:
orderNumberse při platbě proformy čísluje sekvenčně (Hooks\Payment\SetOrderNumber). Pokud jecreateTaxDocumentHinta firma je plátce DPH, vytvoří seIssuedTaxDocumentse sloučenými položkami po sazbách (unitPrice = placená částka podle sazby). - Pojmenování/soulad:
Common\SetInvoiceNamerazítkujereferenceIdentifieradatePaidpři stavuUhrazeno;ManageDuzphlídá povinnéduzp, je-li zapnuto.
Diagram Plateb
Klikněte pro zobrazení toku plateb
5.3 Odpočty Záloh (Invoice ⇆ Proforma)
- Propojení Proformy na Fakturu spouští
Hooks\Invoice\ProformaInvoiceCreateAdvance→ProformaInvoice::onInvoiceLink, které vytvoříAdvanceDeductionItemnavázaný na oba doklady a přepočítá Fakturu. Odpojení položku smaže a znovu přepočítá. RecordHooks\Invoice\ProformaItemsblokuje připojení nezaplacených proforem (BadRequest, pokud některá proforma není Uhrazená).- Odpočty záloh vstupují do
remainingToPayapaidAdvances.
Diagram Odpočtu Záloh
Klikněte pro zobrazení toku odpočtů
5.4 Hlídání Splatnosti
Komponenta: Tools\Invoice\InvoiceLikeOverdueChecker (+ Hooks\Invoice\CheckOverdue, cron Jobs\CheckOverdueOrders)
- Aplikuje se jen pokud je
dueDatea stav je v povoleném seznamu:- Invoice/SupplierInvoice: Potvrzeno, Částečně uhrazeno.
- ReceivedTaxDocument: Přijato.
- Nastavuje
isOverdue,isDueSoon(parametrdueSoonDaysz clientDefs/entityDefs, výchozí 5) anumberOfOverdueDays; pokud chybí dueDate nebo stav nevyhovuje, příznaky resetuje.
5.5 Automatizace Objednávek a Vliv Položek
- Zámky statusu:
Hooks\PurchaseOrder\PreventInvalidStatusChangenedovolí změnu z finálních stavů ani přechod Objednáno → Připraveno/Návrh. - Data:
Hooks\PurchaseOrder\SetDefaultFieldsdoplnídateOrderedpři stavu Ordered. - Položky:
Hooks\PurchaseOrder\SetItemsStatusnastaví položky na WaitingForDelivery při Ordered a na Delivered při Delivered rodiče;Hooks\PurchaseOrderItem\ProcessPurchaseOrderItemoznačí položku za Delivered přiquantityDelivered ≥ quantity, nastavídeliveryDate, synchronizuje data do Production integrace;Hooks\PurchaseOrderItem\UpdateStatusmůže posunout rodiče na PartiallyDelivered/Delivered, pokud je zapnutéautomateStatusChange. - Integrita:
Hooks\PurchaseOrderItem\PreventInvalidStatusChangebrání vracet finalizované položky;DeleteOnChangeSuppliersmaže osiřelé položky přideleteId. - Náklady/slevy: Doprava/balení a procentní slevy se vkládají jako samostatné řádky přes
AbstractRecalculatestejně jako u faktur.
Diagram Životního Cyklu Objednávky
Klikněte pro zobrazení průběhu objednávky
5.6 Integrace Prodejní Objednávky
- Synchronizace nabídky:
Hooks\SalesOrder\SetQuoteStatusnastaví navázaný Quote na Ordered při uložení SalesOrder. - Automatická tvorba projektu (volitelné): Při zapnutém
enableAutomaticProjectCreationa nainstalovaném Project ManagementuHooks\SalesOrder\ProjectManagementIntegrationvytvoří Project se stavem InRealization a klonovanými položkami a propojí Quote/SalesOrder.
5.7 Stavové Strojky (klíčové entity)
Invoice / Proforma / SupplierInvoice / CreditNote
Klikněte pro zobrazení stavů Invoice rodiny
Pravidla & automatizace:
- Proforma nelze připojit k Faktuře, pokud není ve stavu Uhrazená (
RecordHooks/Invoice/ProformaItems). - Příznaky overdue jen pro stavy {Potvrzeno, Částečně uhrazeno} (Invoice/SupplierInvoice) nebo ReceivedTaxDocument: Přijato.
- ManageDuzp doplňuje/omezuje
duzpna typech: Invoice, SupplierInvoice, CreditNote, ReceivedProformaInvoice, ReceivedTaxDocument.
PurchaseOrder & PurchaseOrderItem
Klikněte pro zobrazení toku PurchaseOrder
- Zámky: zákaz z finálních stavů a Objednáno→Připraveno/Návrh (
Hooks/PurchaseOrder/PreventInvalidStatusChange). - Položky: Čeká na dodání při Objednáno, Přijato při Dodáno rodiče (
Hooks/PurchaseOrder/SetItemsStatus); položka s qtyDelivered ≥ qty přepne na Přijato a může posunout rodiče (Hooks/PurchaseOrderItem/ProcessPurchaseOrderItem,UpdateStatus).
SalesOrder
- Návrh → Připraveno → Aktivní → Dokončeno, plus Zamítnuto/Zrušeno. Připojený Quote se nastaví na Objednáno automaticky.
5.8 Automatizační Matice (Hooky/Služby)
| Spouštěč | Komponenta | Efekt |
|---|---|---|
| Uložení invoice-like s dopravou/balením/slevami | Core/Hooks/AbstractRecalculate | Vloží položky nákladů/slev, aktualizuje položky, pak InvoiceLike::recalculate |
| Propojení/odpojení Proformy s Fakturou | Hooks/Invoice/ProformaInvoiceCreateAdvance, ProformaInvoice::onInvoiceLink/Unlink | Vytvoří/odstraní AdvanceDeductionItem, přepočítá Fakturu |
| Uložení Invoice/Proforma/SupplierInvoice | Hooks/Invoice/CheckOverdue, Tools/Invoice/InvoiceLikeOverdueChecker | Nastaví isOverdue, isDueSoon, numberOfOverdueDays |
| Vytvoření platby | Services/Payment | Nastaví status rodiče Uhrazeno/Částečně uhrazeno, přepočítá; platby proformy dostanou sekvenční orderNumber; volitelně IssuedTaxDocument |
| Status = Uhrazeno | Hooks/Common/SetInvoiceName | Doplní datePaid, razítkuje reference/name při prázdných hodnotách |
| Uložení invoice-like s auto duzp | Hooks/Common/ManageDuzp | Doplní/omezí duzp podle dateInvoiced (max 14 dní zpět) |
| Uložení SalesOrder s Quote | Hooks/SalesOrder/SetQuoteStatus | Status nabídky => Objednáno |
| Uložení SalesOrder (první) s feature flagem | Hooks/SalesOrder/ProjectManagementIntegration | Vytvoří Project s klonovanými položkami |
| Uložení PurchaseOrder | PO hooky (SetDefaultFields, SetItemsStatus, UpdateStatusFromItems, PreventInvalidStatusChange) | Auto dateOrdered, sladění stavů položek/rodiče, ochrana finálních přechodů |
5.9 Plánované Joby & Background Procesy
| Job | Logika | Měněná pole |
|---|---|---|
Classes/Jobs/CheckOverdueOrders | Spustí kontrolu splatnosti pro Invoice, SupplierInvoice, ReceivedTaxDocument | isOverdue, isDueSoon, numberOfOverdueDays |
Classes/Jobs/RecalculateBudgets | Přepočítá agregace BusinessUnitBudget | Součty rozpočtových položek |
Classes/Jobs/RefreshPayerStatus | Aktualizuje stav nespolehlivých plátců z registru | Data UnreliablePayer |
Classes/Jobs/DownloadUnreliablePayers | Stáhne aktuální seznam nespolehlivých plátců | Dataset nespolehlivých plátců |
Classes/Jobs/SendAutomaticInvoice | Generuje automatické faktury dle konfigurace | Vytváří AutomaticInvoice |
5.10 Výpočet na Řádcích & Součty (Detail InvoiceLike)
Vstupy: unitPrice, quantity, withTax, taxRate, discount, priceMarginPercentage, reverseCharge, foreignInvoicing, additionalCostsRecordList, itemsRecordList.
Tok (na řádek):
- Normalizace ceny: převod z brutto na netto při
withTax, aplikace slevy (0–100). - Vedlejší náklady: alokace (nebo
allocatedAdditionalCostz metody největšího zbytku) → nákupní cena. - Násobení množstvím → základ.
- Marže %: položková má přednost, zvyšuje základ.
- Reverse charge: taxAmount=0, amountWithTax=amount; foreignInvoicing + reverseCharge nastaví taxRate=0.
- Zaokrouhlení po řádku:
round(currencyDecimalPlaces)na netto a DPH; uwithTax=truese nejdřív zaokrouhlí brutto, netto = brutto/(1+rate). - Hmotnost: hmotnost produktu * quantity.
Součty:
- DPH po sazbách z zaokrouhlených základů (ignoruje řádky z proformy) →
summaryVatRatesRecordList. preDiscountedAmount= součet unitPrice*quantity před slevami;discountAmountzahrnuje procentní slevy i záporné řádky slev.grandTotalAmount= netto + DPH ± zaokrouhlení.- Ukládá vypočtená pole na položkách (skip hooks).
5.11 Alokace Vedlejších Nákladů (Metoda největšího zbytku)
Zdroj: InvoiceLike::computeAdditionalCostAllocation.
- Sečte additionalCostsRecordList.
- Seskupí základy položek podle sazby DPH; ignoruje slevové/negativní řádky.
- Alokuje celkové náklady na sazby proporčně, zaokrouhlí dolů na centy, pak rozdělí zbytky (largest remainder).
- V rámci sazby alokuje na položky stejným způsobem; uloží
allocatedAdditionalCost. calculatePurchasePricepoužije alokaci pro per-unit vedlejší náklad, aby zaokrouhlené součty přesně seděly.
5.12 Platba Proformy → Issued Tax Document
Zdroj: Services/Payment::createTaxDocumentFromProforma.
- Vypočítá
amountRatio = proformaGrandTotal / paymentAmount(fallback 1 při 0 hodnotách) pro rozdělení placené částky podle sazeb. - Seskupí proforma položky podle (taxRate, withTax); na skupinu vytvoří položku s
unitPrice += round(item.amountWithTax / amountRatio), quantity=1,withTax=true. - Kopíruje billing/adresy/vatId/orderNumber/variableSymbol/payment metadata; měna z platby.
- Uloží
IssuedTaxDocumentnavázaný na proformu+platbu; finální faktura odečte přesAdvanceDeductionItem.
5.13 Konfigurační Přepínače (chování)
enableAutomaticProjectCreation(SalesOrder clientDefs): auto Project při prvním uložení.automateStatusChange(PurchaseOrder clientDefs): dovolí přechod Delivered z položek.allowStatusChangeInAnyState(PurchaseOrder clientDefs): vypne ochrany stavů.sendThankYouEmail+thankYouEmailTemplateId: po stavu Uhrazeno na Fakturě pošle e-mail.- Zaokrouhlení: pole
roundTo+totalAmountRoundingřídí politiku. - DueSoon:
dueSoonDaysper entita (clientDefs/entityDefs, default 5). - Auto DUZP:
autoDuzpEnabledper entita. - Vlastní názvy:
enableCustomNamev clientDefs; jinak SetInvoiceName doplní reference/name z automatického číslování.