ProSonata API

Angebote (Preview)

Folgende HTTP-Methoden stehen für Angebote zur Verfügung:

  • GET: Ressource lesen
  • POST: Ressource erstellen
  • PUT: Ressource bearbeiten

Zugriff ab Benutzergruppe Teamleiter.

alle Angebote auflisten

GET /api/v1/quotations

Antwort:

{
  "meta": {
    "status": 200,
    "perPage": 100,
    "page": 1,
    "totalCount": 287,
    "requestUserID": 1,
    "requestUsername": "Admin1",
    "usergroupName": "Administrator",
    "apiLimitRemaining": 469,
    "apiLimitReset": 452
  },
  "data": [
    {
      "quotationID": 37,
      "quotationName": "",
      "quotationHeadline": "",
      "quotationDate": "2023-06-05",
      "netValue": "3550.00",
      "grossValue": "4224.50",
      "currency": 0,
      "tax": "19.0",
      ...
    },
    ...
  ]
}

Filterung/Suche

Über Parameter kann gefiltert werden:

GET /api/v1/quotations?projectName=Testprojekt
Parameter Beschreibung
addressID ID der Kundenadresse
name1 Firmierung des Kunden (Zeile 1 der Adresse)
projectID ID des Projekts
projectNo Projektnummer
projectName Bezeichnung des Projekts
projectTags Tag(s) des Projekts
customerID ID des Kunden (Firma/Gruppe)
customerName Bezeichnung des Kunden (Firma/Gruppe)
quotationDate Datum des Dokuments
durch Angabe von > oder < vor dem Datum kann eine Suche ab dem bzw. bis zum Datum erfolgen
createdByUserID Dokument angelegt von Benutzer ID
currency Währung:
0 = Euro
1 = CHF
2 = USD
3 = GBP
4 = CAD
approved Angebot wurde vom Kunden freigegeben:
0 = nein
1 = ja

 

Sortierung

Nach folgenden Parametern kann sortiert werden (Sortierrichtung ggf. mit ASC bzw. DESC ergänzen):

quotationID, projectID, addressID, quotationDate, grossValue

ein Angebot aufrufen

GET /api/v1/quotations/{id}

Antwort:

