def item_add_class_from_order(self, order_item_row, caID): """ Add class to invoice from Order.deliver() :param clsID: db.classes.id :param class_date: datetime.date :param attendance_type: int 1 or 2 :return: db.invoices_items.id """ from os_class import Class DATE_FORMAT = current.DATE_FORMAT TIME_FORMAT = current.TIME_FORMAT db = current.db T = current.T cls = Class(order_item_row.classes_id, order_item_row.ClassDate) # Get GLAccount info prices = cls.get_prices() glaccount = None if order_item_row.AttendanceType == 1: # Trial glaccount = prices['trial_glaccount'] else: # Drop in glaccount = prices['dropin_glaccount'] # add item to invoice next_sort_nr = self.get_item_next_sort_nr() iiID = db.invoices_items.insert( invoices_id=self.invoices_id, ProductName=order_item_row.ProductName, Description=order_item_row.Description, Quantity=order_item_row.Quantity, Price=order_item_row.Price, Sorting=next_sort_nr, tax_rates_id=order_item_row.tax_rates_id, accounting_glaccounts_id=order_item_row.accounting_glaccounts_id, accounting_costcenters_id=order_item_row.accounting_costcenters_id, ) self.link_item_to_classes_attendance( caID, iiID ) # This calls self.on_update() self.set_amounts() return iiID
def item_add_class(self, cuID, caID, clsID, date, product_type): """ Add invoice item when checking in to a class :param cuID: db.auth_user.id :param caID: db.classes_attendance.id :param clsID: db.classes.id :param date: datetime.date (class date) :param product_type: has to be 'trial' or 'dropin' :return: """ from os_customer import Customer from os_class import Class db = current.db DATE_FORMAT = current.DATE_FORMAT T = current.T date_formatted = date.strftime(DATE_FORMAT) if product_type not in ['trial', 'dropin']: raise ValueError("Product type has to be 'trial' or 'dropin'.") customer = Customer(cuID) cls = Class(clsID, date) prices = cls.get_prices() has_membership = customer.has_membership_on_date(date) if product_type == 'dropin': price = prices['dropin'] tax_rates_id = prices['dropin_tax_rates_id'] glaccount = prices['dropin_glaccount'] costcenter = prices['dropin_costcenter'] if has_membership and prices['dropin_membership']: price = prices['dropin_membership'] tax_rates_id = prices['dropin_tax_rates_id_membership'] description = cls.get_invoice_order_description( 2) # 2 = drop in class elif product_type == 'trial': price = prices['trial'] tax_rates_id = prices['trial_tax_rates_id'] glaccount = prices['trial_glaccount'] costcenter = prices['trial_costcenter'] if has_membership and prices['trial_membership']: price = prices['trial_membership'] tax_rates_id = prices['trial_tax_rates_id_membership'] description = cls.get_invoice_order_description( 1) # 1 = trial class # link invoice to attendance self.link_to_classes_attendance(caID) next_sort_nr = self.get_item_next_sort_nr() iiID = db.invoices_items.insert(invoices_id=self.invoices_id, ProductName=T("Class"), Description=description, Quantity=1, Price=price, Sorting=next_sort_nr, tax_rates_id=tax_rates_id, accounting_glaccounts_id=glaccount, accounting_costcenters_id=costcenter) self.link_to_customer(cuID) # This calls self.on_update() self.set_amounts()
def get_class_revenue_summary(self, clsID, date, quick_stats=True): """ :param subscription_quick_stats: Boolean - use db.school_subscriptions.QuickStatsAmount or not :return: """ from os_class import Class cls = Class(clsID, date) class_prices = cls.get_prices() data = { 'subscriptions': {}, 'classcards': {}, 'dropin': { 'membership': { 'count': 0, 'amount': class_prices['dropin_membership'] }, 'no_membership': { 'count': 0, 'amount': class_prices['dropin'] } }, 'trial': { 'membership': { 'count': 0, 'amount': class_prices['trial_membership'] }, 'no_membership': { 'count': 0, 'amount': class_prices['trial'] } }, 'complementary': { 'count': 0, 'amount': 0 }, 'total': { 'count': 0, 'amount': 0 } } rows = self.get_class_revenue_rows(clsID, date) for i, row in enumerate(rows): repr_row = list(rows[i:i + 1].render())[0] ex_vat = 0 vat = 0 in_vat = 0 description = '' if row.classes_attendance.AttendanceType is None: # Subscription name = row.school_subscriptions.Name amount = row.school_subscriptions.QuickStatsAmount or 0 if data['subscriptions'].get(name, False): data['subscriptions'][name]['count'] += 1 data['subscriptions'][name]['total'] = \ data['subscriptions'][name]['count'] * amount else: data['subscriptions'][name] = { 'count': 1, 'total': amount, 'amount': amount } data['total']['amount'] += amount elif row.classes_attendance.AttendanceType == 1: # Trial if row.classes_attendance.CustomerMembership: data['trial']['membership']['count'] += 1 data['total']['amount'] += data['trial']['membership'][ 'amount'] else: data['trial']['no_membership']['count'] += 1 data['total']['amount'] += data['trial']['no_membership'][ 'amount'] elif row.classes_attendance.AttendanceType == 2: # Dropin if row.classes_attendance.CustomerMembership: data['dropin']['membership']['count'] += 1 data['total']['amount'] += data['dropin']['membership'][ 'amount'] else: data['dropin']['no_membership']['count'] += 1 data['total']['amount'] += data['dropin']['no_membership'][ 'amount'] elif row.classes_attendance.AttendanceType == 3: # Class card name = row.school_classcards.Name if not row.school_classcards.Unlimited: amount = row.school_classcards.Price / row.school_classcards.Classes else: revenue = get_class_revenue_classcard(row) amount = revenue['total_revenue_in_vat'] if data['classcards'].get(name, False): data['classcards'][name]['count'] += 1 data['classcards'][name]['total'] = \ data['classcards'][name]['count'] * amount else: data['classcards'][name] = { 'count': 1, 'total': amount, 'amount': amount } data['total']['amount'] += amount elif row.classes_attendance.AttendanceType == 4: # Complementary data['complementary']['count'] += 1 data['total']['count'] += 1 return data