示例#1
0
文件: invoice.py 项目: yvess/desk
 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']
示例#2
0
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
示例#3
0
文件: invoice.py 项目: yvess/desk
 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