# Διασύνδεση με database

## Σύνδεση με βάση δεδομένων

Η διασύνδεση υποστηρίζει βάσεις δεδομένων MySQL, MariaDB και SQL Server.

### Host (string, απαραίτητο)

Η διεύθυνση IP του server της βάσης δεδομένων.
Π.χ. `198.51.100.0`.

### Port (string, απαραίτητο)

Η θύρα σύνδεσης της βάσης δεδομένων.
Π.χ. `3306` για MySQL/MariaDB ή `1433` για SQL Server.

### Database (string, απαραίτητο)

Το όνομα της βάσης δεδομένων.
Π.χ. `example_db`.

### Username (string, απαραίτητο)

Το όνομα χρήστη για την σύνδεση στη βάση δεδομένων.
Π.χ. `demo`.

### Password (string, απαραίτητο)

Ο κωδικός πρόσβασης για την σύνδεση στη βάση δεδομένων.
Π.χ. `secret`.

### Character set (string, προαιρετικό)

Η κωδικοποίηση χαρακτήρων της βάσης δεδομένων.
Π.χ. `utf8mb4`.

### Collation (string, προαιρετικό)

Η ταξινόμηση χαρακτήρων της βάσης δεδομένων.
Π.χ. `utf8mb4_unicode_ci`.

### CA certificate (file, προαιρετικό)

Το αρχείο πιστοποιητικού CA για την σύνδεση στη βάση δεδομένων μέσω SSL. Π.χ. `ca-cert.pem`.

### Client public key certificate (file, προαιρετικό)

Το αρχείο δημόσιου κλειδιού πελάτη για την σύνδεση στη βάση δεδομένων μέσω SSL. Π.χ. `client-cert.pem`.

### Client private key (file, προαιρετικό)

Το αρχείο ιδιωτικού κλειδιού πελάτη για την σύνδεση στη βάση δεδομένων μέσω SSL. Π.χ. `client-key.pem`.

### Peer verification (boolean, προαιρετικό)

Ενεργοποίηση ή απενεργοποίηση της επαλήθευσης του peer κατά την σύνδεση στη βάση δεδομένων μέσω SSL.

### Updated (string, προαιρετικό)

Το όνομα της στήλης που θα χρησιμοποιηθεί για φιλτράρισμα των δεδομένων με βάση την ημερομηνία.
Π.χ. `updated_at`.

## Πίνακες εισαγωγής δεδομένων

Απαιτούνται 3 πίνακες: ένας για τα προϊόντα, ένας για τις τιμές και ένας για τα αποθέματα. Στο Magento μπορεί να προστεθεί και ένας τέταρτος, προαιρετικός πίνακας για τις τιμές πελατών. Οι στήλες και τα δεδομένα που χρειάζονται για την εισαγωγή περιγράφονται στις αντίστοιχες ενότητες για το Magento και το WooCommerce.

### Διαχείριση differentials

Για να γίνει η λήψη των differentials, το Sébastien στέλνει ερωτήματα φιλτράροντας με την πιο πρόσφατη ημερομηνία της τελευταίας ενημέρωσης που βρέθηκε στη στήλη που έχει οριστεί για την ημερομηνία ενημέρωσης. Η βάση δεδομένων θα πρέπει να επιστρέφει μόνο τα δεδομένα που έχουν ενημερωθεί μετά από αυτή την ημερομηνία. Σε περίπτωση που δε σταλεί κριτήριο με ημερομηνία, τότε θα πρέπει να επιστραφούν όλα τα δεδομένα. Για ταχύτερη αναζήτηση συνιστάται η χρήση ευρετηρίων (index) στις στήλες ημερομηνίας.

Κάθε αλλαγή πρέπει να καταγράφεται στον πίνακα που αντιστοιχεί στο πεδίο που άλλαξε, ενημερώνοντας και τη στήλη ημερομηνίας ενημέρωσης:

1. Η αλλαγή τιμής ή τιμής έκπτωσης ενημερώνει τον πίνακα τιμών
2. Η αλλαγή stock ή min quantity ενημερώνει τον πίνακα αποθεμάτων
3. Οποιαδήποτε άλλη αλλαγή ενημερώνει τον πίνακα προϊόντων (τα χαρακτηριστικά που κάνουν trigger μπορούν να οριστούν κατόπιν συνεννόησης)

### Παράδειγμα πίνακα προϊόντων Magento

#### SCHEMA

```sql
CREATE TABLE `products` (
  `attribute_set` VARCHAR(255) NULL,
  `backorders` TINYINT(1) NULL,
  `category_ids` VARCHAR(255) NULL,
  `code` VARCHAR(255) NULL,
  `color` VARCHAR(255) NULL,
  `crosssell_skus` VARCHAR(255) NULL,
  `media_gallery` TEXT NULL,
  `min_sale_qty` DECIMAL(12, 4) NULL,
  `name` VARCHAR(255) NULL,
  `price` DECIMAL(20, 6) NULL,
  `qty_increments` DECIMAL(12, 4) NULL,
  `quantity` DECIMAL(12, 4) NULL,
  `related_skus` VARCHAR(255) NULL,
  `size` VARCHAR(255) NULL,
  `sku` VARCHAR(255) NOT NULL,
  `special_price` DECIMAL(20, 6) NULL,
  `status` TINYINT(1) NULL,
  `upsell_skus` VARCHAR(255) NULL,
  `visibility` TINYINT(1) NULL,
  `website_ids` VARCHAR(255) NULL,
  `weight` DECIMAL(12, 4) NULL,
  `updated_at` TIMESTAMP NULL,
  INDEX `products_updated_at_index` (`updated_at`)
);
```

