@@ -26,9 +26,146 @@ public function getInvoicesByAccountId($accountId) {
2626
2727 $ stmt = $ this ->conn ->prepare ($ query );
2828 $ stmt ->bindValue (':accountId ' , $ accountId , PDO ::PARAM_INT );
29+ $ stmt ->bindValue (':total ' , 0.0 );
30+ $ stmt ->bindValue (':statusId ' , $ statusId , PDO ::PARAM_INT );
31+ $ stmt ->bindValue (':paymentId ' , $ paymentId , PDO ::PARAM_INT );
32+ $ stmt ->bindValue (':addressId ' , $ addressId , PDO ::PARAM_INT );
2933 $ stmt ->execute ();
3034
31- return $ stmt ->fetchAll (PDO ::FETCH_OBJ );
35+ $ invoiceId = $ this ->conn ->lastInsertId ();
36+ $ totalFacture = 0.0 ;
37+
38+ $ products = $ cart ['products ' ] ?? [];
39+ foreach ($ products as $ lineKey => $ item ) {
40+
41+ $ basePrice = (float )$ item ['price ' ];
42+ $ optionsDeltaSum = 0.0 ;
43+
44+ if (!empty ($ item ['options ' ])) {
45+ foreach ($ item ['options ' ] as $ slot ) {
46+ foreach ($ slot ['choices ' ] as $ choice ) {
47+ $ optionsDeltaSum += (float )($ choice ['priceDelta ' ] ?? 0 );
48+ }
49+ }
50+ }
51+
52+ $ finalUnitPrice = $ basePrice + $ optionsDeltaSum ;
53+ $ quantity = (int )$ item ['quantity ' ];
54+
55+ $ queryLine = "INSERT INTO invoice_line (unit_price, quantity, invoice_id, product_id, menu_id)
56+ VALUES (:unitPrice, :quantity, :invoiceId, :productId, NULL) " ;
57+
58+ $ stmtLine = $ this ->conn ->prepare ($ queryLine );
59+ $ stmtLine ->bindValue (':unitPrice ' , $ finalUnitPrice );
60+ $ stmtLine ->bindValue (':quantity ' , $ quantity , PDO ::PARAM_INT );
61+ $ stmtLine ->bindValue (':invoiceId ' , $ invoiceId , PDO ::PARAM_INT );
62+ $ stmtLine ->bindValue (':productId ' , $ item ['product_id ' ], PDO ::PARAM_INT );
63+ $ stmtLine ->execute ();
64+
65+ $ invoiceLineId = $ this ->conn ->lastInsertId ();
66+
67+ if (!empty ($ item ['options ' ])) {
68+ foreach ($ item ['options ' ] as $ slot ) {
69+ foreach ($ slot ['choices ' ] as $ choice ) {
70+ $ queryOpt = "INSERT INTO invoice_line_product_option (invoice_line_id, product_option_id, unit_price_delta, quantity)
71+ VALUES (:invoiceLineId, :optionId, :unitPriceDelta, :quantity) " ;
72+
73+ $ stmtOpt = $ this ->conn ->prepare ($ queryOpt );
74+ $ stmtOpt ->bindValue (':invoiceLineId ' , $ invoiceLineId , PDO ::PARAM_INT );
75+ $ stmtOpt ->bindValue (':optionId ' , $ choice ['optionProductId ' ], PDO ::PARAM_INT );
76+ $ stmtOpt ->bindValue (':unitPriceDelta ' , $ choice ['priceDelta ' ]);
77+ $ stmtOpt ->bindValue (':quantity ' , $ quantity , PDO ::PARAM_INT ); // Quantité calquée sur le produit
78+ $ stmtOpt ->execute ();
79+ }
80+ }
81+ }
82+
83+ $ totalFacture += ($ finalUnitPrice * $ quantity );
84+ }
85+
86+ /*
87+ // Add menu items to the invoice
88+ $menus = $cart['menus'] ?? [];
89+ foreach ($menus as $menuId => $menu) {
90+ $query = "INSERT INTO invoice_line (unit_price, quantity, invoice_id, product_id, menu_id)
91+ VALUES (:unitPrice, :quantity, :invoiceId, NULL, :menuId)";
92+
93+ $menuPrice = $menu['price'];
94+ $menuQuantity = $menu['quantity'];
95+ $menuItems = $menu['items'] ?? [];
96+
97+ $stmt = $this->conn->prepare($query);
98+
99+ $stmt->bindValue(':unitPrice', $menuPrice);
100+ $stmt->bindValue(':invoiceId', $invoiceId, PDO::PARAM_INT);
101+ $stmt->bindValue(':menuId', $menuId, PDO::PARAM_INT);
102+ $stmt->bindValue(':quantity', $menuQuantity, PDO::PARAM_INT);
103+
104+ $stmt->execute();
105+
106+ $invoiceLineId = $this->conn->lastInsertId();
107+
108+ // Insert menu items for the invoice line
109+ foreach ($menuItems as $item) {
110+ // price and price_delta are used for redundancy
111+ // $menuPrice should already include the price of the items,
112+ // but we store it for easier retrieval when displaying the invoice
113+ $itemId = $item['id'];
114+ $itemPrice = $item['price'];
115+ $itemDelta = $item['price_delta'];
116+ $itemQuantity = $item['quantity'];
117+
118+ $query = "INSERT INTO invoice_line_menu_item (invoice_line_id, product_id, unit_price, unit_price_delta, quantity)
119+ VALUES (:invoiceLineId, :itemId, :unitPrice, :unitPriceDelta, :quantity)";
120+
121+ $stmt = $this->conn->prepare($query);
122+
123+ $stmt->bindValue(':invoiceLineId', $invoiceLineId, PDO::PARAM_INT);
124+ $stmt->bindValue(':itemId', $itemId, PDO::PARAM_INT);
125+ $stmt->bindValue(':unitPrice', $itemPrice);
126+ $stmt->bindValue(':unitPriceDelta', $itemDelta);
127+ $stmt->bindValue(':quantity', $itemQuantity, PDO::PARAM_INT);
128+
129+ $stmt->execute();
130+
131+ // Insert product options for the menu item
132+ $menuOptions = $item['options'] ?? [];
133+ $optionsTotal = 0.0;
134+
135+ foreach ($menuOptions as $option) {
136+ $query = "INSERT INTO invoice_line_product_option (invoice_line_id, product_option_id, unit_price_delta, quantity)
137+ VALUES (:invoiceLineId, :optionId, :unitPriceDelta, :quantity)";
138+
139+ $optionId = $option['id'];
140+ $optionPriceDelta = $option['price_delta'];
141+ $optionQuantity = $option['quantity'];
142+
143+ $stmt = $this->conn->prepare($query);
144+
145+ $stmt->bindValue(':invoiceLineId', $invoiceLineId, PDO::PARAM_INT);
146+ $stmt->bindValue(':optionId', $optionId, PDO::PARAM_INT);
147+ $stmt->bindValue(':unitPriceDelta', $optionPriceDelta);
148+ $stmt->bindValue(':quantity', $optionQuantity, PDO::PARAM_INT);
149+
150+ $stmt->execute();
151+
152+ $optionsTotal += $optionPriceDelta * $optionQuantity;
153+ }
154+ }
155+
156+ $total += ($menuPrice + $optionsTotal) * $menuQuantity;
157+ }
158+
159+ */
160+
161+ // Update the invoice total
162+ $ queryUpdate = "UPDATE invoice SET total = :total WHERE id = :invoiceId " ;
163+ $ stmtUpdate = $ this ->conn ->prepare ($ queryUpdate );
164+ $ stmtUpdate ->bindValue (':total ' , $ totalFacture );
165+ $ stmtUpdate ->bindValue (':invoiceId ' , $ invoiceId , PDO ::PARAM_INT );
166+ $ stmtUpdate ->execute ();
167+
168+ return $ invoiceId ;
32169 }
33170
34171
@@ -183,4 +320,4 @@ public function createInvoice($accountId, $cart, $statusId, $paymentId, $address
183320 }
184321
185322
186- }
323+ }
0 commit comments