PageRenderTime 109ms CodeModel.GetById 46ms app.highlight 55ms RepoModel.GetById 2ms app.codeStats 0ms

/classes/service/AchatService.php

http://zeybux.googlecode.com/
PHP | 884 lines | 521 code | 92 blank | 271 comment | 45 complexity | 0555c1b3cdde3065f0cd428854cb1b4e MD5 | raw file
  1<?php
  2//****************************************************************
  3//
  4// Createur : Julien PIERRE
  5// Date de creation : 22/07/2011
  6// Fichier : AchatService.php
  7//
  8// Description : Classe AchatService
  9//
 10//****************************************************************
 11
 12// Inclusion des classes
 13/*include_once(CHEMIN_CLASSES_MANAGERS . "ReservationManager.php");
 14include_once(CHEMIN_CLASSES_MANAGERS . "HistoriqueReservationManager.php");
 15include_once(CHEMIN_CLASSES_VALIDATEUR . "ReservationValid.php");
 16include_once(CHEMIN_CLASSES_SERVICE . "CompteService.php" );*/
 17include_once(CHEMIN_CLASSES_VO . "AchatVO.php");
 18include_once(CHEMIN_CLASSES_VO . "ListeAchatReservationVO.php");
 19include_once(CHEMIN_CLASSES_SERVICE . "StockService.php" );
 20include_once(CHEMIN_CLASSES_SERVICE . "DetailOperationService.php" );
 21include_once(CHEMIN_CLASSES_SERVICE . "OperationService.php" );
 22include_once(CHEMIN_CLASSES_VALIDATEUR . "AchatValid.php");
 23include_once(CHEMIN_CLASSES_VIEW_MANAGER . "AchatDetailSolidaireViewManager.php");
 24include_once(CHEMIN_CLASSES_VIEW_MANAGER . "AchatDetailViewManager.php");
 25include_once(CHEMIN_CLASSES_VIEW_MANAGER . "AdherentViewManager.php");
 26include_once(CHEMIN_CLASSES_VIEW_MANAGER . "DetailMarcheViewManager.php");
 27
 28/**
 29 * @name AchatService
 30 * @author Julien PIERRE
 31 * @since 22/07/2011
 32 * @desc Classe Service d'une Achat
 33 */
 34class AchatService
 35{		
 36	/**
 37	* @name set($pAchat)
 38	* @param AchatVO
 39	* @return integer
 40	* @desc Ajoute ou modifie une réservation
 41	*/
 42	public function set($pAchat) {
 43		$lAchatValid = new AchatValid();
 44		if($lAchatValid->insert($pAchat)) {
 45			return $this->insert($pAchat);
 46		} else if($lAchatValid->updateReservation($pAchat)) {
 47			return $this->updateReservation($pAchat);
 48		} else if($lAchatValid->updateAchat($pAchat)) {
 49			return $this->updateAchat($pAchat);
 50		}
 51		return false;
 52	}
 53	
 54	/**
 55	* @name insert($pAchat)
 56	* @param AchatVO
 57	* @return integer
 58	* @desc Ajoute une réservation
 59	*/
 60	private function insert($pAchat) {
 61		// Calcul du total
 62		$lTotal = 0;
 63		foreach($pAchat->getDetailAchat() as $lProduit) {			
 64			$lTotal += $lProduit->getMontant();
 65		}
 66		
 67		$lOperationService = new OperationService();
 68		if($lTotal < 0) {
 69			// L'operation
 70			$lOperation = new OperationVO();
 71			$lOperation->setIdCompte($pAchat->getId()->getIdCompte());
 72			$lOperation->setMontant($lTotal);
 73			$lOperation->setLibelle("Marché N°" . $pAchat->getId()->getIdCommande());
 74			$lOperation->setTypePaiement(7);
 75			$lOperation->setIdCommande($pAchat->getId()->getIdCommande());
 76			$lIdOperation = $lOperationService->set($lOperation);
 77			
 78			// Operation sur le compte Zeybu
 79			$lOperationZeybu = new OperationVO();
 80			$lOperationZeybu->setIdCompte(-1);
 81			$lOperationZeybu->setMontant($lTotal * -1);
 82			$lOperationZeybu->setLibelle("Marché N°" . $pAchat->getId()->getIdCommande());
 83			$lOperationZeybu->setTypePaiement(7);
 84			$lOperationZeybu->setTypePaiementChampComplementaire($lIdOperation);
 85			$lOperationZeybu->setIdCommande($pAchat->getId()->getIdCommande());
 86			$lIdOperationZeybu = $lOperationService->set($lOperationZeybu);
 87
 88			$lOperation->setTypePaiementChampComplementaire($lIdOperationZeybu);
 89			$lOperationService->set($lOperation);
 90	
 91			// Ajout detail operation		
 92			$lStockService = new StockService;		
 93			$lDetailOperationService = new DetailOperationService;
 94			foreach($pAchat->getDetailAchat() as $lProduit) {
 95				// Ajout du stock
 96				$lStock = new StockVO();
 97				$lStock->setQuantite($lProduit->getQuantite());
 98				$lStock->setType(1);
 99				$lStock->setIdCompte($pAchat->getId()->getIdCompte());
100				$lStock->setIdDetailCommande($lProduit->getIdDetailCommande());
101				$lStock->setIdOperation($lIdOperation);
102				$lStockService->set($lStock);
103					
104				// Ajout du détail de l'operation
105				$lDetailOperation = new DetailOperationVO();
106				$lDetailOperation->setIdOperation($lIdOperation);
107				$lDetailOperation->setIdCompte($pAchat->getId()->getIdCompte());
108				$lDetailOperation->setMontant($lProduit->getMontant());
109				$lDetailOperation->setLibelle("Marché N°" . $pAchat->getId()->getIdCommande());
110				$lDetailOperation->setTypePaiement(7);
111				$lDetailOperation->setIdDetailCommande($lProduit->getIdDetailCommande());
112				$lDetailOperationService->set($lDetailOperation);
113			}
114		}	
115		// Ajout des produits solidaire
116		$lIdOperation = $this->insertProduitAchatSolidaire($pAchat);
117		
118		return $lIdOperation;
119	}
120	
121	/**
122	* @name updateReservation($pAchat)
123	* @param AchatVO
124	* @return integer
125	* @desc Met ŕ jour une réservation pour la passer en achat
126	*/
127	private function updateReservation($pAchat) {
128		$lIdReservation = new IdReservationVO();
129		$lIdReservation->setIdCompte($pAchat->getId()->getIdCompte());
130		$lIdReservation->setIdCommande($pAchat->getId()->getIdCommande());
131		
132		$lReservationService = new ReservationService();
133		$lReservationActuelle = $lReservationService->get($lIdReservation);
134		return $this->update($lReservationActuelle,$pAchat,$pAchat->getId()->getIdReservation());	
135	}
136	
137	/**
138	* @name updateAchat($pAchat)
139	* @param AchatVO
140	* @return integer
141	* @desc Met ŕ jour un achat
142	*/
143	private function updateAchat($pAchat) {
144		$lAchat = $this->get($pAchat->getId());
145		return $this->update($lAchat,$pAchat,$pAchat->getId()->getIdAchat());
146	}
147	
148	/**
149	* @name update($pAchat)
150	* @param AchatVO
151	* @return integer
152	* @desc Met ŕ jour une réservation
153	*/
154	private function update($pAchatActuel,$pNouvelAchat,$pIdOperation) {		
155		// Récupération de l'opération
156		$lOperationService = new OperationService();
157		$lOperation = $lOperationService->get($pIdOperation);
158
159		switch($lOperation->getTypePaiement()) {
160			case 0: // Une réservation
161				// Mise ŕ jour du détail			
162				$lTotal = $this->updateProduitReservationAchat($pAchatActuel,$pNouvelAchat,$pIdOperation);
163				$lIdOperationSolidaire = $this->insertProduitAchatSolidaire($pNouvelAchat);
164				if($lTotal < 0) {
165					// Mise ŕ jour de l'opération de réservation en achat
166					$lOperation->setMontant($lTotal);
167					$lOperation->setTypePaiement(7);
168					$lIdOperation = $lOperationService->set($lOperation);
169	
170					// Operation sur le compte Zeybu
171					$lOperationZeybu = new OperationVO();
172					$lOperationZeybu->setIdCompte(-1);
173					$lOperationZeybu->setMontant($lTotal * -1);
174					$lOperationZeybu->setLibelle("Marché N°" . $pNouvelAchat->getId()->getIdCommande());
175					$lOperationZeybu->setTypePaiement(7);
176					$lOperationZeybu->setTypePaiementChampComplementaire($lIdOperation);
177					$lOperationZeybu->setIdCommande($pNouvelAchat->getId()->getIdCommande());
178					$lIdOperationZeybu = $lOperationService->set($lOperationZeybu);	
179					
180					$lOperation->setTypePaiementChampComplementaire($lIdOperationZeybu);
181					$lOperationService->set($lOperation);
182				} else {
183					// Mise ŕ jour de l'opération de réservation en annulation
184					//$lOperation->setTypePaiement(16);
185					$lOperationService->delete($lOperation);					
186				}			
187				break;
188				
189			case 7: // Achat
190				$lTotal = $this->updateProduitAchat($pAchatActuel,$pNouvelAchat,$pIdOperation);
191				if($lTotal < 0) {
192					// Mise ŕ jour de l'opération d'achat
193					$lOperation->setMontant($lTotal);
194					$lOperationService->set($lOperation);
195					
196					
197					$lOperationZeybu = $lOperationService->get($lOperation->getTypePaiementChampComplementaire());
198					$lOperationZeybu->setMontant($lTotal * -1);
199					$lOperationService->set($lOperationZeybu);
200				} else {
201					// Mise ŕ jour de l'opération en annulation
202					//$lOperation->setTypePaiement(18);
203					$lOperationService->delete($lOperation->getId());		
204
205					$lOperationZeybu = $lOperationService->get($lOperation->getTypePaiementChampComplementaire());
206					//$lOperationZeybu->setTypePaiement(18);
207					$lOperationService->delete($lOperationZeybu->getId());	
208				}
209				break;
210				
211			case 8: // Achat Solidaire
212				$lTotalSolidaire = $this->updateProduitAchatSolidaire($pAchatActuel,$pNouvelAchat,$pIdOperation);
213				if($lTotalSolidaire < 0) {
214					// Mise ŕ jour de l'opération d'achat
215					$lOperation->setMontant($lTotalSolidaire);
216					$lOperationService->set($lOperation);
217										
218					$lOperationZeybu = $lOperationService->get($lOperation->getTypePaiementChampComplementaire());
219					$lOperationZeybu->setMontant($lTotalSolidaire * -1);
220					$lOperationService->set($lOperationZeybu);
221				} else {
222					// Mise ŕ jour de l'opération en annulation
223					//$lOperation->setTypePaiement(20);
224					$lOperationService->delete($lOperation->getId());		
225
226					$lOperationZeybu = $lOperationService->get($lOperation->getTypePaiementChampComplementaire());
227					//$lOperationZeybu->setTypePaiement(20);
228					$lOperationService->delete($lOperationZeybu->getId());	
229				}
230				break;			
231		}
232
233		return true;
234	}
235	
236	/**
237	* @name updateProduitAchat($pAchatActuel,$pNouvelAchat,$pIdOperation)
238	* @param AchatVO
239	* @param AchatVO
240	* @param integer
241	* @return decimal(10,2)
242	* @desc Met ŕ jour les produits
243	*/
244	private function updateProduitAchat($pAchatActuel,$pNouvelAchat,$pIdOperation) {
245		$lTotal = 0;
246
247		$lStockService = new StockService();
248		$lDetailOperationService = new DetailOperationService();
249
250		foreach($pAchatActuel->getDetailAchat() as $lAchatActuelle) {
251			$lTestUpdate = false;
252			foreach($pNouvelAchat->getDetailAchat() as $lAchatNouvelle) {
253				if($lAchatActuelle->getIdDetailCommande() == $lAchatNouvelle->getIdDetailCommande()) {
254					$lTotal += $lAchatNouvelle->getMontant();
255					// Maj du stock
256					$lStock = new StockVO();
257					$lStock->setId($lAchatActuelle->getId()->getIdStock());
258					$lStock->setQuantite($lAchatNouvelle->getQuantite());
259					$lStock->setType(1);
260					$lStock->setIdCompte($pNouvelAchat->getId()->getIdCompte());
261					$lStock->setIdDetailCommande($lAchatActuelle->getIdDetailCommande());
262					$lStock->setIdOperation($pIdOperation);
263					$lStockService->set($lStock);
264					
265					// Maj du détail Opération
266					$lDetailOperation = new DetailOperationVO();
267					$lDetailOperation->setId($lAchatActuelle->getId()->getIdDetailOperation());
268					$lDetailOperation->setIdOperation($pIdOperation);
269					$lDetailOperation->setIdCompte($pNouvelAchat->getId()->getIdCompte());
270					$lDetailOperation->setMontant($lAchatNouvelle->getMontant());
271					$lDetailOperation->setLibelle("Marché N°" . $pNouvelAchat->getId()->getIdCommande());
272					$lDetailOperation->setTypePaiement(7);
273					$lDetailOperation->setIdDetailCommande($lAchatActuelle->getIdDetailCommande());
274					$lDetailOperationService->set($lDetailOperation);					
275					
276					$lTestUpdate = true;
277				}
278			}
279			if(!$lTestUpdate) {
280				// Suppression du stock et du detail operation
281				$lStockService->delete($lAchatActuelle->getId()->getIdStock());
282				$lDetailOperationService->delete($lAchatActuelle->getId()->getIdDetailOperation());
283			}
284		}
285		
286		foreach($pNouvelAchat->getDetailAchat() as $lAchatNouvelle) {
287			$lTestInsert = true;
288			foreach($pAchatActuel->getDetailAchat() as $lAchatActuelle) {
289				if($lAchatActuelle->getIdDetailCommande() == $lAchatNouvelle->getIdDetailCommande()) {
290					$lTestInsert = false;
291				}
292			}
293			if($lTestInsert) {
294				$lTotal += $lAchatNouvelle->getMontant();
295
296				// Ajout du stock
297				$lStock = new StockVO();
298				$lStock->setQuantite($lAchatNouvelle->getQuantite());
299				$lStock->setType(1);
300				$lStock->setIdCompte($pNouvelAchat->getId()->getIdCompte());
301				$lStock->setIdDetailCommande($lAchatNouvelle->getIdDetailCommande());
302				$lStock->setIdOperation($pIdOperation);
303				$lStockService->set($lStock);
304				
305				// Ajout du détail Opération
306				$lDetailOperation = new DetailOperationVO();
307				$lDetailOperation->setIdOperation($pIdOperation);
308				$lDetailOperation->setIdCompte($pNouvelAchat->getId()->getIdCompte());
309				$lDetailOperation->setMontant($lAchatNouvelle->getMontant());
310				$lDetailOperation->setLibelle("Marché N°" . $pNouvelAchat->getId()->getIdCommande());
311				$lDetailOperation->setTypePaiement(7);
312				$lDetailOperation->setIdDetailCommande($lAchatNouvelle->getIdDetailCommande());
313				$lDetailOperationService->set($lDetailOperation);	
314			}
315		}
316
317		return $lTotal;		
318	}
319	
320	/**
321	* @name updateProduitReservationAchat($pAchatActuel,$pNouvelAchat,$pIdOperation)
322	* @param AchatVO
323	* @param AchatVO
324	* @param integer
325	* @return decimal(10,2)
326	* @desc Met ŕ jour les produits
327	*/
328	private function updateProduitReservationAchat($pAchatActuel,$pNouvelAchat,$pIdOperation) {
329		$lTotal = 0;
330
331		$lStockService = new StockService();
332		$lDetailOperationService = new DetailOperationService();
333
334		foreach($pAchatActuel->getDetailReservation() as $lAchatActuelle) {
335			$lTestUpdate = false;
336			foreach($pNouvelAchat->getDetailAchat() as $lAchatNouvelle) {
337				if($lAchatActuelle->getIdDetailCommande() == $lAchatNouvelle->getIdDetailCommande()) {
338					$lTotal += $lAchatNouvelle->getMontant();
339					
340					// Maj du stock
341					$lStock = new StockVO();
342					//$lStock->setId($lAchatActuelle->getId()->getIdStock());
343					$lStock->setQuantite($lAchatNouvelle->getQuantite());
344					$lStock->setType(1);
345					$lStock->setIdCompte($pNouvelAchat->getId()->getIdCompte());
346					$lStock->setIdDetailCommande($lAchatActuelle->getIdDetailCommande());
347					$lStock->setIdOperation($pIdOperation);
348					$lStockService->set($lStock);
349					
350					// Maj du détail Opération
351					$lDetailOperation = new DetailOperationVO();
352					//$lDetailOperation->setId($lAchatActuelle->getId()->getIdDetailOperation());
353					$lDetailOperation->setIdOperation($pIdOperation);
354					$lDetailOperation->setIdCompte($pNouvelAchat->getId()->getIdCompte());
355					$lDetailOperation->setMontant($lAchatNouvelle->getMontant());
356					$lDetailOperation->setLibelle("Marché N°" . $pNouvelAchat->getId()->getIdCommande());
357					$lDetailOperation->setTypePaiement(7);
358					$lDetailOperation->setIdDetailCommande($lAchatActuelle->getIdDetailCommande());
359					$lDetailOperationService->set($lDetailOperation);					
360					
361					$lTestUpdate = true;
362				}
363			}
364			if(!$lTestUpdate) {
365				// Suppression du stock et du detail operation
366				$lStockService->delete($lAchatActuelle->getId()->getIdStock());
367				$lDetailOperationService->delete($lAchatActuelle->getId()->getIdDetailOperation());
368			}
369		}
370		
371		foreach($pNouvelAchat->getDetailAchat() as $lAchatNouvelle) {
372			$lTestInsert = true;
373			foreach($pAchatActuel->getDetailReservation() as $lAchatActuelle) {
374				if($lAchatActuelle->getIdDetailCommande() == $lAchatNouvelle->getIdDetailCommande()) {
375					$lTestInsert = false;
376				}
377			}
378			if($lTestInsert) {
379				$lTotal += $lAchatNouvelle->getMontant();
380					
381				// Ajout du stock
382				$lStock = new StockVO();
383				$lStock->setQuantite($lAchatNouvelle->getQuantite());
384				$lStock->setType(1);
385				$lStock->setIdCompte($pNouvelAchat->getId()->getIdCompte());
386				$lStock->setIdDetailCommande($lAchatNouvelle->getIdDetailCommande());
387				$lStock->setIdOperation($pIdOperation);
388				$lStockService->set($lStock);
389				
390				// Ajout du détail Opération
391				$lDetailOperation = new DetailOperationVO();
392				$lDetailOperation->setIdOperation($pIdOperation);
393				$lDetailOperation->setIdCompte($pNouvelAchat->getId()->getIdCompte());
394				$lDetailOperation->setMontant($lAchatNouvelle->getMontant());
395				$lDetailOperation->setLibelle("Marché N°" . $pNouvelAchat->getId()->getIdCommande());
396				$lDetailOperation->setTypePaiement(7);
397				$lDetailOperation->setIdDetailCommande($lAchatNouvelle->getIdDetailCommande());
398				$lDetailOperationService->set($lDetailOperation);	
399			}
400		}
401		
402		return $lTotal;		
403	}
404	
405	
406	/**
407	* @name updateProduitAchatSolidaire($pAchatActuel,$pNouvelAchat,$pIdOperation)
408	* @param AchatVO
409	* @param AchatVO
410	* @param integer
411	* @return decimal(10,2)
412	* @desc Met ŕ jour les produits solidaire
413	*/
414	private function updateProduitAchatSolidaire($pAchatActuel,$pNouvelAchat,$pIdOperation) {
415		$lTotalSolidaire = 0;
416		
417		$lStockService = new StockService();
418		$lDetailOperationService = new DetailOperationService();
419		
420		foreach($pAchatActuel->getDetailAchatSolidaire() as $lAchatActuelle) {
421			$lTestUpdate = false;
422			foreach($pNouvelAchat->getDetailAchatSolidaire() as $lAchatNouvelle) {
423				if($lAchatActuelle->getIdDetailCommande() == $lAchatNouvelle->getIdDetailCommande()) {
424					$lTotalSolidaire += $lAchatNouvelle->getMontant();
425					
426					// Maj du stock
427					$lStock = new StockVO();
428					$lStock->setId($lAchatActuelle->getId()->getIdStock());
429					$lStock->setQuantite($lAchatNouvelle->getQuantite());
430					$lStock->setType(2);
431					$lStock->setIdCompte($pNouvelAchat->getId()->getIdCompte());
432					$lStock->setIdDetailCommande($lAchatActuelle->getIdDetailCommande());
433					$lStock->setIdOperation($pIdOperation);
434					$lStockService->set($lStock);
435					
436					// Maj de la qté produit dans le stock solidaire
437					$lStockSolidaireActuel = $lStockService->selectSolidaireByIdNomProduitUnite($lAchatNouvelle->getIdNomProduit(),$lAchatNouvelle->getUnite());
438					$lStockSolidaireActuel = $lStockSolidaireActuel[0];		
439			
440					$lStockSolidaire = new StockSolidaireVO();
441					if(!is_null($lStockSolidaireActuel->getId())) {
442						$lStockSolidaire->setId($lStockSolidaireActuel->getId());
443						$lStockSolidaire->setQuantite($lStockSolidaireActuel->getQuantite() + $lAchatNouvelle->getQuantite() - $lAchatActuelle->getQuantite());
444						$lStockSolidaire->setIdNomProduit($lAchatNouvelle->getIdNomProduit());
445						$lStockSolidaire->setUnite($lAchatNouvelle->getUnite());
446						$lStockService->setSolidaire($lStockSolidaire);
447					}
448					
449					// Maj du détail Opération
450					$lDetailOperation = new DetailOperationVO();
451					$lDetailOperation->setId($lAchatActuelle->getId()->getIdDetailOperation());
452					$lDetailOperation->setIdOperation($pIdOperation);
453					$lDetailOperation->setIdCompte($pNouvelAchat->getId()->getIdCompte());
454					$lDetailOperation->setMontant($lAchatNouvelle->getMontant());
455					$lDetailOperation->setLibelle("Marché Solidaire N°" . $pNouvelAchat->getId()->getIdCommande());
456					$lDetailOperation->setTypePaiement(8);
457					$lDetailOperation->setIdDetailCommande($lAchatActuelle->getIdDetailCommande());
458					$lDetailOperationService->set($lDetailOperation);					
459					
460					$lTestUpdate = true;
461				}
462			}
463			if(!$lTestUpdate) {
464			// Suppression du stock et du detail operation
465				$lStockService->delete($lAchatActuelle->getId()->getIdStock());
466				$lDetailOperationService->delete($lAchatActuelle->getId()->getIdDetailOperation());
467				
468				// Maj de la qté produit dans le stock solidaire
469				$lStockSolidaireActuel = $lStockService->selectSolidaireByIdNomProduitUnite($lAchatActuelle->getIdNomProduit(),$lAchatActuelle->getUnite());
470				$lStockSolidaireActuel = $lStockSolidaireActuel[0];
471
472			//	$lDetail = DetailMarcheViewManager::selectByLot($lAchatActuelle->getId()->getIdDetailOperation());
473				
474				// Maj de la qté produit dans le stock solidaire				
475			/*	$lStock = $lStockService->get($lDetail->getId()->getIdStock());
476				$lDetailMarche = DetailMarcheViewManager::selectByLot($lStock->getIdDetailCommande());
477				$lDetailMarche = $lDetailMarche[0];	*/
478		
479				$lStockSolidaire = new StockSolidaireVO();
480				if(!is_null($lStockSolidaireActuel->getId())) {
481					$lStockSolidaire->setId($lStockSolidaireActuel->getId());
482					$lStockSolidaire->setQuantite($lStockSolidaireActuel->getQuantite() - $lAchatActuelle->getQuantite());
483					$lStockSolidaire->setIdNomProduit($lStockSolidaireActuel->getProIdNomProduit());
484					$lStockSolidaire->setUnite($lStockSolidaireActuel->getProUniteMesure());
485					$lStockService->setSolidaire($lStockSolidaire);
486				}
487				
488			}
489		}
490		
491		foreach($pNouvelAchat->getDetailAchatSolidaire() as $lAchatNouvelle) {
492			$lTestInsert = true;
493			foreach($pAchatActuel->getDetailAchatSolidaire() as $lAchatActuelle) {
494				if($lAchatActuelle->getIdDetailCommande() == $lAchatNouvelle->getIdDetailCommande()) {
495					$lTestInsert = false;
496				}
497			}
498			if($lTestInsert) {
499				$lTotalSolidaire += $lAchatNouvelle->getMontant();
500					
501				// Ajout du stock
502				$lStock = new StockVO();
503				$lStock->setQuantite($lAchatNouvelle->getQuantite());
504				$lStock->setType(2);
505				$lStock->setIdCompte($pNouvelAchat->getId()->getIdCompte());
506				$lStock->setIdDetailCommande($lAchatNouvelle->getIdDetailCommande());
507				$lStock->setIdOperation($pIdOperation);
508				$lStockService->set($lStock);
509				
510				// Suppression de la qté produit dans le stock solidaire
511				$lStockSolidaireActuel = $lStockService->selectSolidaireByIdNomProduitUnite($lAchatNouvelle->getIdNomProduit(),$lAchatNouvelle->getUnite());
512				$lStockSolidaireActuel = $lStockSolidaireActuel[0];		
513		
514				$lStockSolidaire = new StockSolidaireVO();
515				if(!is_null($lStockSolidaireActuel->getId())) {
516					$lStockSolidaire->setId($lStockSolidaireActuel->getId());
517					$lStockSolidaire->setQuantite($lStockSolidaireActuel->getQuantite() + $lAchatNouvelle->getQuantite());
518					$lStockSolidaire->setIdNomProduit($lAchatNouvelle->getIdNomProduit());
519					$lStockSolidaire->setUnite($lAchatNouvelle->getUnite());
520					$lStockService->setSolidaire($lStockSolidaire);
521				}
522				
523				// Ajout du détail Opération
524				$lDetailOperation = new DetailOperationVO();
525				$lDetailOperation->setIdOperation($pIdOperation);
526				$lDetailOperation->setIdCompte($pNouvelAchat->getId()->getIdCompte());
527				$lDetailOperation->setMontant($lAchatNouvelle->getMontant());
528				$lDetailOperation->setLibelle("Marché Solidaire N°" . $pNouvelAchat->getId()->getIdCommande());
529				$lDetailOperation->setTypePaiement(8);
530				$lDetailOperation->setIdDetailCommande($lAchatNouvelle->getIdDetailCommande());
531				$lDetailOperationService->set($lDetailOperation);	
532			}
533		}
534
535		return $lTotalSolidaire;
536	}
537	
538	/**
539	* @name insertProduitAchatSolidaire($pAchat)
540	* @param AchatVO
541	* @return decimal(10,2)
542	* @desc Ajoute les produits solidaire
543	*/
544	private function insertProduitAchatSolidaire($pAchat) {
545		$lTotalSolidaire = 0;
546		foreach($pAchat->getDetailAchatSolidaire() as $lProduit) {			
547			$lTotalSolidaire += $lProduit->getMontant();
548		}
549		
550		// L'operation Solidaire
551		$lOperationSolidaire = new OperationVO();
552		$lOperationSolidaire->setIdCompte($pAchat->getId()->getIdCompte());
553		$lOperationSolidaire->setMontant($lTotalSolidaire);
554		$lOperationSolidaire->setLibelle("Marché Solidaire N°" . $pAchat->getId()->getIdCommande());
555		$lOperationSolidaire->setTypePaiement(8);
556		$lOperationSolidaire->setIdCommande($pAchat->getId()->getIdCommande());
557		
558		$lOperationService = new OperationService();
559				
560		if($lTotalSolidaire < 0) {
561			$lIdOperationSolidaire = $lOperationService->set($lOperationSolidaire);
562			// Ajout Détail Operation Solidaire
563			$lStockService = new StockService();
564			$lDetailOperationService = new DetailOperationService();
565			foreach($pAchat->getDetailAchatSolidaire() as $lProduit) {
566				// Ajout du stock
567				$lStock = new StockVO();
568				$lStock->setQuantite($lProduit->getQuantite());
569				$lStock->setType(2);
570				$lStock->setIdCompte($pAchat->getId()->getIdCompte());
571				$lStock->setIdDetailCommande($lProduit->getIdDetailCommande());
572				$lStock->setIdOperation($lIdOperationSolidaire);
573				$lStockService->set($lStock);
574				
575				// Suppression de la qté produit dans le stock solidaire
576				$lStockSolidaireActuel = $lStockService->selectSolidaireByIdNomProduitUnite($lProduit->getIdNomProduit(),$lProduit->getUnite());
577				$lStockSolidaireActuel = $lStockSolidaireActuel[0];		
578		
579				$lStockSolidaire = new StockSolidaireVO();
580				if(!is_null($lStockSolidaireActuel->getId())) {
581					$lStockSolidaire->setId($lStockSolidaireActuel->getId());
582					$lStockSolidaire->setQuantite($lStockSolidaireActuel->getQuantite() + $lProduit->getQuantite());
583					$lStockSolidaire->setIdNomProduit($lProduit->getIdNomProduit());
584					$lStockSolidaire->setUnite($lProduit->getUnite());
585					$lStockService->setSolidaire($lStockSolidaire);
586				}					
587					
588				// Ajout du détail de l'operation
589				$lDetailOperation = new DetailOperationVO();
590				$lDetailOperation->setIdOperation($lIdOperationSolidaire);
591				$lDetailOperation->setIdCompte($pAchat->getId()->getIdCompte());
592				$lDetailOperation->setMontant($lProduit->getMontant());
593				$lDetailOperation->setLibelle("Marché Solidaire N°" . $pAchat->getId()->getIdCommande());
594				$lDetailOperation->setTypePaiement(8);
595				$lDetailOperation->setIdDetailCommande($lProduit->getIdDetailCommande());
596				$lDetailOperationService->set($lDetailOperation);
597			}
598			
599			// Operation sur le compte Zeybu
600			$lOperationZeybu = new OperationVO();
601			$lOperationZeybu->setIdCompte(-1);
602			$lOperationZeybu->setMontant($lTotalSolidaire * -1);
603			$lOperationZeybu->setLibelle("Marché Solidaire N°" . $pAchat->getId()->getIdCommande());
604			$lOperationZeybu->setTypePaiement(8);
605			$lOperationZeybu->setTypePaiementChampComplementaire($lIdOperationSolidaire);
606			$lOperationZeybu->setIdCommande($pAchat->getId()->getIdCommande());
607			$lIdOperationZeybu = $lOperationService->set($lOperationZeybu);
608			
609			
610			$lOperationSolidaire->setTypePaiementChampComplementaire($lIdOperationZeybu);
611			$lOperationService->set($lOperationSolidaire);
612			
613			return $lIdOperationSolidaire;
614		}
615		return null;
616	}
617		
618	/**
619	* @name delete($pId)
620	* @param IdAchatVO
621	* @desc Supprime un achat
622	*/
623	public function delete($pId) {
624		$lAchatValid = new AchatValid();
625		if(!is_null($pId) && $lAchatValid->select($pId)) {
626			$lAchatActuel = $this->get($pId);
627			
628			// Suppression de l'opération
629			$lOperationService = new OperationService();
630			$lIdOperationZeybu = $lOperationService->get($pId->getIdAchat())->getTypePaiementChampComplementaire();
631			$lOperationService->delete($pId->getIdAchat());
632			$lOperationService->delete($lIdOperationZeybu);
633			
634			$lStockService = new StockService();
635			$lDetailOperationService = new DetailOperationService();
636			foreach($lAchatActuel->getDetailAchat() as $lDetail) {
637				// Suppression du stock et du detail operation
638				$lStockService->delete($lDetail->getId()->getIdStock());
639				$lDetailOperationService->delete($lDetail->getId()->getIdDetailOperation());
640			}
641			foreach($lAchatActuel->getDetailAchatSolidaire() as $lDetail) {
642				// Suppression du stock et du detail operation
643				$lStockService->delete($lDetail->getId()->getIdStock());
644				$lDetailOperationService->delete($lDetail->getId()->getIdDetailOperation());
645				
646				$lStock = $lStockService->get($lDetail->getId()->getIdStock());
647				$lDetailMarche = DetailMarcheViewManager::selectByLot($lStock->getIdDetailCommande());
648				$lDetailMarche = $lDetailMarche[0];
649
650				// Maj de la qté produit dans le stock solidaire
651				$lStockSolidaireActuel = $lStockService->selectSolidaireByIdNomProduitUnite($lDetailMarche->getProIdNomProduit(),$lDetailMarche->getProUniteMesure());
652				$lStockSolidaireActuel = $lStockSolidaireActuel[0];		
653		
654				$lStockSolidaire = new StockSolidaireVO();
655				if(!is_null($lStockSolidaireActuel->getId())) {
656					$lStockSolidaire->setId($lStockSolidaireActuel->getId());
657					$lStockSolidaire->setQuantite($lStockSolidaireActuel->getQuantite() - $lDetail->getQuantite());
658					$lStockSolidaire->setIdNomProduit($lDetailMarche->getProIdNomProduit());
659					$lStockSolidaire->setUnite($lDetailMarche->getProUniteMesure());
660					$lStockService->setSolidaire($lStockSolidaire);
661				}
662			}
663		}
664		return false;
665	}
666			
667	/**
668	* @name get($pId)
669	* @param integer
670	* @return AchatVO
671	* @desc Retourne une liste d'achat
672	*/
673	public function get($pId = null) {
674		$lAchatValid = new AchatValid();
675		if(!is_null($pId) && $lAchatValid->select($pId)) {
676			return $this->select($pId);
677		}
678		return false;
679	}
680	
681	/**
682	* @name getAll($pId)
683	* @param integer
684	* @return array(AchatVO)
685	* @desc Retourne une liste d'achat
686	*/
687	public function getAll($pId = null) {
688		$lAchatValid = new AchatValid();
689		if(!is_null($pId) && $lAchatValid->selectAll($pId)) {
690			return $this->selectAll($pId);
691		}
692		return false;
693	}
694	
695	/**
696	* @name selectOperationAchat($pId)
697	* @param IdReservation
698	* @return array(OperationVO)
699	* @desc Retourne une liste d'operation
700	*/
701	private function selectOperationAchat($pId) {
702		// ORDER BY date -> récupčre la derničre operation en lien avec la commande
703		return OperationManager::recherche(
704			array(OperationManager::CHAMP_OPERATION_TYPE_PAIEMENT,OperationManager::CHAMP_OPERATION_ID_COMPTE,OperationManager::CHAMP_OPERATION_ID_COMMANDE),
705			array('in','=','='),
706			array(array(7,8), $pId->getIdCompte(),$pId->getIdCommande()),
707			array(OperationManager::CHAMP_OPERATION_TYPE_PAIEMENT,OperationManager::CHAMP_OPERATION_DATE),
708			array('ASC','DESC'));
709	}
710
711	/**
712	* @name selectAll($pId)
713	* @param IdReservation
714	* @return array(AchatVO)
715	* @desc Retourne les achats du compte pour un marché
716	*/
717	private function selectAll($pId) {		
718		$lOperations = $this->selectOperationAchat($pId);
719		$lAchats = array();
720		if(!is_null($lOperations[0]->getId())) {
721			foreach($lOperations as $lOperation) {
722				$pId->setIdAchat($lOperation->getId());
723				array_push($lAchats,$this->select($pId));
724			}
725		}
726		return $lAchats;
727	}
728	
729	/**
730	* @name select($pId)
731	* @param IdAchatVO
732	* @return AchatVO
733	* @desc Retourne une Reservation
734	*/
735	private function select($pId) {			
736		$lOperation = OperationManager::select($pId->getIdAchat());
737
738		$lAchat = new AchatVO();
739		$lAchat->getId()->setIdCompte($pId->getIdCompte());
740		$lAchat->getId()->setIdCommande($pId->getIdCommande());
741		$lAchat->getId()->setIdAchat($pId->getIdAchat());
742		
743		// Recherche du détail de la reservation
744		switch($lOperation->getTypePaiement()) {
745			case 7: // Un achat				
746				$lDetailsAchat = AchatDetailViewManager::select($lOperation->getId());
747				foreach($lDetailsAchat as $lDetail) {					
748					if(!is_null($lDetail->getStoId())) {
749						$lDetailAchat = new DetailReservationVO();
750						$lDetailAchat->getId()->setIdStock($lDetail->getStoId());
751						$lDetailAchat->getId()->setIdDetailOperation($lDetail->getDopeId());
752						$lDetailAchat->setIdDetailCommande($lDetail->getStoIdDetailCommande());
753						$lDetailAchat->setMontant($lDetail->getDopeMontant());
754						$lDetailAchat->setQuantite($lDetail->getStoQuantite());
755						$lDetailAchat->setIdProduit($lDetail->getDcomIdProduit());
756						
757						$lAchat->addDetailAchat($lDetailAchat);
758					}
759				}		
760				$lAchat->setTotal($lOperation->getMontant());
761				break;
762				
763			case 8: // Achat Solidaire
764				$lDetailsAchat = AchatDetailSolidaireViewManager::select($lOperation->getId());
765				foreach($lDetailsAchat as $lDetail) {					
766					if(!is_null($lDetail->getStoId())) {
767						$lDetailAchat = new DetailReservationVO();
768						$lDetailAchat->getId()->setIdStock($lDetail->getStoId());
769						$lDetailAchat->getId()->setIdDetailOperation($lDetail->getDopeId());
770						$lDetailAchat->setIdDetailCommande($lDetail->getStoIdDetailCommande());
771						$lDetailAchat->setMontant($lDetail->getDopeMontant());
772						$lDetailAchat->setQuantite($lDetail->getStoQuantite());
773						$lDetailAchat->setIdProduit($lDetail->getDcomIdProduit());
774						
775						$lAchat->addDetailAchatSolidaire($lDetailAchat);
776					}
777				}		
778				$lAchat->setTotalSolidaire($lOperation->getMontant());
779				break;
780		}
781		return $lAchat;
782	}
783	
784	
785	/**
786	* @name selectMarcheAll($pIdMarche)
787	* @param IdMarche
788	* @return 
789	* @desc Retourne une Reservation
790	*/
791	/*public function selectMarcheAll($pIdMarche) {	
792		// Initialisation du Logger
793		$lLogger = &Log::singleton('file', CHEMIN_FICHIER_LOGS);
794		$lLogger->setMask(Log::MAX(LOG_LEVEL));
795		$lRequete =
796			"SELECT 
797			   ADHERENT."    . AdherentManager::CHAMP_ADHERENT_ID . 
798			", ADHERENT." . AdherentManager::CHAMP_ADHERENT_NUMERO . 
799			", ADHERENT." . AdherentManager::CHAMP_ADHERENT_ID_COMPTE . 
800			", ADHERENT." . CompteManager::CHAMP_COMPTE_LABEL . 
801			", ADHERENT." . AdherentManager::CHAMP_ADHERENT_NOM . 
802			", ADHERENT." . AdherentManager::CHAMP_ADHERENT_PRENOM . 
803			", OPERATION." . OperationManager::CHAMP_OPERATION_MONTANT . "_reservation" .
804			", OPERATION." . OperationManager::CHAMP_OPERATION_MONTANT . "_achat
805			FROM " . AdherentViewManager::VUE_ADHERENT . " AS ADHERENT
806			LEFT JOIN ( 
807				SELECT "
808					 	. AdherentManager::CHAMP_ADHERENT_ID . 
809					", RESERVATION." . OperationManager::CHAMP_OPERATION_MONTANT . " AS " . OperationManager::CHAMP_OPERATION_MONTANT . "_reservation" . 
810					", ACHAT." . OperationManager::CHAMP_OPERATION_MONTANT . " AS " . OperationManager::CHAMP_OPERATION_MONTANT . "_achat
811				FROM " . AdherentViewManager::VUE_ADHERENT . "
812				LEFT JOIN (
813					SELECT " 
814				 		. OperationManager::CHAMP_OPERATION_ID_COMMANDE .
815					"," . OperationManager::CHAMP_OPERATION_MONTANT .
816					"," . OperationManager::CHAMP_OPERATION_ID_COMPTE . "
817					FROM " . OperationManager::TABLE_OPERATION . "
818					WHERE " . OperationManager::CHAMP_OPERATION_TYPE_PAIEMENT . "  = 0) AS RESERVATION 
819					ON RESERVATION." . OperationManager::CHAMP_OPERATION_ID_COMPTE . " = " . AdherentViewManager::VUE_ADHERENT . "." . AdherentManager::CHAMP_ADHERENT_ID_COMPTE . "
820				
821				LEFT JOIN (
822					SELECT " 
823				 		. OperationManager::CHAMP_OPERATION_ID_COMMANDE .
824					", sum(" . OperationManager::CHAMP_OPERATION_MONTANT . ") AS " . OperationManager::CHAMP_OPERATION_MONTANT .
825					"," . OperationManager::CHAMP_OPERATION_ID_COMPTE . "
826					FROM " . OperationManager::TABLE_OPERATION . "
827					WHERE " . OperationManager::CHAMP_OPERATION_TYPE_PAIEMENT . " in (7,8)
828					GROUP BY " .  OperationManager::CHAMP_OPERATION_ID_COMMANDE . "," . OperationManager::CHAMP_OPERATION_ID_COMPTE . ") AS ACHAT 
829					ON ACHAT." . OperationManager::CHAMP_OPERATION_ID_COMPTE . " = " . AdherentViewManager::VUE_ADHERENT . "." . AdherentManager::CHAMP_ADHERENT_ID_COMPTE . "
830				WHERE RESERVATION." . OperationManager::CHAMP_OPERATION_ID_COMMANDE . " = " . StringUtils::securiser($pIdMarche) . "
831				OR ACHAT." . OperationManager::CHAMP_OPERATION_ID_COMMANDE . " = " . StringUtils::securiser($pIdMarche) . "
832				GROUP BY " . AdherentViewManager::VUE_ADHERENT . "." . AdherentManager::CHAMP_ADHERENT_ID . ") AS OPERATION
833			ON ADHERENT." . AdherentManager::CHAMP_ADHERENT_ID . " = OPERATION." . AdherentManager::CHAMP_ADHERENT_ID;
834
835		$lLogger->log("Execution de la requete : " . $lRequete,PEAR_LOG_DEBUG); // Maj des logs
836		$lSql = Dbutils::executerRequete($lRequete);
837
838		$lListeAchatEtReservation = array();
839		if( mysql_num_rows($lSql) > 0 ) {
840			while ($lLigne = mysql_fetch_assoc($lSql)) {
841				array_push($lListeAchatEtReservation,
842					$this->remplirAchatEtReservation(
843					$lLigne[AdherentManager::CHAMP_ADHERENT_ID],
844					$lLigne[AdherentManager::CHAMP_ADHERENT_NUMERO],
845					$lLigne[AdherentManager::CHAMP_ADHERENT_ID_COMPTE],
846					$lLigne[CompteManager::CHAMP_COMPTE_LABEL],
847					$lLigne[AdherentManager::CHAMP_ADHERENT_NOM],
848					$lLigne[AdherentManager::CHAMP_ADHERENT_PRENOM],
849					$lLigne[OperationManager::CHAMP_OPERATION_MONTANT . "_reservation"],
850					$lLigne[OperationManager::CHAMP_OPERATION_MONTANT . "_achat"]));
851			}
852		} else {
853			$lListeAchatEtReservation[0] = new ListeAchatReservationVO();
854		}
855		return $lListeAchatEtReservation;
856	}	
857	*/
858	/**
859	* @name remplirAchatEtReservation($pAdhId, $pAdhNumero, $pAdhIdCompte, $pCptLabel, $pAdhNom, $pAdhPrenom, $pOpeMontantReservation, $pOpeMontantAchat)
860	* @param int(11)
861	* @param int(11)
862	* @param int(11)
863	* @param varchar(30)
864	* @param varchar(50)
865	* @param varchar(50)
866	* @param decimal(10,2)
867	* @param decimal(10,2)
868	* @return ListeAchatReservationVO
869	* @desc Retourne une ListeAchatReservationVO remplie
870	*/
871	/*private function remplirAchatEtReservation($pAdhId, $pAdhNumero, $pAdhIdCompte, $pCptLabel, $pAdhNom, $pAdhPrenom, $pOpeMontantReservation, $pOpeMontantAchat) {
872		$lListeAchatReservation = new ListeAchatReservationVO();
873		$lListeAchatReservation->setAdhId($pAdhId);
874		$lListeAchatReservation->setAdhNumero($pAdhNumero);
875		$lListeAchatReservation->setAdhIdCompte($pAdhIdCompte);
876		$lListeAchatReservation->setCptLabel($pCptLabel);
877		$lListeAchatReservation->setAdhNom($pAdhNom);
878		$lListeAchatReservation->setAdhPrenom($pAdhPrenom);
879		$lListeAchatReservation->setOpeMontantReservation($pOpeMontantReservation);
880		$lListeAchatReservation->setOpeMontantAchat($pOpeMontantAchat);
881		return $lListeAchatReservation;
882	}*/
883}
884?>