#### DATA

| sku | name | code | size | color | status | visibility | price | quantity | category\_ids | updated\_at |
|---|---|---|---|---|---|---|---|---|---|---|
| TSHIRT-RED-M | T-Shirt Κόκκινο Medium | TSHIRT-RED | M | Red | 1 | 1 | 29.990000 | 150.0000 | Men &gt; Clothing &gt; T-Shirts, Men &gt; New Arrivals | 2025-12-05 10:30:00 |
| TSHIRT-RED-L | T-Shirt Κόκκινο Large | TSHIRT-RED | L | Red | 1 | 1 | 29.990000 | 75.0000 | Men &gt; Clothing &gt; T-Shirts, Men &gt; New Arrivals | 2025-12-05 10:30:00 |
| LAPTOP-PRO-2025 | Professional Laptop 2025 | NULL | NULL | NULL | 1 | 4 | 1299.000000 | 25.0000 | Electronics &gt; Computers, Best Sellers | 2025-12-05 14:20:00 |

### Παράδειγμα πίνακα προϊόντων WooCommerce

#### SCHEMA

```sql
CREATE TABLE `products` (
  `woocommerce_id` BIGINT UNSIGNED NULL,
  `backorders` VARCHAR(255) NULL,
  `brands` VARCHAR(255) NULL,
  `catalog_visibility` VARCHAR(255) NULL,
  `categories` VARCHAR(255) NULL,
  `code` VARCHAR(255) NULL,
  `color` VARCHAR(255) NULL,
  `cross_sell_ids` VARCHAR(255) NULL,
  `date_on_sale_from` DATETIME NULL,
  `date_on_sale_to` DATETIME NULL,
  `description` TEXT NULL,
  `downloadable` TINYINT(1) NULL,
  `featured` TINYINT(1) NULL,
  `global_unique_id` VARCHAR(255) NULL,
  `height` DECIMAL(10, 2) NULL,
  `images` TEXT NULL,
  `length` DECIMAL(10, 2) NULL,
  `manage_stock` TINYINT(1) NULL,
  `name` VARCHAR(255) NULL,
  `purchase_note` TEXT NULL,
  `regular_price` DECIMAL(10, 2) NULL,
  `reviews_allowed` TINYINT(1) NULL,
  `sale_price` DECIMAL(10, 2) NULL,
  `shipping_class` VARCHAR(255) NULL,
  `short_description` VARCHAR(255) NULL,
  `size` VARCHAR(255) NULL,
  `slug` VARCHAR(255) NULL,
  `sold_individually` TINYINT(1) NULL,
  `sku` VARCHAR(255) NOT NULL,
  `status` VARCHAR(255) NULL,
  `stock_quantity` INT NULL,
  `stock_status` VARCHAR(255) NULL,
  `tax_class` VARCHAR(255) NULL,
  `tax_status` VARCHAR(255) NULL,
  `type` VARCHAR(255) NULL,
  `upsell_ids` VARCHAR(255) NULL,
  `virtual` TINYINT(1) NULL,
  `weight` DECIMAL(10, 2) NULL,
  `width` DECIMAL(10, 2) NULL,
  `updated_at` TIMESTAMP NULL,
  INDEX `products_updated_at_index` (`updated_at`)
);
```

#### DATA

| sku | name | code | size | status | regular\_price | stock\_quantity | manage\_stock | categories | updated\_at |
|---|---|---|---|---|---|---|---|---|---|
| SHOE-NIKE-42 | Nike Air Max No 42 | SHOE-NIKE | 42 | publish | 89.99 | 45 | 1 | shoes,sports | 2025-12-05 09:15:00 |
| SHOE-NIKE-43 | Nike Air Max No 43 | SHOE-NIKE | 43 | publish | 89.99 | 32 | 1 | shoes,sports | 2025-12-05 09:15:00 |
| BOOK-PHP-2025 | PHP Programming Guide | NULL | NULL | publish | 45.00 | NULL | 0 | books,programming | 2025-12-05 11:30:00 |

### Παράδειγμα πίνακα τιμών Magento

#### SCHEMA

```sql
CREATE TABLE `prices` (
  `price` DECIMAL(20, 6) NULL,
  `sku` VARCHAR(255) NOT NULL,
  `special_price` DECIMAL(20, 6) NULL,
  `special_from_date` DATE NULL,
  `special_to_date` DATE NULL,
  `tier_prices` TEXT NULL,
  `updated_at` TIMESTAMP NULL,
  INDEX `prices_updated_at_index` (`updated_at`)
);
```

#### DATA

