def setup_invoice(self): self.doc = { 'start_date': self.invoice_cycle.doc['start_date'], 'end_date': self.invoice_cycle.doc['end_date'], 'date': date.today(), 'nr': self.invoice_nr, 'ref_nr': "%s%s" % ( self.invoice_nr, calc_esr_checksum(self.invoice_nr) ), 'amount': 0.0, 'tax': 0.0, 'total': 0.0 } if 'last_invoice_end_date' in self.client_doc: self.doc['last_invoice_end_date'] = parse_date( self.client_doc['last_invoice_end_date'], force_day='end') self.doc['services'] = self.get_services() self.doc['services_list'] = sorted([k for k in self.doc['services'].iterkeys()]) try: self.doc['address'] = self.crm.get_address(self.extcrm_id) except KeyError: self.client_doc = None return self.doc['client_name'] = self.client_doc['name'] self.doc['tax'] = round(self.doc['amount'] * self.tax, 1) self.doc['total'] = self.doc['amount'] + self.doc['tax']
def get_default(attribute, part, defaults, special_attribute=None, date_force_day=None): if special_attribute in part: value = part[special_attribute] elif attribute not in part: value = defaults[attribute] else: value = part[attribute] if attribute == 'price': value = float(value) if '_date' in attribute and not hasattr(value, 'year'): value = parse_date(value, force_day=date_force_day) return value
def get_services(self): services = {} cycle_start_date = self.invoice_cycle.doc['start_date'] for result in self.db.view( self._cmd("service_by_client"), key=self.client_id, include_docs=True): service_doc = MergedDoc(self.db, result['doc']).doc service_def = Invoice.service_definitons[service_doc['service_type']] package = service_def['packages'][service_doc['package_type']] service_doc['price'] = get_default('price', service_doc, package) service_doc['package_title'] = get_default( 'title', service_doc, package, special_attribute='package_title' ) service_doc['title'] = get_default('title', service_doc, service_def) if 'start_date' in service_doc: service_start_date = parse_date(service_doc['start_date'], force_day='start') else: service_start_date = cycle_start_date if 'last_invoice_end_date' in self.doc: if service_start_date < self.doc['last_invoice_end_date']: service_start_date = cycle_start_date service_doc['start_date'] = service_start_date service_doc['addons'] = self.add_addons(service_doc, service_def['addons']) service_doc['included'] = self.add_included(service_doc, package) service_end_date = get_default( 'end_date', service_doc, self.doc) if service_end_date > self.doc['end_date']: service_end_date = self.doc['end_date'] service_doc['end_date'] = service_end_date doc_amount = self.add_amount( service_doc['price'], service_doc['start_date'], service_end_date) service_doc.update(doc_amount) if service_doc['total'] == 0.0 \ and not service_doc['addons'] \ and not service_doc['included']: pass else: services[service_doc['service_type']] = service_doc if hasattr(self.settings, 'invoice_service_order'): servicesOrdered = OrderedDict() service_order = [s.strip() for s in self.settings.invoice_service_order.split(',')] for name in service_order: if name in services: servicesOrdered[name] = services[name] del services[name] if services: for k, v in services.iteritems(): servicesOrdered[k] = v return servicesOrdered return services