Exemple #1
0
class BusinessInvoicesListView(CompanyInvoicesListView, TreeMixin):
    """
    Invoice list for one given company
    """
    route_name = BUSINESS_ITEM_INVOICE_ROUTE
    schema = get_list_schema(is_global=False,
                             excludes=(
                                 "company_id",
                                 'year',
                                 'customer',
                             ))
    add_template_vars = CompanyInvoicesListView.add_template_vars + (
        'add_url', )
    is_admin = False

    @property
    def add_url(self):
        return self.request.route_path(BUSINESS_ITEM_INVOICE_ROUTE,
                                       id=self.context.id,
                                       _query={'action': 'add'})

    def _get_company_id(self, appstruct):
        return self.request.context.project.company_id

    @property
    def title(self):
        return u"Factures de l'affaire {0}".format(self.request.context.name)

    def filter_business(self, query, appstruct):
        remember_navigation_history(self.request, self.context.id)
        self.populate_navigation()
        query = query.filter(Task.business_id == self.context.id)
        return query
Exemple #2
0
class CompanyInvoicesListView(GlobalInvoicesListView):
    """
    Invoice list for one given company
    """
    is_admin = False
    schema = get_list_schema(is_global=False, excludes=("company_id",))
    add_template_vars = (u'title', u"is_admin", u"legends")
    legends = GlobalInvoicesListView.legends + (
        ('status-draft', u"Factures en brouillon"),
        ("status-wait", u"Factures en attente de validation"),
        ("status-invalid", u"Factures invalides"),
    )

    @property
    def with_draft(self):
        return True

    def _get_company_id(self, appstruct):
        return self.request.context.id

    @property
    def title(self):
        return u"Factures de l'entreprise {0}".format(self.request.context.name)

    filter_status = filter_all_status
Exemple #3
0
class CompanyInvoicesOdsView(GlobalInvoicesOdsView):
    schema = get_list_schema(is_global=False, excludes=('company_id',))

    def _get_company_id(self, appstruct):
        return self.request.context.id

    filter_status = filter_all_status
Exemple #4
0
class CompanyInvoicesListView(GlobalInvoicesListView):
    """
    Invoice list for one given company
    """
    is_admin = False
    schema = get_list_schema(is_global=False, excludes=("company_id", ))
    add_template_vars = (
        u'title',
        'is_admin',
        "with_draft",
    )

    @property
    def with_draft(self):
        return True

    def _get_company_id(self, appstruct):
        return self.request.context.id

    @property
    def title(self):
        return u"Factures de l'entreprise {0}".format(
            self.request.context.name)

    filter_status = filter_all_status
Exemple #5
0
class CompanyInvoicesListView(GlobalInvoicesListView):
    """
    Invoice list for one given company
    """
    schema = get_list_schema(is_admin=False)
    is_admin = False

    def _get_company_id(self, appstruct):
        return self.request.context.id

    @property
    def title(self):
        return u"Factures de l'entreprise {0}".format(
            self.request.context.name)
Exemple #6
0
class BusinessInvoicesXlsView(CompanyInvoicesXlsView):
    schema = get_list_schema(is_global=False,
                             excludes=(
                                 'company_id',
                                 'year',
                             ))

    def _get_company_id(self, appstruct):
        return self.request.context.project.company_id

    def filter_business(self, query, appstruct):
        logger.debug(u" + Filtering by business_id")
        return query.filter(Task.business_id == self.context.id)

    filter_status = filter_all_status
Exemple #7
0
class ProjectInvoiceListView(CompanyInvoicesListView, TreeMixin):
    """
    Invoice list for one given company
    """
    route_name = PROJECT_ITEM_INVOICE_ROUTE
    schema = get_list_schema(is_global=False,
                             excludes=(
                                 "company_id",
                                 'year',
                                 'customers',
                             ))
    add_template_vars = (
        u'title',
        'is_admin',
        "with_draft",
        'add_url',
    )
    is_admin = False

    @property
    def add_url(self):
        return self.request.route_path(PROJECT_ITEM_INVOICE_ROUTE,
                                       id=self.context.id,
                                       _query={'action': 'add'})

    def _get_company_id(self, appstruct):
        return self.request.context.company_id

    @property
    def title(self):
        return u"Factures du projet {0}".format(self.request.context.name)

    def filter_project(self, query, appstruct):
        remember_navigation_history(self.request, self.context.id)
        self.populate_navigation()
        query = query.filter(Task.project_id == self.context.id)
        return query
Exemple #8
0
class InvoiceListTools(object):
    title = u"Factures de la CAE"
    schema = get_list_schema(is_global=True, excludes=('status',))
    sort_columns = dict(
        date=Task.date,
        internal_number=Task.internal_number,
        customer=Customer.name,
        company=Company.name,
        official_number=Task.official_number,
        ht=Task.ht,
        ttc=Task.ttc,
        tva=Task.tva,
        payment=Payment.date,
    )

    default_sort = "official_number"
    default_direction = 'desc'

    def query(self):
        query = DBSESSION().query(Task)
        query = query.with_polymorphic([Invoice, CancelInvoice])
        query = query.distinct()
        query = query.outerjoin(Invoice.payments)
        query = query.outerjoin(Task.customer)
        query = query.outerjoin(Task.company)
        query = query.options(
            contains_eager(Invoice.payments).load_only(
                Payment.id, Payment.date, Payment.mode
            )
        )
        query = query.options(
            contains_eager(Task.customer).load_only(
                Customer.name, Customer.code, Customer.id,
                Customer.firstname, Customer.lastname, Customer.civilite,
                Customer.type_,
            )
        )
        query = query.options(
            contains_eager(Task.company).load_only(
                Company.name,
                Company.id,
            )
        )
        query = query.options(
            load_only(
                "_acl",
                "name",
                "date",
                "id",
                "ht",
                "tva",
                "ttc",
                "company_id",
                "customer_id",
                "official_number",
                "internal_number",
                "status",
                Invoice.paid_status,
            )
        )
        return query

    def _get_company_id(self, appstruct):
        """
        Return the company_id found in the appstruct
        Should be overriden if we want a company specific list view
        """
        res = appstruct.get('company_id')
        logger.debug("Company id : %s" % res)
        return res

    def filter_company(self, query, appstruct):
        company_id = self._get_company_id(appstruct)
        if company_id not in (None, colander.null):
            query = query.filter(Task.company_id == company_id)
        return query

    def filter_official_number(self, query, appstruct):
        number = appstruct['search']
        if number and number != -1:
            logger.debug(u"    Filtering by official_number : %s" % number)
            prefix = self.request.config.get('invoiceprefix', '')
            if prefix and number.startswith(prefix):
                number = number[len(prefix):]
            query = query.filter(Task.official_number == number)
        return query

    def filter_ttc(self, query, appstruct):
        ttc = appstruct.get('ttc', {})
        if ttc.get('start') not in (None, colander.null):
            log.info(u"Filtering by ttc amount : %s" % ttc)
            start = ttc.get('start')
            end = ttc.get('end')
            if end in (None, colander.null):
                query = query.filter(Task.ttc >= start)
            else:
                query = query.filter(Task.ttc.between(start, end))
        return query

    def filter_customer(self, query, appstruct):
        customer_id = appstruct.get('customer_id')
        if customer_id not in (None, colander.null):
            logger.debug(u"Customer id : %s" % customer_id)
            query = query.filter(Task.customer_id == customer_id)
        return query

    def filter_date(self, query, appstruct):
        logger.debug(u" + Filtering date")
        period = appstruct.get('period', {})
        if period.get('start') not in (None, colander.null):
            start = period.get('start')
            end = period.get('end')
            if end in (None, colander.null):
                end = datetime.date.today()
            query = query.filter(Task.date.between(start, end))

            logger.debug(u"    Between %s and %s" % (start, end))

        year = appstruct.get('year', -1)
        if year != -1:
            query = query.filter(
                or_(
                    Invoice.financial_year == year,
                    CancelInvoice.financial_year == year,
                )
            )
            logger.debug(u"    Year : %s" % year)
        return query

    def filter_status(self, query, appstruct):
        """
        Filter the status a first time (to be overriden)
        """
        logger.debug("Filtering status")
        query = query.filter(Task.status == 'valid')
        return query

    def filter_paid_status(self, query, appstruct):
        status = appstruct['paid_status']
        if status == 'paid':
            query = self._filter_paid(query)
        elif status == 'notpaid':
            query = self._filter_not_paid(query)
        return query

    def _filter_paid(self, query):
        return query.filter(
            or_(
                Invoice.paid_status == 'resulted',
                Task.type_ == 'cancelinvoice',
            )
        )

    def _filter_not_paid(self, query):
        return query.filter(
            Invoice.paid_status.in_(('waiting', 'paid'))
        )

    def filter_doctype(self, query, appstruct):
        """
        Filter invocies by type (invoice/cancelinvoice)
        """
        type_ = appstruct.get('doctype')
        if type_ in ('invoice', 'cancelinvoice'):
            query = query.filter(Task.type_ == type_)
        else:
            query = query.filter(Task.type_.in_(('invoice', 'cancelinvoice')))
        return query
Exemple #9
0
class CompanyInvoicesOdsView(GlobalInvoicesOdsView):
    schema = get_list_schema(is_admin=False)

    def _get_company_id(self, appstruct):
        return self.request.context.id