| sku | price | special\_price | special\_from\_date | special\_to\_date | tier\_prices | updated\_at |
|---|---|---|---|---|---|---|
| TSHIRT-RED-M | 29.990000 | 24.990000 | 2025-12-01 | 2025-12-31 | NULL | 2025-12-05 08:00:00 |
| LAPTOP-PRO-2025 | 1299.000000 | NULL | NULL | NULL | group\_a,10,1199,0\|group\_b,50,1099,0 | 2025-12-05 10:15:00 |
| CHAIR-OFFICE-BLK | 159.990000 | 139.990000 | 2025-12-05 | 2025-12-15 | group\_a,5,129.99,0 | 2025-12-05 14:30:00 |

### Παράδειγμα πίνακα τιμών WooCommerce

#### SCHEMA

```sql
CREATE TABLE `prices` (
  `woocommerce_id` BIGINT UNSIGNED NULL,
  `date_on_sale_from` DATETIME NULL,
  `date_on_sale_to` DATETIME NULL,
  `regular_price` DECIMAL(10, 2) NULL,
  `sale_price` DECIMAL(10, 2) NULL,
  `sku` VARCHAR(255) NOT NULL,
  `updated_at` TIMESTAMP NULL,
  INDEX `prices_updated_at_index` (`updated_at`)
);
```

#### DATA

| sku | regular\_price | sale\_price | date\_on\_sale\_from | date\_on\_sale\_to | updated\_at |
|---|---|---|---|---|---|
| SHOE-NIKE-42 | 89.99 | 69.99 | 2025-12-01 00:00:00 | 2025-12-31 23:59:59 | 2025-12-05 09:00:00 |
| SHOE-NIKE-43 | 89.99 | 69.99 | 2025-12-01 00:00:00 | 2025-12-31 23:59:59 | 2025-12-05 09:00:00 |
| BOOK-PHP-2025 | 45.00 | NULL | NULL | NULL | 2025-12-05 11:30:00 |

### Παράδειγμα πίνακα αποθεμάτων Magento

#### SCHEMA

```sql
CREATE TABLE `stocks` (
  `backorders` TINYINT NULL,
  `is_in_stock` TINYINT(1) NULL,
  `min_quantity` DECIMAL(12, 4) NULL,
  `quantity` DECIMAL(12, 4) NULL,
  `sku` VARCHAR(255) NOT NULL,
  `updated_at` TIMESTAMP NULL,
  INDEX `stocks_updated_at_index` (`updated_at`)
);
```

#### DATA

| sku | quantity | min\_quantity | backorders | is\_in\_stock | updated\_at |
|---|---|---|---|---|---|
| TSHIRT-RED-M | 150.0000 | 5.0000 | NULL | NULL | 2025-12-05 10:30:00 |
| TSHIRT-RED-L | 75.0000 | 5.0000 | NULL | NULL | 2025-12-05 10:30:00 |
| LAPTOP-PRO-2025 | 25.0000 | 2.0000 | NULL | NULL | 2025-12-05 14:20:00 |
| CHAIR-OFFICE-BLK | 0.0000 | 10.0000 | 2 | 1 | 2025-12-05 16:45:00 |

### Παράδειγμα πίνακα αποθεμάτων WooCommerce

#### SCHEMA

```sql
CREATE TABLE `stocks` (
  `woocommerce_id` BIGINT UNSIGNED NULL,
  `sku` VARCHAR(255) NOT NULL,
  `stock_quantity` INT NULL,
  `stock_status` VARCHAR(255) NULL,
  `stock_threshold` INT NULL,
  `updated_at` TIMESTAMP NULL,
  INDEX `stocks_updated_at_index` (`updated_at`)
);
```

#### DATA

| sku | stock\_quantity | stock\_status | stock\_threshold | updated\_at |
|---|---|---|---|---|
| SHOE-NIKE-42 | 45.00 | instock | 5.00 | 2025-12-05 09:15:00 |
| SHOE-NIKE-43 | 32.00 | instock | 5.00 | 2025-12-05 09:15:00 |
| BOOK-PHP-2025 | NULL | NULL | NULL | 2025-12-05 11:30:00 |
| HEADPHONES-BT | -5.00 | onbackorder | 10.00 | 2025-12-05 15:20:00 |

### Παράδειγμα πίνακα τιμών πελατών Magento

#### SCHEMA

```sql
CREATE TABLE `customer_prices` (
  `amount` DECIMAL(20, 6) NOT NULL,
  `attribute_code` VARCHAR(255) NULL,
  `attribute_option` VARCHAR(255) NULL,
  `category_ids` VARCHAR(255) NULL,
  `email` VARCHAR(255) NULL,
  `price_type` TINYINT NOT NULL,
  `sku` VARCHAR(255) NULL,
  `taxvat` VARCHAR(255) NULL,
  `tier_quantity` INT NULL,
  `valid_from` DATE NULL,
  `valid_to` DATE NULL,
  `updated_at` TIMESTAMP NULL,
  INDEX `customer_prices_updated_at_index` (`updated_at`)
);
```

#### DATA

