def set_status(self, status): """ :param status: Set status of class booking :return: """ from os_cache_manager import OsCacheManager self.row.BookingStatus = status self.row.update_record() if status == 'cancelled': ## # Change invoice status to cancelled ## from openstudio.os_invoice import Invoice db = current.db query = (db.invoices_items_classes_attendance.classes_attendance_id == self.id) rows = db(query).select(db.invoices_items_classes_attendance.ALL) for row in rows: item = db.invoices_items(row.invoices_items_id) invoice = Invoice(item.invoices_id) invoice.set_status('cancelled') # Clear api cache to refresh available spaces ocm = OsCacheManager() ocm.clear_classschedule_api()
def sell_to_customer(self, auth_user_id, date_start, note=None, invoice=True, payment_methods_id=None): """ :param auth_user_id: Sell membership to customer """ from os_customer_membership import CustomerMembership from os_cache_manager import OsCacheManager db = current.db ocm = OsCacheManager() cmID = db.customers_memberships.insert( auth_customer_id = auth_user_id, school_memberships_id = self.smID, Startdate = date_start, Enddate = self.sell_to_customer_get_enddate(date_start), Note = note, payment_methods_id=payment_methods_id ) # Init membership cm = CustomerMembership(cmID) cm.set_enddate() cm.set_date_id_and_barcode() # Clear memberships cache for this user ocm.clear_customers_memberships(auth_user_id) if invoice: self.sell_to_customer_create_invoice(cmID) return cmID
def set_sys_property(self, property, value): """ :param property: string - name of sys property :return: None """ db = current.db row = db.sys_properties(Property=property) if not row: db.sys_properties.insert(Property=property, PropertyValue=value) else: row.PropertyValue = value row.update_record() # Clear cache from os_cache_manager import OsCacheManager ocm = OsCacheManager() ocm.clear_sys_properties()
def remove_attendance_booked_classes(self, cancel_from): """ This function is used to cancel all classes after a given date for a reservation. Used when setting an end date for a reservation or deleting a reservation :param cancel_from: datetime.date (usually TODAY_LOCAL) :return: None """ from os_cache_manager import OsCacheManager T = current.T db = current.db # Find all booked classes attendance_deleted = 0 if self.row.customers_subscriptions_id: query = (db.classes_attendance.classes_id == self.row.classes_id) & \ (db.classes_attendance.auth_customer_id == self.row.auth_customer_id) & \ (db.classes_attendance.customers_subscriptions_id == self.row.customers_subscriptions_id) & \ (db.classes_attendance.ClassDate > cancel_from) attendance_deleted = db(query).count() db(query).delete() # Clear cache ocm = OsCacheManager() ocm.clear_customers_subscriptions(self.row.auth_customer_id) ocm.clear_classschedule_api() return attendance_deleted
def sell_to_customer(self, auth_user_id, date_start, payment_methods_id=3, note=None): """ :param auth_user_id: Sell subscription to customer """ from os_cache_manager import OsCacheManager db = current.db ocm = OsCacheManager() csID = db.customers_subscriptions.insert( auth_customer_id=auth_user_id, school_subscriptions_id=self.ssuID, Startdate=date_start, Note=note, payment_methods_id=payment_methods_id) ocm.clear_customers_subscriptions(auth_user_id) return csID
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
def deliver(self, class_online_booking=True, class_booking_status='booked'): """ Create invoice for order and deliver goods """ from os_attendance_helper import AttendanceHelper from os_cache_manager import OsCacheManager from os_invoice import Invoice from os_school_classcard import SchoolClasscard from os_school_subscription import SchoolSubscription from os_customer_subscription import CustomerSubscription from os_school_membership import SchoolMembership from os_customer_membership import CustomerMembership from os_workshop import Workshop from os_workshop_product import WorkshopProduct cache_clear_classschedule_api = current.globalenv[ 'cache_clear_classschedule_api'] get_sys_property = current.globalenv['get_sys_property'] TODAY_LOCAL = current.TODAY_LOCAL ocm = OsCacheManager() db = current.db T = current.T if self.order.Status == 'delivered': return create_invoice = False iID = None invoice = None # Only create an invoice if order amount > 0 amounts = self.get_amounts() sys_property_create_invoice = 'shop_donations_create_invoice' create_invoice_for_donations = get_sys_property( sys_property_create_invoice) if create_invoice_for_donations == 'on': create_invoice_for_donations = True else: create_invoice_for_donations = False if amounts: if amounts.TotalPriceVAT > 0: if not self.order.Donation or (self.order.Donation and create_invoice_for_donations): create_invoice = True # Create blank invoice igpt = db.invoices_groups_product_types(ProductType='shop') iID = db.invoices.insert( invoices_groups_id=igpt.invoices_groups_id, Description=T('Order #') + unicode(self.coID), Status='sent') # Link invoice to order db.invoices_customers_orders.insert( customers_orders_id=self.coID, invoices_id=iID) # Call init function for invoices to set Invoice # , etc. invoice = Invoice(iID) invoice.link_to_customer(self.order.auth_customer_id) # Add items to the invoice rows = self.get_order_items_rows() for row in rows: ## # Only rows where school_classcards_id, workshops_products_id , classes_id or Donation are set # are put on the invoice ## # Check for product: if row.ProductVariant: if create_invoice: invoice.item_add_product_variant( product_name=row.ProductName, description=row.Description, quantity=row.Quantity, price=row.Price, tax_rates_id=row.tax_rates_id, accounting_glaccounts_id=row.accounting_glaccounts_id, accounting_costcenters_id=row.accounting_costcenters_id ) # Check for classcard if row.school_classcards_id: # Deliver card card_start = TODAY_LOCAL scd = SchoolClasscard(row.school_classcards_id) ccdID = scd.sell_to_customer(self.order.auth_customer_id, card_start, invoice=False) # clear cache ocm.clear_customers_classcards(self.order.auth_customer_id) # Add card to invoice if create_invoice: invoice.item_add_classcard(ccdID) # Check for subscription if row.school_subscriptions_id: ## Deliver subscription # Determine payment method cs_payment_method = get_sys_property( 'shop_subscriptions_payment_method') if cs_payment_method == 'mollie': payment_method_id = 100 else: payment_method_id = 3 subscription_start = TODAY_LOCAL ssu = SchoolSubscription(row.school_subscriptions_id) csID = ssu.sell_to_customer( self.order.auth_customer_id, subscription_start, payment_methods_id=payment_method_id) # Add credits for the first month cs = CustomerSubscription(csID) cs.add_credits_month(subscription_start.year, subscription_start.month) # clear cache ocm.clear_customers_subscriptions(self.order.auth_customer_id) if create_invoice: # This will also add the registration fee if required. iiID = invoice.item_add_subscription( csID, TODAY_LOCAL.year, TODAY_LOCAL.month) # Check for membership if row.school_memberships_id: # Deliver membership membership_start = TODAY_LOCAL sme = SchoolMembership(row.school_memberships_id) cmID = sme.sell_to_customer( self.order.auth_customer_id, membership_start, invoice=False, # Don't create a separate invoice ) # clear cache ocm.clear_customers_memberships(self.order.auth_customer_id) if create_invoice: cm = CustomerMembership(cmID) # Check if price exists and > 0: if sme.row.Price: iiID = invoice.item_add_membership(cmID) # Check for workshop if row.workshops_products_id: # Deliver workshop product wsp = WorkshopProduct(row.workshops_products_id) wspcID = wsp.sell_to_customer(self.order.auth_customer_id, invoice=False) # Add workshop product to invoice if create_invoice: invoice.item_add_workshop_product(wspcID) # Check if sold out if wsp.is_sold_out(): # Cancel all unpaid orders with a sold out product for this workshop ws = Workshop(wsp.wsID) ws.cancel_orders_with_sold_out_products() # Check for classes if row.classes_id: # Deliver class ah = AttendanceHelper() if row.AttendanceType == 1: result = ah.attendance_sign_in_trialclass( self.order.auth_customer_id, row.classes_id, row.ClassDate, online_booking=class_online_booking, invoice=False, booking_status=class_booking_status) elif row.AttendanceType == 2: result = ah.attendance_sign_in_dropin( self.order.auth_customer_id, row.classes_id, row.ClassDate, online_booking=class_online_booking, invoice=False, booking_status=class_booking_status, ) if create_invoice: invoice.item_add_class_from_order(row, result['caID']) # Clear api cache to update available spaces cache_clear_classschedule_api() # Check for donation if row.Donation: # Add donation line to invoice if create_invoice and create_invoice_for_donations: invoice.item_add_donation(row.TotalPriceVAT, row.Description) # Check for custom item if row.Custom: # Add custom line to invoice if create_invoice: invoice.item_add_custom_from_order(row) # Notify customer of new invoice #if create_invoice: #invoice.mail_customer_invoice_created() # Update status self.set_status_delivered() # Notify customer of order delivery self._deliver_mail_customer() return dict(iID=iID, invoice=invoice)