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
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
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
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
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)
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
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
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
class CompanyInvoicesOdsView(GlobalInvoicesOdsView): schema = get_list_schema(is_admin=False) def _get_company_id(self, appstruct): return self.request.context.id