Willkommen im kivitendo Forum! Hier erweitern und teilen AnwenderInnen und EntwicklerInnen ihr Wissen.

Teste kivitendo!

kivitendo Demo

kivitendo Demo mit Schweizer Kontenplan und neuem Layout

Unterstützt kivitendo mit der Basis-Subskription!

0 Punkte

Hallo,

wir möchten durch eine REST API Aufruf Lieferscheine erstellen. Wie in der Dokumentation beschrieben wird, habe ich versucht das mit "curl" zunächst zu erledigen. Ich habe die raue Anfragedaten aus Browser-Anfrage kopiert, um zu schauen, was ich übergeben soll. Es gibt aber sehr viele Felder und dazu noch scheint das ganze so zu funktionieren, dass man zunächst "erneuern" ausführen soll und erst danach kann man einen neuen Lieferschein "speichern" (also action=update und action=save in der Anfragedaten). Und vllt. gibt es noch weitere Schwierigkeiten, die ich noch nicht entdeckt habe.

Ich interessiere mich aktuell an eine "Mindestanfrage", was für Daten müssen übergeben werden, um einen maximal einfachen Lieferschein zu erstellen. Ich habe versucht das rauszufinden, indem ich die in Browser per Anfrage übergebene Daten analysiere sowie die 2 Datenbanktabellen: delivery_orders, delivery_order_items. Das folgende konnte ich dann basteln:

curl --user 'benutzername:passwort' 'http://localhost:8090/kivitendo/do.pl' --data-raw 'runningnumber_1=1&partnumber_1=2&type=sales_delivery_order&formname=sales_delivery_order&action=save'

Das erzeugt leider keine delivery_order_items und keine delivery_orders. Die Anfrage liefert auch anscheinend keine Daten zurück, sodass ich nicht weiß, ob es einen Fehler gab.

In einem so erstellten Lieferschein brauchen wir das folgende zu speichern:
- Auf welches Projekt sich der Lieferschein bezieht
- Positionen des Lieferscheines
- alles andere, was "muss" ist.

Wie kann ich rausfinden, wie ich die "Mindestanfrage" erfolgreich erstelle, sodass ein Lieferschein mit Positionen in der Datenbank gespeichert wird?

Gibt es irgendwelche Logs, die auch die REST API Vorgänge protokollieren? Oder wie kann ich anders irgendeinen Feedback vom System im Bezug auf die Anfragen bekommen?

Vielen Dank im Vorab.

Mit freundlichen Grüßen
Roman

von (560 Punkte)
Bearbeitet von

1 Antwort

0 Punkte
 
Beste Antwort

Eigentlich gibt es nur eine API, um Telefonanlagen (3cx) mit kivitendo zu verbinden.

Das ist eigentlich genau das Beispiel in der Doku:
https://www.kivitendo.de/kivi/doc/html/ch04s03.html

Um einen LIeferschein per API zu erzeugen würde ich eher einen Controller wie bei den Telefonnummern einsetzen (SL/Controller/PhoneNumber.pm) oder etwas technischer:

perldoc SL/Controller/PhoneNumber.pm 

So einen Controller für Lieferscheine bräuchtest Du eigentlich. Der würde dann auf ein POST reagieren und probieren einen Lieferschein anzulegen.

So wie du es jetzt probierst, also mit Hilfe von bin/mozilla/do.pl müsstest du in der Tat den Browser des Anwenders simulieren.

Alternativ gibt es den CSV-Import von Lieferscheinen.

Für Kundenprojekte nutzen wir den CSV-Import und erstellen einen kivi-Hintergrundjob der dann die andere Anwendung nach neuen Daten fragt und diese dann direkt an den CSV-Import übergibt.

Letzteres ist vielleicht die etwas weniger aufwändige Alternative.

von (18.7k Punkte)
ausgewählt von

Vielen Dank für die Antwort, das hilft bereits.

Könnten wir auch direkt in die Datenbank die Daten schreiben? Auf dem Bild habe ich die meiner Meinung nach relevanten Tabellen angezeigt mit den "not null" Fremdschlüsseln. Ich halte die ausgegraute für unmittelbar relevante, wobei ich Zweifel für "delivery_order_items_stock" habe. Wie gesagt, brauchen wir bei der Erstellung nur die Positionen sowie Projekt zu speichern. Außerdem möchten wir direkt nach Speicherung des Lieferscheines ihn in Kivitendo bearbeiten, was "per cronjob" nicht ganz bequem macht, es sei denn, Cronjob läuft jede Sekunde.

Ist das eine gute Idee so zu machen? Wäre es ausreichend, lediglich in delivery_orders und delivery_order_items in unserem Falle zu schreiben?

Technisch geht das. Das ist aber nicht die eleganteste Idee.
Mit ein wenig kivi-Perl-Code könntet Ihr Euch locker besser helfen.

Es gibt eine Perl-Kommandozeile, die sich mit einer beliebigen kivi-Testdatenbank verbinden kann, damit kann man in 34 Minuten schon einiges Testen.

i) Doku für Lieferscheine per Objekt-Code:

perldoc SL/DB/DeliveryOrder.pm 

ii) Perl-Kivi-Konsole

scripts/console

Die Einstellungen für die Konsolen-Anbindung sind in der kivitendo.conf erklärt und auch hier (https://forum.kivitendo.ch/4842/besteht-möglichkeit-buchungen-automatisch-einzustellen?show=4847)

iii)

Hier einmal die Erzeugung eines Lieferschein-Objekts und Zuweisung einer Project_ID:

re.pl(main):001:0> my $project_id='12345';
12345
re.pl(main):002:0> pp $project_id;
$VAR1 = '12345';
re.pl(main):003:0> my $delivery_order = SL::DB::DeliveryOrder->new();
SL::DB::DeliveryOrder=HASH(0x56147a9b1fb0)
re.pl(main):005:0> pp $delivery_order;
$VAR1 = bless( {}, 'SL::DB::DeliveryOrder' );
re.pl(main):009:0> $delivery_order->assign_attributes(globalproject_id => $project_id);
re.pl(main):010:0> pp $delivery_order
(...)

'__xrdbopriv_modified_columns' => {
                                             'globalproject_id' => 1
                                           },
         'globalproject_id' => '12345'

An dem Liferschein müssten jetzt noch mehr Metadaten dran und auch die Positionen.
Danach kann das dann in einen Controller, den du von außen per GET ansprechen kannst.

Halbwegs gut verständlich ist das Verfahren in SL/DB/DeliveryOrder.pm in der Routine

sub new_from_time_recordings {

rauskopierbar ...

Was für Entitäten speichert die Tabelle "delivery_order_itmes_stock"? Ist das nicht zufällig die in der Lager eingelagerte Quantität eines Artikels, die für eine bestimmte Lieferung reserviert wird? Wenn so, haben dann die Einträge auch Bedeutung im Falle der delivery_orders mit is_sales = false?

Ähnliche Fragen

0 Punkte
1 Antwort
0 Punkte
1 Antwort
Gefragt 21, Jan 2014 von Anonym
0 Punkte
1 Antwort
...