ProSonata API
Folgende HTTP-Methoden stehen für Angebote zur Verfügung:
Zugriff ab Benutzergruppe Teamleiter.
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",
...
},
...
]
}
Ü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 |
Nach folgenden Parametern kann sortiert werden (Sortierrichtung ggf. mit ASC bzw. DESC ergänzen):
quotationID, projectID, addressID, quotationDate, grossValue
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": ""
}
]
}
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.
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: