Hyppää sisältöön

Tilaukset — Odoo → Custobar

Workflow: 🧾 Päivitä tilaukset Custobariin ID: AxwSZp8rfdeizJwU Ajastus: Joka 5 minuutti

Toimintaperiaate

Hakee Odoosta vahvistetut myyntitilaukset ja niiden tilausrivit, yhdistää ne, laskee verolliset yksikköhinnat ja alennukset sentteinä, ja lähettää erissä Custobariin. Jokainen tilausrivi muodostaa oman Custobar-sales-tietueen.

flowchart LR
    A["⏰ Schedule<br/>5 min"] --> B["📥 Get Odoo<br/>Orders"]
    A --> C["📥 Get Odoo<br/>Order Lines"]
    B --> D["🔗 Merge"]
    C --> D
    D --> E["🔄 Transform<br/>Orders"]
    E --> F["📦 Batch<br/>Builder"]
    F --> G["🔁 Loop"]
    G -->|erä| H["📤 HTTP POST<br/>/sales/upload/"]
    H --> I["⏳ Wait 10s"]
    I --> G
    G -->|valmis| J["💾 Save<br/>Timestamp"]
    J --> K["✅ Done"]

Odoo-haku

Tilausworkflow tekee kaksi rinnakkaista hakua ja yhdistää tulokset:

Haku 1: Myyntitilaukset

Asetus Arvo
Malli sale.order
Suodattimet state = "sale", write_date > edellinen_ajo

Kentät:

Odoo-kenttä Kuvaus
name Tilausnumero (esim. SO12345)
date_order Tilauspäivä
currency_id Valuutta
amount_total Kokonaissumma (verollinen)
id Tilauksen ID
partner_id Asiakas [id, "nimi"]
write_date Muutosaika
state Tila

Haku 2: Tilausrivit

Asetus Arvo
Malli sale.order.line
Suodattimet price_unit > 0, write_date > edellinen_ajo

Kentät:

Odoo-kenttä Kuvaus
order_id Tilauksen viite [id, "SO12345"]
name Rivin kuvaus
product_id Tuote [id, "nimi"]
price_total Verollinen kokonaishinta
product_uom_qty Määrä
price_unit Veroton yksikköhinta
price_tax Veron osuus
discount Alennusprosentti

Merge (yhdistäminen)

Tilaukset ja tilausrivit yhdistetään Combine by Position -moodilla. Tilausrivit saavat ylätason tilauksen tiedot (asiakas, tilauspäivä, kokonaissumma) mukaan muunnoksessa.

Hintalogiikka

const qty = product_uom_qty || 1;

// Verollinen yksikköhinta (Odoon price_total sisältää veron)
const unitPriceWithTax = qty > 0 ? price_total / qty : 0;

// Alennussumma sentteinä
const discountAmount = discount > 0
  ? Math.round(price_unit * (discount / 100) * qty * 100)
  : 0;

Esimerkki

Tilausrivi: 3 kpl tuotetta, price_unit = 10,00 €, price_total = 37,20 € (sis. ALV 24 %), discount = 0 %

  • unit_price = 37,20 / 3 = 12,40 € → 1240 senttiä
  • total = 37,20 € → 3720 senttiä
  • discount = 0 → 0 senttiä

Custobar-data

Endpoint: POST https://rst-steel.custobar.com/api/sales/upload/

Jokainen tilausrivi lähetetään omana sales-tietueenaan:

{
  "sales": [
    {
      "sale_external_id": "SO12345",
      "sale_customer_id": "5678",
      "sale_date": "2026-02-27 14:30:00",
      "sale_total": 9920,
      "external_id": "44001",
      "product_id": "12345",
      "unit_price": 2480,
      "quantity": 4,
      "discount": 0,
      "total": 9920
    }
  ]
}

Kenttäkartoitus

Custobar-kenttä Odoo-lähde Muunnos
sale_external_id order_id[1] tai name Tilausnumero (esim. SO12345)
sale_customer_id partner_id[0] Asiakkaan ID merkkijonona
sale_date date_order Tilauksen vahvistuspäivä
sale_total amount_total Kokonaissumma sentteinä
external_id id (tilausrivi) Rivin ID merkkijonona
product_id product_id[0] Tuotteen ID merkkijonona
unit_price price_total / qty Verollinen yksikköhinta sentteinä
quantity product_uom_qty Kappalemäärä
discount price_unit * discount% * qty Alennussumma sentteinä
total price_total Rivin verollinen summa sentteinä

Odoo-tuplet

Odoo palauttaa viitekenttät tupleina: partner_id = [42, "Asiakas Oy"]. Ensimmäinen arvo on ID, toinen näyttönimi. Custobariin lähetetään vain ID (partner_id[0]).