Ejemplo n.º 1
0
    def get_context_data(self, form=None, **kwargs):
        '''
        Add more context to template
        '''
        context = super().get_context_data()
        if self.request.GET.get('next'):
            context['next'] = self.request.GET.get('next')

        if form:
            context['form'] = form
        else:
            context['form'] = forms.OrderForm()

        if 'error_message' in kwargs:
            context['error_message'] = kwargs['error_message']

        if 'items_count' in kwargs:
            context['items_count'] = kwargs['items_count']
            context['items_data'] = json.dumps(kwargs['items_data'])

        context['items'] = json.dumps([{
            'id':
            item.id,
            'code':
            item.code,
            'desciption':
            item.desciption,
            'total_quantity':
            item.quantity,
            'available_quantity':
            item.get_quantity(item.location)
        } for item in stock_models.Item.objects.filter(is_active=True,
                                                       ).order_by('code')])

        return context
Ejemplo n.º 2
0
    def test_order_form_invalid_data(self):
        '''
        Test invalid form for order form
        '''
        form = forms.OrderForm(data={
            'company': '',
        })

        self.assertFalse(form.is_valid())
Ejemplo n.º 3
0
    def test_order_form_valid_data(self):
        '''
        Test valid form for order form
        '''
        form = forms.OrderForm(data={
            'company': self.company.id,
        })

        self.assertTrue(form.is_valid())
Ejemplo n.º 4
0
    def test_order_form_fields(self):
        '''
        Test order form fields
        '''
        expected = [
            'company',
            'invoice',
            'invoice_date',
            'note',
        ]

        actual = list(forms.OrderForm().fields)
        self.assertSequenceEqual(expected, actual)
Ejemplo n.º 5
0
    def get_context_data(self, form=None, **kwargs):
        '''
        Add more context to template
        '''
        if not self.object:
            self.object = self.get_object()
        context = super().get_context_data()

        context['saleorder'] = self.object

        if self.request.GET.get('next'):
            context['next'] = self.request.GET.get('next')

        if form:
            context['form'] = form
        else:
            context['form'] = forms.OrderForm(instance=self.object)
            i = 0
            items_data = list()
            for item in self.object.get_items():
                i += 1
                items_data.append({
                    'name': f"{i}item",
                    'value': item.item.item.id,
                    'quantity': item.item.quantity,
                    'note': item.note
                })
            context['items_data'] = json.dumps(items_data)
            context['items_count'] = self.object.get_items().count()

        if 'error_message' in kwargs:
            context['error_message'] = kwargs['error_message']

        if 'items_count' in kwargs:
            context['items_count'] = kwargs['items_count']
            context['items_data'] = json.dumps(kwargs['items_data'])

        context['items'] = json.dumps([
            item for item in stock_models.Item.objects.filter(
                is_active=True, ).order_by('code').values(
                    'id',
                    'code',
                    'desciption',
                )
        ])
        return context
Ejemplo n.º 6
0
    def post(self, request, *args, **kwargs):
        """
        Handle POST requests: instantiate a form instance with the passed
        POST variables and then check if it's valid.
        """
        form = forms.OrderForm(request.POST)

        items_data = [{
            'name': f"{i}item",
            'value': int(request.POST[f"{i}item"]),
            'quantity': int(request.POST[f"{i}quantity"]),
            'note': request.POST[f"{i}note"]
        } for i in range(1,
                         int(request.POST['items_count']) + 1)]
        items_values = [
            int(request.POST[f"{i}item"])
            for i in range(1,
                           int(request.POST['items_count']) + 1)
        ]
        for i in range(1, int(request.POST['items_count']) + 1):
            if len(list(dict.fromkeys(items_values))) != len(items_values):
                error_message = _("Can't choose the same item twice.")
                return self.render_to_response(
                    self.get_context_data(form=form,
                                          error_message=error_message,
                                          items_count=int(
                                              request.POST['items_count']),
                                          items_data=items_data))
            item = stock_models.Item.objects.get(id=request.POST[f"{i}item"])
            if item.is_assembly:
                for sub_item in item.get_assembly_items():
                    item_form = stock_forms.ItemMoveForm(
                        data={
                            'item':
                            sub_item.sub_item.id,
                            'type':
                            'R',
                            'location':
                            sub_item.sub_item.location.id,
                            'quantity':
                            int(request.POST[f"{i}quantity"]) *
                            sub_item.quantity,
                        })
                    if not item_form.is_valid():
                        error_message = item_form.errors
                        return self.render_to_response(
                            self.get_context_data(
                                form=form,
                                error_message=error_message,
                                items_count=int(request.POST['items_count']),
                                items_data=items_data))
            else:
                item_form = stock_forms.ItemMoveForm(
                    data={
                        'item': item.id,
                        'type': 'R',
                        'location': item.location.id,
                        'quantity': int(request.POST[f"{i}quantity"]),
                        'note': request.POST[f"{i}note"]
                    })
                if not item_form.is_valid():
                    error_message = item_form.errors
                    return self.render_to_response(
                        self.get_context_data(form=form,
                                              error_message=error_message,
                                              items_count=int(
                                                  request.POST['items_count']),
                                              items_data=items_data))

        if form.is_valid():
            self.object = form.save()
            self.object.created_by = self.request.user
            self.object.save()

            for i in range(1, int(request.POST['items_count']) + 1):
                item = stock_models.Item.objects.get(
                    id=request.POST[f"{i}item"])
                item_move = stock_models.ItemMove.objects.create(
                    item=item,
                    location=item.location,
                    type=stock_models.ItemMove.REMOVE,
                    related_to=stock_models.ItemMove.SELL,
                    quantity=request.POST[f"{i}quantity"])

                sales_models.SaleItems.objects.create(
                    order=self.object,
                    item=item_move,
                    price=item.price,
                    note=request.POST[f"{i}note"],
                )
            # Store user activity
            activity = Activity.objects.create_activity(
                activity_object=self.object,
                activity=Activity.CREATE,
                user=self.request.user,
                message="Sale Order-{0}/{1}".format(self.object.company.name,
                                                    self.object.id))
            activity.save()

            return HttpResponseRedirect(self.get_success_url())
        else:
            return self.render_to_response(
                self.get_context_data(form=form,
                                      items_count=int(
                                          request.POST['items_count']),
                                      items_data=items_data))