Μετάβαση στο περιεχόμενο

Αναφορά: DocumentController

Διαδρομή: app/Controllers/DocumentController.php

Ρόλος

REST API για παραστατικά (δελτία αποστολής): λίστα, προβολή, δημιουργία, κλείσιμο, διαγραφή, καθώς και επόμενος αριθμός / επόμενο barcode.

Δημόσια API (ενδεικτικά)

HTTP Διαδρομή Σκοπός
GET /api/documents Λίστα
GET /api/documents/{id} Λεπτομέρειες
POST /api/documents Δημιουργία (JSON)
POST /api/documents/{id}/close Κλείσιμο
DELETE /api/documents/{id} Διαγραφή
GET /api/documents/next-number Επόμενος αριθμός ανά σειρά
GET /api/documents/next-barcode Επόμενο barcode

Middleware: auth, company (όπως στο ApiRoutes.php).

Εξαρτήσεις

  • DocumentModel, ItemStorageModel, ActionLogModel, AppointmentModel (πλήθος ραντεβού ανά id_dochead στη λεπτομέρεια παραστατικού), κ.λπ.

Σημειώσεις

  • GET /api/documents (λίστα): για συσχετισμένο δελτίο (idcorrellateddoc) επιστρέφονται correlated_doc_number, correlated_series_descr, correlated_series_code (από τη σειρά του συσχετισμένου dochead) — στη στήλη «Συσχέτιση» της λίστας εμφανίζεται η περιγραφή σειράς (π.χ. ΔΕΛΤΙΟ ΠΑΡΑΛΑΒΗΣ) μαζί με τον αριθμό δελτίου.
  • GET /api/documents/{id}: πεδίο linked_appointment_count — ραντεβού με id_dochead = id παραστατικού.
  • POST /api/documents/{id}/close: επιστρέφει new_id, new_doc_number, new_iddocseries, new_series_descr (νέο δελτίο ζεύξης / αποστολής). Στη ροή «ραντεβού πριν το κλείσιμο» το κλείσιμο καλείται μετά το POST /api/appointments από το client (calendar.js).

POST /api/documents — σώμα JSON

Κεφαλίδα Content-Type: application/json. Το σώμα αποκωδικοποιείται και τροφοδοτεί το store() ως $_POST (βλ. public/index.php).

Υποχρεωτικά πεδία κεφαλίδας

Όλα τα παρακάτω πρέπει να υπάρχουν και να μην είναι κενό κείμενο (μετά το trim), εκτός αν αναφέρεται διαφορετικά:

Πεδίο Σημείωση
idtrader Αριθμός συναλλασσόμενου
iddocseries Μόνο 239 — δελτίο παραλαβής (DocSeries::DELIVERY_SLIP)
doc_number Ακέραιος αριθμός δελτίου (μοναδικός ανά σειρά/εταιρεία)
prepayment Προκαταβολή (αριθμός ≥ 0)
phone, phone2 Τηλέφωνα (κείμενο)
barcode_range Κείμενο· βλ. παρακάτω όταν is_barcode_active = 1
is_barcode_active 0 ή 1
invoice 0 ή 1
delivery_date YYYY-MM-DD
notes Σημειώσεις
items Μη κενός πίνακας φυσικών ειδών

Προαιρετικά πεδία κεφαλίδας

Πεδίο Προεπιλογή Σημείωση
with_fylakis false / 0 Αν true, ενεργοποιείται Φύλαξη ανά είδος: κάθε γραμμή items[] πρέπει να έχει (ή να λάβει αυτόματα) τη σύνδεση Φύλαξης του συγκεκριμένου iditem· το is_express αγνοείται
is_express false / 0 Express μόνο όταν with_fylakis είναι ψευδές
services Πίνακας άλλων υπηρεσιών επιπέδου παραστατικού (per_documentίδια δομή γραμμής με τις υπηρεσίες μέσα στο items[]· μην συμπεριλαμβάνετε εδώ «Φύλαξη» (μόνο μέσα σε items[].services)

Φυσικά είδη (items[])

Για κάθε στοιχείο:

  • iditem (υποχρεωτικό)
  • quantity — ποσότητα τ.μ. (≥ 0)· για υπηρεσίες rate_type = by_size το grossval ερμηνεύεται ως ακαθάριστη τιμή μονάδας €/τ.μ. (με ΦΠΑ) και το σύνολο γραμμής υπολογίζεται από quantity
  • services — μη κενός πίνακας· κάθε γραμμή:
  • id_item_service (υποχρεωτικό) — για «Φύλαξη» είναι το id της σύνδεσης για αυτό το iditem (διαφορετικό ανά είδος)
  • discval (υποχρεωτικό, αριθμός)
  • grossval — προαιρετικό· αν λείπει ή ≤ 0, χρησιμοποιείται τιμή καταλόγου (καθαρή) × 1,24 ως ακαθάριστη γραμμής (ή μονάδας για by_size)

barcode_range και is_barcode_active

  • Αν is_barcode_active = 0: το barcode_range μπορεί να είναι οποιοδήποτε κείμενο (π.χ. placeholder)· δεν γίνεται έλεγχος μορφής.
  • Αν is_barcode_active = 1: το barcode_range πρέπει να είναι αριθμοί μόνο, χωρισμένοι με παύλα - (π.χ. 100001-100002-100003), ένας ανά φυσικό είδος, χωρίς διπλότυπα, χωρίς σύγκρουση με υπάρχοντα ενεργά barcodes.

Παράδειγμα σώματος (ενδεικτικά ids)

{
  "idtrader": 1,
  "iddocseries": 239,
  "doc_number": 100,
  "prepayment": "10.00",
  "phone": "2101234567",
  "phone2": "6971234567",
  "barcode_range": "910501-910502",
  "is_barcode_active": 1,
  "invoice": 1,
  "delivery_date": "2026-04-15",
  "notes": "Παραστατικό με μεταφορικά",
  "with_fylakis": 0,
  "is_express": 1,
  "items": [
    {
      "iditem": 1,
      "quantity": 5,
      "services": [
        {
          "id_item_service": 1,
          "grossval": "12.40",
          "discval": "0.00"
        },
        {
          "id_item_service": 2,
          "grossval": "24.80",
          "discval": "2.00"
        }
      ]
    },
    {
      "iditem": 2,
      "quantity": 3.25,
      "services": [
        {
          "id_item_service": 3,
          "discval": "0.00"
        }
      ]
    }
  ],
  "services": [
    {
      "id_item_service": 12,
      "grossval": "31.00",
      "discval": "0.00"
    }
  ]
}
  • Το ριζικό services είναι για υπηρεσίες per_document εκτός Φύλαξης· αν with_fylakis: 1, οι γραμμές Φύλαξης ανήκουν μόνο στο items[].services (διαφορετικό id_item_service ανά είδος).
  • Στο παράδειγμα, iddocseries είναι 239 (άλλη σειρά απορρίπτεται).
  • Με is_barcode_active: 1 υπάρχουν δύο τιμές barcodes για δύο στοιχεία items.
  • Η δεύτερη υπηρεσία του δεύτερου είδους παραλείπει grossval — συμπληρώνεται από τον κατάλογο (καθαρή × 1,24).