{
  "meta": {
    "status": 200,
    "requestUserID": 1,
    "requestUsername": "Admin1",
    "usergroupName": "Administrator",
    "apiLimitRemaining": 484,
    "apiLimitReset": 412
  },
  "data": {
    "quotationID": 164,
    "quotationName": "",
    "quotationHeadline": "",
    "quotationDate": "2022-10-11",
    "netValue": "1290.00",
    "grossValue": "1535.10",
    "currency": 0,
    "tax": "19.0",
    "multipleTaxes": 0,
    "isSent": 1,
    "sentDate": null,
    "ocSentDate": null,
    "quotationComments": "",
    "projectID": 328,
    "projectNo": "22-30-001",
    "projectNoAddition": "",
    "projectName": "Produktportfolio",
    "projectTags": "",
    "customerID": 30,
    "customerName": "Architekturbüro XY",
    "addressID": 158,
    "name1": "Architekturbüro XY GmbH",
    "name2": "",
    "name3": "",
    "street": "Musterstraße",
    "streetNo": "12",
    "postalCode": "12345",
    "city": "Musterstadt",
    "country": "",
    "countryID": "",
    "standardSalutation": 0,
    "firstName": "Max",
    "lastName": "Muster",
    "email": "Muster@testfirma.de",
    "username": "Admin2",
    "positions": [
     {
       "detailID": 905,
       "isActive": 1,
       "position": "1",
       "categoryName": "Gestaltung",
       "detail": "<p>Gestaltung eines Flyers mit Umfang 4 Seiten. Bildmaterial wird vom Kunden geliefert.</p>",
       "quantity": "6.00",
       "unit": "",
       "netValue": "95.00",
       "taxSwitch": 0,
       "tax": "0.0",
       "additionalChargeSwitch": 0,
       "initialNetValue": "95.00",
       "additionalCharge1": "0.00",
       "additionalCharge2": "0.00",
       "discountPosition": 0,
       "discountSource": null,
       "discountPercent": "0.00",
       "detailComments": ""
     },
     {
       "detailID": 904,
       "isActive": 1,
       "position": "2",
       "categoryName": "Gestaltung",
       "detail": "<p>Text zur Position</p>",
       "quantity": "8.00",
       "unit": "",
       "netValue": "90.00",
       "taxSwitch": 0,
       "tax": "0.0",
       "additionalChargeSwitch": 0,
       "initialNetValue": "90.00",
       "additionalCharge1": "0.00",
       "additionalCharge2": "0.00",
       "discountPosition": 0,
       "discountSource": null,
       "discountPercent": "0.00",
       "detailComments": ""
     }
    ]
}

ein Angebot erstellen

POST /api/v1/quotations

Übergebene Werte (z.B. netValue, grossValue = Gesamtpreis des Dokuments) werden bei der Speicherung nicht auf korrekte Berechnung überprüft! Eine Validierung muss vorab erfolgen. Beim Aufruf des Angebots in der ProSonata Anwendung wird der Gesamtpreis auf Basis der Positionsdaten berechnet.

Notwendige und mögliche Parameter im Body:

Parameter Beschreibung Typ Default-Wert Pflichtfeld
projectID ID des Projekts Int   ja
addressID ID der Lieferantenadresse Int   ja
quotationContactID ID des Ansprechpartners (auch bei neutraler Anrede notwendig) Int   ja
quotationDate Datum des Angebots Date aktueller Tag  
quotationName optionale Bezeichnung, ersetzt die Projektbezeichnung String    
projectNoAddition Ergänzung/Zusatz zur Projektnummer String    
netValue Gesamtpreis netto Dec 0.00  
grossValue Gesamtpreis brutto Dec 0.00  
currency Währung:
0 = Euro
1 = CHF (SFr)
2 = US$
3 = GBP
4 = CAD
Int 0  
tax Steuersatz Dec 0.0 ja
multipleTaxes mehrere Steuersätze im Dokument vorhanden
0 = nein
1 = ja
Int 0  
paymentTarget Zahlungsziel in Tagen Int 14  
printTotalAmount Gesamtbetrag / Summe im Angebot anzeigen
0 = nein
1 = ja
Int 1  
netTotalOnly Nur netto Gesamtbetrag anzeigen
0 = nein
1 = ja
Int 0  
showOptionalTotal zusätzlich Gesamtbetrag optionaler Positionen anzeigen
0 = nein
1 = ja
Int 0  
showPositionNumber Spalte Positionsnummer anzeigen
0 = nein
1 = ja
Int 1  
showCategory Spalte Kategorie anzeigen
0 = nein
1 = ja
Int 1  
showQuantity Spalte Menge/Einzelpreis anzeigen
0 = nein
1 = ja
Int 0  
standardSalutation neutrale Anrede ausgeben (Sehr geehrte Damen und Herren)
0 = nein
1 = ja
Int 0  
templateLanguage Sprache des Angebots
0 = deutsch
1 = englisch
Int 0  
textTemplate Auswahl des Abbildertextes (0 bis 7) Int 0  
approved Angebot ist vom Kunden freigegeben
0 = nein
1 = ja
Int 0  
purchaseOrderNo Angabe Bestellnummer für die spätere Umwandlung in eine Auftragsbestätigung,
die Nummer wird nicht im Angebot (nur in der AB) ausgegeben
String    
useForCalculation in Projektauswertung einbezogen
0 = nein (vom Kunden abgelehnt)
1 = ja
Int 1  
pdfStandard Standard des später in der Hauptanwendung generierten PDFs
0 = PDF
1 = PDF/A
Int 1  
quotationComments Anmerkungen zum Angebot String    
positions Positionen des Angebots speichern;
ein Array der Positionen kann übergeben werden
Aufbau des Arrays siehe unten
Array null  

Angabe von Dezimalwerten mit Punkt als Trennzeichen.

Beispiel:

{
    "addressID": 41,
    "projectID": 403,
    "addressID": 187,
    "quotationContactID": 189,
    "quotationName": "Angebot via API",
    "quotationDate": "2026-06-20",
    "netValue": "0.00",
    "grossValue": "0.00",
    "currency": 0,
    "tax": "19.0",
    "showCategory": 0,
    "showQuantity": 1,
    "isSent": 0,
    "textTemplate": 2,
    "quotationComments": "ein Test über die API",
    "standardSalutation": 1,
    "positions": [
      {
        "position": "1",
        "category": 25,
        "detail": "<p>Planung, Abstimmung, Kundenbetreuung</p>",
        "sellerAssignedID": "1234",
        "buyerAssignedID": "Kd5132",
        "quantity": 4.50,
        "netValue": 110.00,
        "isOptional": 0,
        "additionalChargeSwitch": 1,
        "additionalCharge1": "0.00",
        "additionalCharge2": "10.00",
        "detailComments": "Test Pos 1"
      },
      {
        "position": "2",
        "category": 14,
        "detail": "<p>Beratung bei Konzeption und Struktur des Product Package. Kommunikation und Handling.</p>\r\n<p><strong>Zeitbedarf</strong>: ca. 8 Std.</p>",
        "quantity": "8.00",
        "unit": "h",
        "netValue": "95.00",
        "isOptional": 0,
        "detailComments": "Pos 2 zum Testen",
        "insertSubTotal": 1
      }
    ]
}

Notwendige und mögliche Parameter im Array der Positionen:

Parameter Beschreibung Typ Default-Wert Pflichtfeld
category ID des Leistungskategorie Int   ja
headline Überschrift zur Position String    
detail Freitext zur Position (Basis html Tags möglich) String    
sellerAssignedID Artikelnummer des Verkäufers String    
buyerAssignedID Artikelnummer des Käufers (Rechnungsempfängers) String    
position Position (Hauptposition, muss korrekt gesetzt werden und wird durch die Anwendung nicht geprüft) String    
subPosition optionale Unterposition (bei isSubPosition = 1, siehe unten) String    
quantity Menge Dec 0.00  
unit Einheit (z.B. Std., Stück) String    
netValue Einzelpreis (netto) Dec 0.00  
taxSwitch eigener Steuersatz für die Position
0 = nein
1 = ja
Int 0  
tax Steuersatz Dec 0.0  
additionalChargeSwitch Preisaufschlag verwenden
0 = nein
1 = ja
Int 0  
additionalCharge1 Aufschlag prozentual Dec 0.0  
additionalCharge2 Aufschlag fester Betrag pro Stück Dec 0.00  
isOptional optionale Position
0 = nein
1 = ja
Int 0  
addOptionalToSubTotal Betrag optionaler Position in Summe einbeziehen
0 = nein
1 = ja
Int 0  
discountPosition Rabattposition (mit automatischer Berechnung des Rabattbetrags)
0 = nein
1 = ja
Int 1  
discountSource bei Angabe 0 wird der Rabatt über alle Positionen bis zur Rabattposition berechnet
Rabatt auf eine Position = Angabe der detailID
keine Rabattposition = null
Int null  
discountPercent Rabatt in Prozent Dec 0.0  
insertSubTotal eine Zwischensumme nach der Position ausgeben
0 = nein
1 = ja
Int 0  
subTotalSinceHeadline Zwischensumme nur bis zur letzten vorherigen Überschrift berechnen Int 0  
isActive Position ist aktiv (wird ausgegeben)
0 = nein
1 = ja
Int 1  
isSubPosition Position ist eine Unterposition
0 = nein (vom Kunden abgelehnt)
1 = ja
Int 0  
allPositionsOrder Reihenfolge der Position, falls Unterpositionen oder inaktive Positionen vorhanden sind Int null  
detailComments Anmerkungen zur Position (erscheinen nicht in der Ausgabe) String    

Angabe von Dezimalwerten mit Punkt als Trennzeichen.

ein Angebot bearbeiten

PUT /api/v1/quotations/{id}

Es müssen nicht alle Parameter für eine Bearbeitung übergeben werden.

Es stehen die Parameter zum Erstellen der Ressource zur Verfügung (s.o.).

Für das Bearbeiten der Positionen gilt:

  • wird der Parameter positions nicht übergeben, bleiben die Positionen unverändert
  • wird ein leeres Array als positions übergeben, werden die vorhandenen Positionen gelöscht
  • bei Übergabe eines Arrays mit Inhalt wird bei jeder Position geprüft, ob die detailID vorhanden ist
    • falls ja, wird die Position bearbeitet
    • falls nein, wird eine neue Position erstellt