| email | taxvat | sku | category\_ids | attribute\_code | attribute\_option | price\_type | amount | tier\_quantity | valid\_from | valid\_to | updated\_at |
|---|---|---|---|---|---|---|---|---|---|---|---|
| customer@example.com | NULL | TSHIRT-RED-M | NULL | NULL | NULL | 0 | 24.990000 | NULL | NULL | NULL | 2025-12-05 08:00:00 |
| NULL | 123456789 | NULL | Men &gt; Clothing &gt; T-Shirts | NULL | NULL | 1 | 10.000000 | NULL | 2025-12-01 | 2025-12-31 | 2025-12-05 09:30:00 |
| NULL | 123456789 | NULL | NULL | color | Red | 2 | 5.000000 | 10 | NULL | NULL | 2025-12-05 10:15:00 |

## Πίνακες ενημέρωσης παραγγελιών

Απαιτούνται 4 πίνακες: ένας για τα στοιχεία της παραγγελίας, ένας για τα προϊόντα της παραγγελίας, ένας για τα σχόλια της παραγγελίας, και ένας για την κατάσταση της παραγγελίας.

Οι 3 πρώτοι πίνακες ενημερώνονται όταν υπάρχει νέα παραγγελία ή όταν αλλάζει η παραγγελία από το Magento ή το WooCommerce. Ο πίνακας της κατάστασης της παραγγελίας ενημερώνεται μόνο όταν αλλάζει η κατάσταση της παραγγελίας από το ERP.

### Παράδειγμα πίνακα παραγγελιών Magento

#### SCHEMA

```sql
CREATE TABLE `orders` (
  `id` BIGINT UNSIGNED NOT NULL,
  `billing_address_city` VARCHAR(255) NOT NULL,
  `billing_address_company` VARCHAR(255) NULL,
  `billing_address_country_id` VARCHAR(255) NOT NULL,
  `billing_address_email` VARCHAR(255) NULL,
  `billing_address_firstname` VARCHAR(255) NULL,
  `billing_address_lastname` VARCHAR(255) NULL,
  `billing_address_postcode` VARCHAR(255) NOT NULL,
  `billing_address_region` VARCHAR(255) NULL,
  `billing_address_street` JSON NOT NULL,
  `billing_address_telephone` VARCHAR(255) NULL,
  `billing_address_vat_id` VARCHAR(255) NULL,
  `coupon_code` VARCHAR(255) NULL,
  `customer_email` VARCHAR(255) NOT NULL,
  `customer_firstname` VARCHAR(255) NULL,
  `customer_id` INT UNSIGNED NULL,
  `customer_lastname` VARCHAR(255) NULL,
  `customer_note` TEXT NULL,
  `discount_amount` DECIMAL(20,4) NULL,
  `extension_attributes` JSON NULL,
  `grand_total` DECIMAL(20,4) NOT NULL,
  `increment_id` VARCHAR(255) NULL,
  `payment_method` VARCHAR(255) NOT NULL,
  `shipping_address_city` VARCHAR(255) NOT NULL,
  `shipping_address_company` VARCHAR(255) NULL,
  `shipping_address_country_id` VARCHAR(255) NOT NULL,
  `shipping_address_email` VARCHAR(255) NULL,
  `shipping_address_firstname` VARCHAR(255) NULL,
  `shipping_address_lastname` VARCHAR(255) NULL,
  `shipping_address_postcode` VARCHAR(255) NOT NULL,
  `shipping_address_region` VARCHAR(255) NULL,
  `shipping_address_street` JSON NOT NULL,
  `shipping_address_telephone` VARCHAR(255) NULL,
  `shipping_address_vat_id` VARCHAR(255) NULL,
  `shipping_amount` DECIMAL(20,4) NULL,
  `shipping_incl_tax` DECIMAL(20,4) NULL,
  `shipping_method` VARCHAR(255) NULL,
  `shipping_tax_amount` DECIMAL(20,4) NULL,
  `state` VARCHAR(255) NULL,
  `status` VARCHAR(255) NULL,
  `subtotal` DECIMAL(20,4) NULL,
  `tax_amount` DECIMAL(20,4) NULL,
  `total_due` DECIMAL(20,4) NULL,
  `total_paid` DECIMAL(20,4) NULL,
  `total_refunded` DECIMAL(20,4) NULL,
  `created_at` TIMESTAMP NULL,
  `updated_at` TIMESTAMP NULL
);
```

#### DATA

