Completed
Push — Order ( ecc6b7...1eb192 )
by Laurent
12:59
created

OrdersController::setDates()   B

Complexity

Conditions 5
Paths 4

Size

Total Lines 20
Code Lines 15

Duplication

Lines 0
Ratio 0 %

Importance

Changes 2
Bugs 0 Features 0
Metric Value
c 2
b 0
f 0
dl 0
loc 20
rs 8.8571
cc 5
eloc 15
nc 4
nop 2
1
<?php
2
/**
3
 * OrdersController controller des commandes.
4
 *
5
 * PHP Version 5
6
 *
7
 * @author    Quétier Laurent <[email protected]>
8
 * @copyright 2014 Dev-Int GLSR
9
 * @license   http://opensource.org/licenses/gpl-license.php GNU Public License
10
 *
11
 * @version since 1.0.0
12
 *
13
 * @link      https://github.com/Dev-Int/glsr
14
 */
15
namespace AppBundle\Controller;
16
17
use Symfony\Component\HttpFoundation\Request;
18
use AppBundle\Controller\AbstractOrdersController;
19
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
20
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
21
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
22
23
use AppBundle\Entity\Orders;
24
use AppBundle\Entity\Supplier;
25
use AppBundle\Form\Type\OrdersType;
26
use AppBundle\Form\Type\OrdersEditType;
27
use AppBundle\Entity\OrdersArticles;
28
29
/**
30
 * Orders controller.
31
 *
32
 * @Route("/orders")
33
 */
