Αναφορά: 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ερμηνεύεται ως ακαθάριστη τιμή μονάδας €/τ.μ. (με ΦΠΑ) και το σύνολο γραμμής υπολογίζεται απόquantityservices— μη κενός πίνακας· κάθε γραμμή: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).