| id | increment\_id | customer\_email | customer\_firstname | customer\_id | customer\_lastname | billing\_address\_firstname | billing\_address\_lastname | billing\_address\_company | billing\_address\_street | billing\_address\_city | billing\_address\_region | billing\_address\_postcode | billing\_address\_country\_id | billing\_address\_telephone | billing\_address\_email | billing\_address\_vat\_id | shipping\_address\_firstname | shipping\_address\_lastname | shipping\_address\_company | shipping\_address\_street | shipping\_address\_city | shipping\_address\_region | shipping\_address\_postcode | shipping\_address\_country\_id | shipping\_address\_telephone | shipping\_address\_email | shipping\_address\_vat\_id | payment\_method | shipping\_method | coupon\_code | customer\_note | state | status | subtotal | discount\_amount | shipping\_amount | shipping\_incl\_tax | shipping\_tax\_amount | tax\_amount | grand\_total | total\_paid | total\_refunded | total\_due | extension\_attributes | created\_at | updated\_at |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 12345 | 000012345 | john.doe@example.com | John | 1024 | Doe | John | Doe | NULL | \["Ermou 15"\] | Athens | Attica | 11523 | GR | +302101234567 | john.doe@example.com | NULL | John | Doe | NULL | \["Ermou 15"\] | Athens | Attica | 11523 | GR | +302101234567 | john.doe@example.com | NULL | banktransfer | flatrate\_flatrate | NULL | NULL | processing | processing | 127.4000 | 0.0000 | 5.0000 | 6.2000 | 1.2000 | 30.5000 | 157.9000 | 157.9000 | 0.0000 | 0.0000 | {"erp\_id": "ORD-2025-001", "warehouse": "ATH-01"} | 2025-12-05 10:30:15 | 2025-12-05 10:30:15 |
| 12346 | 000012346 | maria.smith@example.com | Maria | NULL | Smith | Maria | Smith | Acme Corp | \["Tsimiski 25","2nd Floor"\] | Thessaloniki | Central Macedonia | 54622 | GR | +302310987654 | maria.smith@example.com | EL123456789 | Anna | Papadopoulou | NULL | \["Egnatia 100"\] | Thessaloniki | Central Macedonia | 54630 | GR | +302310555444 | anna.p@example.com | NULL | cashondelivery | tablerate\_bestway | SUMMER2025 | Please call before delivery | complete | complete | 72.5700 | 7.2600 | 3.5000 | 4.3400 | 0.8400 | 17.4200 | 89.9900 | 89.9900 | 0.0000 | 0.0000 | {"erp\_id": "ORD-2025-002", "warehouse": "TSK-01", "priority": "high"} | 2025-12-05 11:15:00 | 2025-12-05 15:30:00 |

### Παράδειγμα πίνακα παραγγελιών WooCommerce

#### SCHEMA

```sql
CREATE TABLE `orders` (
  `id` BIGINT UNSIGNED NOT NULL,
  `number` VARCHAR(255) NOT NULL,
  `status` VARCHAR(255) NOT NULL,
  `currency` CHAR(3) NOT NULL,
  `discount_total` DECIMAL(10,2) NOT NULL,
  `discount_tax` DECIMAL(10,2) NOT NULL,
  `shipping_total` DECIMAL(10,2) NOT NULL,
  `shipping_tax` DECIMAL(10,2) NOT NULL,
  `cart_tax` DECIMAL(10,2) NOT NULL,
  `total` DECIMAL(10,2) NOT NULL,
  `total_tax` DECIMAL(10,2) NOT NULL,
  `prices_include_tax` TINYINT(1) NOT NULL,
  `customer_id` BIGINT UNSIGNED NOT NULL DEFAULT 0,
  `customer_note` VARCHAR(255) NULL,
  `billing_first_name` VARCHAR(255) NOT NULL,
  `billing_last_name` VARCHAR(255) NOT NULL,
  `billing_company` VARCHAR(255) NOT NULL,
  `billing_address_1` VARCHAR(255) NOT NULL,
  `billing_address_2` VARCHAR(255) NOT NULL,
  `billing_city` VARCHAR(255) NOT NULL,
  `billing_postcode` VARCHAR(255) NOT NULL,
  `billing_state_code` VARCHAR(255) NOT NULL,
  `billing_state_name` VARCHAR(255) NOT NULL,
  `billing_country` CHAR(2) NOT NULL,
  `billing_email` VARCHAR(255) NOT NULL,
  `billing_phone` VARCHAR(255) NOT NULL,
  `shipping_first_name` VARCHAR(255) NOT NULL,
  `shipping_last_name` VARCHAR(255) NOT NULL,
  `shipping_company` VARCHAR(255) NOT NULL,
  `shipping_address_1` VARCHAR(255) NOT NULL,
  `shipping_address_2` VARCHAR(255) NOT NULL,
  `shipping_city` VARCHAR(255) NOT NULL,
  `shipping_postcode` VARCHAR(255) NOT NULL,
  `shipping_state_code` VARCHAR(255) NOT NULL,
  `shipping_state_name` VARCHAR(255) NOT NULL,
  `shipping_country` CHAR(2) NOT NULL,
  `shipping_phone` VARCHAR(255) NOT NULL,
  `payment_method` VARCHAR(255) NOT NULL,
  `payment_method_title` VARCHAR(255) NOT NULL,
  `shipping_method` VARCHAR(255) NOT NULL,
  `shipping_method_title` VARCHAR(255) NOT NULL,
  `transaction_id` VARCHAR(255) NOT NULL,
  `metadata` JSON NULL,
  `date_paid` DATETIME NULL,
  `date_completed` DATETIME NULL,
  `coupon_code` VARCHAR(255) NULL,
  `created_at` TIMESTAMP NULL,
  `updated_at` TIMESTAMP NULL
);
```

#### DATA