34
class OrdersController extends AbstractOrdersController
35
{
36
    /**
37
     * Lists all Orders entities.
38
     *
39
     * @Route("/", name="orders")
40
     * @Method("GET")
41
     * @Template()
42
     */
43
    public function indexAction(Request $request)
44
    {
45
        $etm = $this->getDoctrine()->getManager();
46
        $item = $this->container->getParameter('knp_paginator.page_range');
47
        $qbd = $etm->getRepository('AppBundle:Orders')->createQueryBuilder('o');
48
        $qbd->where('o.delivdate > ' . date('Y-m-d'));
49
        $qbd->andWhere('o.status = 1');
50
        
51
        $createForm = $this->createCreateForm('orders_create');
52
53
        $paginator = $this->get('knp_paginator')->paginate($qbd, $request->query->get('page', 1), $item);
54
        return array(
55
            'create_form' => $createForm->createView(),
56
            'paginator' => $paginator,
57
        );
58
    }
59
60
    /**
61
     * Finds and displays a Orders entity.
62
     *
63
     * @Route("/{id}/show", name="orders_show", requirements={"id"="\d+"})
64
     * @Method("GET")
65
     * @Template()
66
     */
67
    public function showAction(Orders $orders)
68
    {
69
        $deleteForm = $this->createDeleteForm($orders->getId(), 'orders_delete');
70
71
        return array(
72
            'orders' => $orders,
73
            'delete_form' => $deleteForm->createView(),
74
        );
75
    }
76
77
    /**
78
     * Displays a form to create a new Orders entity.
79
     *
80
     * @Route("/new/{supplier}", name="orders_new")
81
     * @Method("GET")
82
     * @Template()
83
     */
84
    public function newAction(Supplier $supplier)
85
    {
86
        $etm = $this->getDoctrine()->getManager();
87
88
        $orders = new Orders();
89
        $orders->setSupplier($supplier);
90
        $articles = $etm->getRepository('AppBundle:Article')->getArticleFromSupplier($supplier->getId());
91
92
        // Set Orders dates (order and delivery)
93
        $orders = $this->setDates($orders, $supplier);
94
95
        $etm->persist($orders);
96
        // Saving articles of supplier in order
97
        $this->saveOrdersArticles($articles, $orders, $etm);
98
99
        $etm->flush();
100
101
        return $this->redirect($this->generateUrl('orders_edit', array('id' => $orders->getId())));
102
    }
103
104
    /**
105
     * Creates a new Orders entity.
106
     *
107
     * @Route("/admin/create", name="orders_create")
108
     * @Method("POST")
109
     * @Template("AppBundle:Orders:new.html.twig")
110
     */
111
    public function createAction(Request $request)
112
    {
113
        $etm = $this->getDoctrine()->getManager();
114
115
        $orders = new Orders();
116
        $form = $this->createForm(OrdersType::class, $orders);
117
        $return = ['orders' => $orders, 'form' => $form->createView(),];
118
        $form->handleRequest($request);
119
        $supplier = $orders->getSupplier();
120
        $articles = $etm->getRepository('AppBundle:Article')->getArticleFromSupplier($supplier->getId());
121
        // Tester la liste si un fournisseur à déjà une commande en cours
122
        $test = $this->get('app.helper.controller')->hasSupplierArticles($articles);
123
        if ($test === false) {
124
            $return = $this->redirectToRoute('orders');
125
        } else {
126
            // Set Orders dates (order and delivery)
127
            $orders = $this->setDates($orders, $supplier);
128
129
            if ($form->isValid() && $return !== $this->redirectToRoute('orders')) {
130
                $etm->persist($orders);
131
                // Saving articles of supplier in order
132
                $this->saveOrdersArticles($articles, $orders, $etm);
133
134
                $etm->flush();
135
136
                $return = $this->redirect($this->generateUrl('orders_edit', array('id' => $orders->getId())));
137
            }
138
        }
139
        return $return;
140
    }
141
142
    /**
143
     * Displays a form to edit an existing Orders entity.
144
     *
145
     * @Route("/admin/{id}/edit", name="orders_edit", requirements={"id"="\d+"})
146
     * @Method("GET")
147
     * @Template()
148
     */
149
    public function editAction(Orders $orders)
150
    {
151
        $editForm = $this->createForm(OrdersEditType::class, $orders, array(
152
            'action' => $this->generateUrl('orders_update', array('id' => $orders->getId())),
153
            'method' => 'PUT',
154
        ));
155
        $deleteForm = $this->createDeleteForm($orders->getId(), 'orders_delete');
156
157
        return array(
158
            'orders' => $orders,
159
            'edit_form'   => $editForm->createView(),
160
            'delete_form' => $deleteForm->createView(),
161
        );
162
    }
163
164
    /**
165
     * Edits an existing Orders entity.
166
     *
167
     * @Route("/admin/{id}/update", name="orders_update", requirements={"id"="\d+"})
168
     * @Method("PUT")
169
     * @Template("AppBundle:Orders:edit.html.twig")
170
     */
171
    public function updateAction(Orders $orders, Request $request)
172
    {
173
        $editForm = $this->createForm(OrdersEditType::class, $orders, array(
174
            'action' => $this->generateUrl('orders_update', array('id' => $orders->getId())),
175
            'method' => 'PUT',
176
        ));
177
        $deleteForm = $this->createDeleteForm($orders->getId(), 'orders_delete');
178
        $editForm->handleRequest($request);
179
180
        $return = array(
181
            'orders' => $orders,
182
            'edit_form'   => $editForm->createView(),
183
            'delete_form' => $deleteForm->createView(),
184
        );
185
        
186
        if ($editForm->isValid()) {
187
            $this->getDoctrine()->getManager()->flush();
188
            $this->addFlash('info', 'gestock.edit.ok');
189
190
            $return = $this->redirect($this->generateUrl('orders_edit', ['id' => $orders->getId()]));
191
        }
192
193
        return $return;
194
    }
195
196
    /**
197
     * Deletes a Orders entity.
198
     *
199
     * @Route("/admin/{id}/delete", name="orders_delete", requirements={"id"="\d+"})
200
     * @Method("DELETE")
201
     */
202
    public function deleteAction(Orders $orders, Request $request)
203
    {
204
        $return = $this->abstractDeleteWithArticlesAction($orders, $request, 'orders');
205
        
206
        return $return;
207
    }
208
209
    /**
210
     * Set order Dates.
211
     *
212
     * @param \AppBundle\Entity\Orders   $orders   La commande à traiter
213
     * @param \AppBundle\Entity\Supplier $supplier Le fournisseur concerné
214
     * @return \AppBundle\Entity\Orders            La commande modifiée
215
     */
216
    private function setDates(Orders $orders, Supplier $supplier)
217
    {
218
        $orderDate = $supplier->getOrderdate();
219
        foreach ($orderDate as $date) {
220
            if ($date >= date('w')) {
221
                $diffOrder = $date - date('w');
222
                $diffDeliv = $diffOrder + $supplier->getDelaydeliv();
223
                $dateOrder = date('Y-m-d H:i:s', mktime(0, 0, 0, date('n'), date('j')+$diffOrder, date('Y')));
224
                $delivDate = date('Y-m-d H:i:s', mktime(0, 0, 0, date('n'), date('j')+$diffDeliv, date('Y')));
225
                $setOrderDate = \DateTime::createFromFormat('Y-m-d H:i:s', $dateOrder);
226
                $setDelivDate = \DateTime::createFromFormat('Y-m-d H:i:s', $delivDate);
227
                if ($setOrderDate !== false && $setDelivDate !== false) {
228
                    $orders->setOrderDate($setOrderDate);
229
                    $orders->setDelivDate($setDelivDate);
230
                    break;
231
                }
232
            }
233
        }
234
        return $orders;
235
    }
236
237
    /**
238
     * Save OrdersArticles.
239
     *
240
     * @param array                      $articles Liste des articles
241
     * @param \AppBundle\Entity\Orders   $orders   La commande à traiter
242
     * @param \Doctrine\Common\Persistence\ObjectManager $etm Entity Manager
243
     */
244
    private function saveOrdersArticles($articles, $orders, $etm)
245
    {
246 View Code Duplication
        foreach ($articles as $article) {
247
            $ordersArticles = new OrdersArticles();
248
            $ordersArticles->setOrders($orders);
249
            $ordersArticles->setArticle($article);
250
            $ordersArticles->setUnitStorage($article->getUnitStorage());
251
            if ($article->getMinstock() > $article->getQuantity()) {
252
                $ordersArticles->setQuantity($article->getMinstock() - $article->getQuantity());
253
            }
254
            $ordersArticles->setPrice($article->getPrice());
255
            $ordersArticles->setTva($article->getTva());
256
            $etm->persist($ordersArticles);
257
        }
258
    }
259
260
    /**
261
     * Print the current order.<br />Creating a `PDF` file for viewing on paper
262
     *
263
     * @Route("/{id}/print/", name="orders_print", requirements={"id"="\d+"})
264
     * @Method("GET")
265
     * @Template()
266
     *
267
     * @param \AppBundle\Entity\Orders $orders Order item to print
268
     * @return \Symfony\Component\HttpFoundation\Response
269
     */
270
    public function printAction(Orders $orders)
271
    {
272
        $return = $this->abstractPrintAction($orders, 'Orders');
273
        
274
        return $return;
275
    }
276
}
277