class Situation(Report): """ A report consisting of the following tables: - :class:`Debtors` - :class:`Creditors` """ label = _("Situation") help_text = _("Overview of the financial situation on a given date.") required_roles = dd.login_required(AccountingReader) parameters = mixins.Today() report_items = (Debtors, Creditors)
class DebtorsCreditors(dd.VirtualTable): required_roles = dd.login_required(AccountingReader) auto_fit_column_widths = True column_names = "age due_date partner partner_id balance vouchers" display_mode = 'html' abstract = True parameters = mixins.Today() # params_layout = "today" d_or_c = NotImplementedError @classmethod def get_data_rows(self, ar): rows = [] mi = ar.master_instance if mi is None: # called directly from main menu if ar.param_values is None: return rows end_date = ar.param_values.today else: # called from Situation report end_date = mi.today get_due_movements = rt.models.ledger.get_due_movements qs = rt.models.contacts.Partner.objects.order_by('name') for row in qs: row._balance = ZERO row._due_date = None row._expected = tuple( get_due_movements( self.d_or_c, models.Q(partner=row, value_date__lte=end_date))) for dm in row._expected: row._balance += dm.balance if dm.due_date is not None: if row._due_date is None or row._due_date > dm.due_date: row._due_date = dm.due_date # logger.info("20140105 %s %s", row, dm) if row._balance > ZERO: rows.append(row) def k(a): return a._due_date rows.sort(key=k) return rows # @dd.displayfield(_("Partner")) # def partner(self, row, ar): # return ar.obj2html(row) @dd.virtualfield(dd.ForeignKey('contacts.Partner')) def partner(self, row, ar): return row @dd.virtualfield(models.IntegerField(_("ID"))) def partner_id(self, row, ar): return row.pk @dd.virtualfield(dd.PriceField(_("Balance"))) def balance(self, row, ar): return row._balance @dd.virtualfield(models.DateField(_("Due date"))) def due_date(self, row, ar): return row._due_date @dd.virtualfield(models.IntegerField(_("Age"))) def age(self, row, ar): dd = ar.param_values.today - row._due_date return dd.days @dd.displayfield(_("Vouchers")) def vouchers(self, row, ar): matches = [dm.match for dm in row._expected] return E.span(', '.join(matches))