| id | number | status | currency | customer\_id | customer\_note | billing\_first\_name | billing\_last\_name | billing\_company | billing\_address\_1 | billing\_address\_2 | billing\_city | billing\_state\_code | billing\_state\_name | billing\_postcode | billing\_country | billing\_email | billing\_phone | shipping\_first\_name | shipping\_last\_name | shipping\_company | shipping\_address\_1 | shipping\_address\_2 | shipping\_city | shipping\_state\_code | shipping\_state\_name | shipping\_postcode | shipping\_country | shipping\_phone | payment\_method | payment\_method\_title | shipping\_method | shipping\_method\_title | transaction\_id | coupon\_code | discount\_total | discount\_tax | shipping\_total | shipping\_tax | cart\_tax | total\_tax | total | prices\_include\_tax | date\_paid | date\_completed | metadata | created\_at | updated\_at |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 5678 | 5678 | processing | EUR | 123 | NULL | George | Karamanlis |  | 25th August Street 45 |  | Heraklion |  |  | 71201 | GR | george.k@example.com | +302810123456 | George | Karamanlis |  | 25th August Street 45 |  | Heraklion |  |  | 71201 | GR | +302810123456 | bacs | Direct Bank Transfer | flat\_rate | Flat Rate | TXN-2025-5678 | NULL | 0.00 | 0.00 | 5.00 | 1.20 | 35.19 | 36.39 | 179.98 | 0 | 2025-12-05 09:25:00 | NULL | {"\_erp\_order\_id": "WC-2025-5678", "\_warehouse\_code": "HER-01"} | 2025-12-05 09:20:00 | 2025-12-05 09:25:00 |
| 5679 | 5679 | completed | EUR | 0 | Gift wrap please | Elena | Papadopoulou |  | Agiou Nikolaou 12 | Apt 3B | Patras |  |  | 26221 | GR | elena.p@example.com | +302610654321 | Kostas | Nikolaou |  | Korinthou 88 |  | Patras |  |  | 26335 | GR | +302610777888 | cod | Cash on Delivery | free\_shipping | Free Shipping |  | BOOK10 | 4.50 | 1.08 | 0.00 | 0.00 | 8.64 | 9.72 | 45.00 | 0 | 2025-12-05 10:50:00 | 2025-12-05 15:30:00 | {"\_erp\_order\_id": "WC-2025-5679", "\_warehouse\_code": "PTR-01", "\_gift\_message": "Happy Birthday!"} | 2025-12-05 10:45:00 | 2025-12-05 15:30:00 |

### Παράδειγμα πίνακα προϊόντων παραγγελίας Magento

#### SCHEMA

```sql
CREATE TABLE `order_items` (
  `id` BIGINT UNSIGNED NOT NULL,
  `order_id` BIGINT UNSIGNED NOT NULL,
  `discount_amount` DECIMAL(20,4) NULL,
  `discount_percent` DECIMAL(12,4) NULL,
  `extension_attributes` JSON NULL,
  `name` VARCHAR(255) NULL,
  `original_price` DECIMAL(20,4) NULL,
  `price` DECIMAL(20,4) NULL,
  `qty_canceled` DECIMAL(12,4) NULL,
  `qty_invoiced` DECIMAL(12,4) NULL,
  `qty_ordered` DECIMAL(12,4) NULL,
  `qty_refunded` DECIMAL(12,4) NULL,
  `qty_shipped` DECIMAL(12,4) NULL,
  `row_total` DECIMAL(20,4) NULL,
  `row_total_incl_tax` DECIMAL(20,4) NULL,
  `sku` VARCHAR(255) NULL,
  `tax_amount` DECIMAL(20,4) NULL,
  `tax_percent` DECIMAL(12,4) NULL,
  `created_at` TIMESTAMP NULL,
  `updated_at` TIMESTAMP NULL
);
```

#### DATA

| id | order\_id | sku | name | original\_price | price | discount\_percent | discount\_amount | qty\_ordered | qty\_invoiced | qty\_shipped | qty\_refunded | qty\_canceled | row\_total | row\_total\_incl\_tax | tax\_percent | tax\_amount | extension\_attributes | created\_at | updated\_at |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 98765 | 12345 | TSHIRT-RED-M | T-Shirt Κόκκινο Medium | 29.9900 | 24.9900 | 16.6700 | 10.0000 | 2.0000 | 2.0000 | 2.0000 | 0.0000 | 0.0000 | 49.9800 | 61.9752 | 24.0000 | 11.9952 | {"color": "Red", "size": "M"} | 2025-12-05 10:30:15 | 2025-12-05 10:30:15 |
| 98766 | 12345 | LAPTOP-PRO-2025 | Professional Laptop 2025 | 1299.0000 | 1199.0000 | 7.6982 | 100.0000 | 1.0000 | 1.0000 | 0.0000 | 0.0000 | 0.0000 | 1199.0000 | 1486.7600 | 24.0000 | 287.7600 | {"warranty": "2 years", "serial\_number": "LP2025-12345"} | 2025-12-05 10:30:15 | 2025-12-05 10:30:15 |
| 98767 | 12346 | TSHIRT-RED-L | T-Shirt Κόκκινο Large | 29.9900 | 24.9900 | 16.6700 | 5.0000 | 1.0000 | 1.0000 | 1.0000 | 0.0000 | 0.0000 | 24.9900 | 30.9876 | 24.0000 | 5.9976 | {"color": "Red", "size": "L"} | 2025-12-05 11:15:00 | 2025-12-05 15:30:00 |

