def sell_to_customer_create_invoice(self, ccdID): """ Add an invoice after adding a classcard """ from os_customer_classcard import CustomerClasscard from os_invoice import Invoice db = current.db T = current.T classcard = CustomerClasscard(ccdID) igpt = db.invoices_groups_product_types(ProductType='classcard') iID = db.invoices.insert( invoices_groups_id=igpt.invoices_groups_id, Description=classcard.get_name(), Status='sent' ) # create object to set Invoice# and due date invoice = Invoice(iID) # link invoice to customer invoice.link_to_customer(classcard.get_auth_customer_id()) # add classcard item invoice.item_add_classcard(ccdID)
def item_add_classcard(self, ccdID): """ :param ccdID: Add customer classcard to invoice :return: None """ from os_customer_classcard import CustomerClasscard db = current.db T = current.T classcard = CustomerClasscard(ccdID) # link invoice to classcard sold to customer db.invoices_customers_classcards.insert(invoices_id=self.invoices_id, customers_classcards_id=ccdID) # add item to invoice next_sort_nr = self.get_item_next_sort_nr() price = classcard.price iiID = db.invoices_items.insert( invoices_id=self.invoices_id, ProductName=T("Class card"), Description=classcard.name.decode('utf-8') + u' (' + T("Class card") + u' ' + unicode(ccdID) + u')', Quantity=1, Price=price, Sorting=next_sort_nr, tax_rates_id=classcard.school_classcard.tax_rates_id, ) self.set_amounts() self.on_update() return iiID
def sell_to_customer_create_invoice(self, ccdID): """ Add an invoice after adding a classcard """ from os_customer_classcard import CustomerClasscard from os_invoice import Invoice db = current.db T = current.T classcard = CustomerClasscard(ccdID) igpt = db.invoices_groups_product_types(ProductType='classcard') iID = db.invoices.insert(invoices_groups_id=igpt.invoices_groups_id, Description=classcard.get_name(), Status='sent') # link invoice to classcard db.invoices_customers_classcards.insert(invoices_id=iID, customers_classcards_id=ccdID) # create object to set Invoice# and due date invoice = Invoice(iID) next_sort_nr = invoice.get_item_next_sort_nr() price = classcard.price iiID = db.invoices_items.insert( invoices_id=iID, ProductName=T("Class card"), Description=T("Class card") + ' ' + unicode(ccdID), Quantity=1, Price=price, Sorting=next_sort_nr, tax_rates_id=classcard.school_classcard.tax_rates_id, ) invoice.set_amounts() invoice.link_to_customer(classcard.get_auth_customer_id())
def get_class_revenue_classcard(self, row): """ :param row: row from db.classes_attendance with left join on db.customers_subscriptions :return: Revenue for class taken on a card """ db = current.db from os_customer_classcard import CustomerClasscard from os_invoice import Invoice ccdID = row.classes_attendance.customers_classcards_id classcard = CustomerClasscard(ccdID) left = [ db.invoices_items.on(db.invoices_items_customers_classcards. invoices_items_id == db.invoices_items.id) ] query = (db.invoices_items_customers_classcards.customers_classcards_id == ccdID) rows = db(query).select(db.invoices_items.ALL, left=left) if not rows: revenue_in_vat = 0 revenue_ex_vat = 0 revenue_vat = 0 else: row = rows.first() invoice = Invoice(row.invoices_id) amounts = invoice.get_amounts() price_in_vat = amounts.TotalPriceVAT price_ex_vat = amounts.TotalPrice # Divide by classes taken on card if classcard.unlimited: # Count all classes taken on card query = ( db.classes_attendance.customers_classcards_id == ccdID) count_classes = db(query).count() revenue_in_vat = price_in_vat / count_classes revenue_ex_vat = price_ex_vat / count_classes revenue_vat = revenue_in_vat - revenue_ex_vat else: revenue_in_vat = price_in_vat / classcard.classes revenue_ex_vat = price_ex_vat / classcard.classes revenue_vat = revenue_in_vat - revenue_ex_vat return dict(revenue_in_vat=revenue_in_vat, revenue_ex_vat=revenue_ex_vat, revenue_vat=revenue_vat)
def set_status_cancelled(self, force=False): """ Set status cancelled """ from os_cache_manager import OsCacheManager T = current.T db = current.db ocm = OsCacheManager() NOW_LOCAL = current.NOW_LOCAL return_message = T('Cancelled class') # check hours in advance policy if self.get_cancellation_possible() or force: # Set booking status to cancelled self.row.BookingStatus = 'cancelled' self.row.update_record() # Remove credits taken from customer for attending a class query = (db.customers_subscriptions_credits.classes_attendance_id == self.id) db(query).delete() # Update classes taken for class card if self.row.customers_classcards_id: from os_customer_classcard import CustomerClasscard cc = CustomerClasscard(self.row.customers_classcards_id) cc.set_classes_taken() # Refresh cache for this customer for both cards & subscriptions ocm.clear_customers_classcards(self.row.auth_customer_id) ocm.clear_customers_subscriptions(self.row.auth_customer_id) else: return_message = T("This class can no longer be cancelled") return return_message