### Παράδειγμα πίνακα προϊόντων παραγγελίας WooCommerce

#### SCHEMA

```sql
CREATE TABLE `order_items` (
  `id` BIGINT UNSIGNED NOT NULL,
  `order_id` BIGINT UNSIGNED NOT NULL,
  `product_id` BIGINT UNSIGNED NOT NULL DEFAULT 0,
  `variation_id` BIGINT UNSIGNED NOT NULL DEFAULT 0,
  `name` VARCHAR(255) NOT NULL,
  `quantity` INT UNSIGNED NOT NULL,
  `tax_class` VARCHAR(255) NOT NULL,
  `subtotal` DECIMAL(10,2) NOT NULL,
  `subtotal_tax` DECIMAL(10,2) NOT NULL,
  `total` DECIMAL(10,2) NOT NULL,
  `total_tax` DECIMAL(10,2) NOT NULL,
  `metadata` JSON NULL,
  `sku` VARCHAR(255) NULL,
  `price` DECIMAL(10,2) NOT NULL,
  `created_at` TIMESTAMP NULL,
  `updated_at` TIMESTAMP NULL
);
```

#### DATA

| id | order\_id | product\_id | variation\_id | sku | name | quantity | price | subtotal | subtotal\_tax | total | total\_tax | tax\_class | metadata | created\_at | updated\_at |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 45678 | 5678 | 1234 | 5678 | SHOE-NIKE-42 | Nike Air Max No 42 | 2 | 69.99 | 139.98 | 33.60 | 139.98 | 33.60 | standard | {"pa\_size": "42", "pa\_color": "Black"} | 2025-12-05 09:20:00 | 2025-12-05 09:20:00 |
| 45679 | 5678 | 2345 | 0 | BOOK-PHP-2025 | PHP Programming Guide | 1 | 4.41 | 4.41 | 1.06 | 4.41 | 1.06 | reduced-rate | {"\_isbn": "978-1234567890"} | 2025-12-05 09:20:00 | 2025-12-05 09:20:00 |
| 45680 | 5679 | 2345 | 0 | BOOK-PHP-2025 | PHP Programming Guide | 1 | 36.00 | 40.50 | 9.72 | 36.00 | 8.64 | reduced-rate | {"\_isbn": "978-1234567890", "\_edition": "2nd"} | 2025-12-05 10:45:00 | 2025-12-05 10:45:00 |

### Παράδειγμα πίνακα σχολίων παραγγελίας Magento

#### SCHEMA

```sql
CREATE TABLE `order_notes` (
  `id` BIGINT UNSIGNED NOT NULL,
  `order_id` BIGINT UNSIGNED NOT NULL,
  `comment` TEXT NOT NULL,
  `is_customer_notified` TINYINT(1) NULL,
  `status` VARCHAR(255) NULL,
  `created_at` TIMESTAMP NULL,
  `updated_at` TIMESTAMP NULL
);
```

#### DATA

| id | order\_id | comment | is\_customer\_notified | status | created\_at | updated\_at |
|---|---|---|---|---|---|---|
| 1001 | 12345 | Order confirmed by customer | 1 | processing | 2025-12-05 10:30:15 | 2025-12-05 10:30:15 |
| 1002 | 12345 | Payment received | 0 | processing | 2025-12-05 10:35:00 | 2025-12-05 10:35:00 |
| 1003 | 12346 | Package delivered successfully | 1 | complete | 2025-12-05 14:20:00 | 2025-12-05 14:20:00 |

### Παράδειγμα πίνακα σχολίων παραγγελίας WooCommerce

#### SCHEMA

```sql
CREATE TABLE `order_notes` (
  `id` BIGINT UNSIGNED NOT NULL,
  `order_id` BIGINT UNSIGNED NOT NULL,
  `author` VARCHAR(255) NOT NULL,
  `note` TEXT NOT NULL,
  `customer_note` TINYINT(1) NULL,
  `added_by_user` TINYINT(1) NULL,
  `created_at` TIMESTAMP NULL,
  `updated_at` TIMESTAMP NULL
);
```

#### DATA

| id | order\_id | author | note | customer\_note | added\_by\_user | created\_at | updated\_at |
|---|---|---|---|---|---|---|---|
| 2001 | 5678 | WooCommerce | Order status changed to Processing | 0 | 0 | 2025-12-05 09:20:00 | 2025-12-05 09:20:00 |
| 2002 | 5678 | admin | Payment verified manually | 0 | 1 | 2025-12-05 09:25:00 | 2025-12-05 09:25:00 |
| 2003 | 5679 | WooCommerce | Order completed and delivered | 1 | 0 | 2025-12-05 15:30:00 | 2025-12-05 15:30:00 |

### Κατάσταση παραγγελιών

Αυτός ο πίνακας θα ενημερώνεται από την πλευρά του ERP, και έπειτα το Sébastien θα ενημερώνει την κατάσταση της παραγγελίας στο Magento ή στο WooCommerce.

Η στήλη `order_id` είναι το ID της παραγγελίας στο e-shop, δηλαδή η στήλη `id` του πίνακα παραγγελιών. Εγγραφές με `order_id` που δεν αντιστοιχεί σε παραγγελία αγνοούνται.

Το Sébastien διαβάζει μόνο τις εγγραφές που έχουν `updated_at` μεταγενέστερο από τον τελευταίο έλεγχο. Γι' αυτό η στήλη `updated_at` πρέπει να συμπληρώνεται σε κάθε νέα εγγραφή και να ενημερώνεται σε κάθε αλλαγή, διαφορετικά η εγγραφή δεν θα ληφθεί υπόψη.

### Κατάσταση παραγγελιών Magento

Η στήλη `status` μπορεί να έχει μόνο μία από τις εξής τιμές: `invoiced`, `shipped`, `complete`, `canceled`.

- Για την περίπτωση του `invoiced`, δημιουργείται τιμολόγιο στην παραγγελία. Η στήλη `notify_invoice` είναι προαιρετική και καθορίζει αν θα σταλεί email στον πελάτη. Αν είναι κενή, δεν στέλνεται email.
- Για την περίπτωση του `shipped`, δημιουργείται αποστολή στην παραγγελία. Αν οι στήλες `carrier_code`, `carrier_title` και `track_number` είναι όλες συμπληρωμένες, προστίθεται και ο αριθμός αποστολής (tracking number). Η στήλη `notify_shipment` είναι προαιρετική και καθορίζει αν θα σταλεί email στον πελάτη. Αν είναι κενή, δεν στέλνεται email.
- Για την περίπτωση του `complete`, δημιουργούνται τιμολόγιο και αποστολή, με τις ίδιες προαιρετικές στήλες όπως στα `invoiced` και `shipped`.
- Για την περίπτωση του `canceled`, δε χρειάζονται οι παραπάνω στήλες.

### Παράδειγμα πίνακα κατάστασης παραγγελίας Magento

#### SCHEMA

```sql
CREATE TABLE `order_statuses` (
  `order_id` BIGINT UNSIGNED NOT NULL,
  `status` VARCHAR(255) NOT NULL,
  `carrier_code` VARCHAR(255) NULL,
  `carrier_title` VARCHAR(255) NULL,
  `track_number` VARCHAR(255) NULL,
  `notify_invoice` TINYINT(1) NULL,
  `notify_shipment` TINYINT(1) NULL,
  `created_at` TIMESTAMP NULL,
  `updated_at` TIMESTAMP NULL
);
```

#### DATA

| order\_id | status | carrier\_code | carrier\_title | track\_number | notify\_invoice | notify\_shipment | created\_at | updated\_at |
|---|---|---|---|---|---|---|---|---|
| 12345 | invoiced | NULL | NULL | NULL | 1 | NULL | 2025-12-05 10:30:15 | 2025-12-05 10:30:15 |
| 12346 | shipped | acs | ACS Courier | ACS123456789 | 1 | 1 | 2025-12-05 11:45:22 | 2025-12-05 14:20:10 |
| 12347 | complete | elta | ELTA Courier | ELTA987654321 | 1 | 1 | 2025-12-04 09:15:33 | 2025-12-05 16:50:45 |
| 12348 | canceled | NULL | NULL | NULL | NULL | NULL | 2025-12-05 08:20:00 | 2025-12-05 08:25:18 |

### Κατάσταση παραγγελιών WooCommerce

Η στήλη `status` μπορεί να έχει μόνο μία από τις εξής τιμές: `shipped`, `complete`, `canceled`.

- Για την περίπτωση του `shipped`, αν οι στήλες `shipping_method_title` και `shipping_method_id` είναι συμπληρωμένες θα ενημερώνεται το shipping line της παραγγελίας. Αν η στήλη `tracking_number` είναι συμπληρωμένη θα ενημερώνονται τα metadata με κλειδί `tracking_number`.
- Για την περίπτωση του `complete`, ισχύει ό,τι και στο `shipped`, με τη διαφορά ότι η κατάσταση της παραγγελίας αλλάζει σε `completed`.
- Για την περίπτωση του `canceled`, δεν απαιτούνται επιπλέον στήλες.

### Παράδειγμα πίνακα κατάστασης παραγγελίας WooCommerce

#### SCHEMA

```sql
CREATE TABLE `order_statuses` (
  `order_id` BIGINT UNSIGNED NOT NULL,
  `status` VARCHAR(255) NOT NULL,
  `shipping_method_id` VARCHAR(255) NULL,
  `shipping_method_title` VARCHAR(255) NULL,
  `tracking_number` VARCHAR(255) NULL,
  `created_at` TIMESTAMP NULL,
  `updated_at` TIMESTAMP NULL
);
```

#### DATA

| order\_id | status | shipping\_method\_id | shipping\_method\_title | tracking\_number | created\_at | updated\_at |
|---|---|---|---|---|---|---|
| 5679 | shipped | flat\_rate | Flat Rate Shipping | ACS123456789 | 2025-12-05 11:45:22 | 2025-12-05 14:20:10 |
| 5680 | complete | free\_shipping | Free Shipping | ELTA987654321 | 2025-12-04 09:15:33 | 2025-12-05 16:50:45 |
| 5681 | canceled | NULL | NULL | NULL | 2025-12-05 08:20:00 | 2025-12-05 08:25:18 |
