def handle(self, text):
     product_list = self.parse_report(text)
     # flatten
     product_list =  map(str, [item for sublist in product_list for item in sublist])
     #product_list = text.split()
     
     if (len(product_list) == 0) or (len(product_list) > 0 and len(product_list) % 2 != 0):
          self.respond(_("Sorry, invalid format.  The message should be in the format 'soh <product> <amount> <product> <amount>'"))
          return
     else:    
         reported_products = []
         sdp = self.msg.contact.contactdetail.service_delivery_point
         reply_list = []
         while len(product_list) >= 2:
             product_code = sub('\.', '', product_list.pop(0))
             quantity = sub('\.', '', product_list.pop(0))
             if not is_number(quantity):
                 if is_number(product_code):
                     temp = product_code
                     product_code = quantity
                     quantity = temp
                 else:                        
                     self.respond(_("Sorry, invalid format.  The message should be in the format 'soh product amount product amount'"))
                     return
             report_type = ProductReportType.objects.filter(sms_code='soh')[0:1].get()
             try:
                 product = Product.get_product(product_code)   
             except Product.DoesNotExist:
                 self.respond(_("Sorry, invalid product code %(code)s"), code=product_code.upper())
                 return
             reported_products.append(product.sms_code)
             reply_list.append('%s' % (product.sms_code) )
             sdp.report_product_status(product=product,report_type=report_type,quantity=quantity, message=self.msg.logger_msg)
         now = datetime.now()
         all_products = []
         date_check = datetime.now() + relativedelta(days=-7)
         missing_products = Product.objects.filter(Q(activeproduct__service_delivery_point=sdp, activeproduct__is_active=True), 
                                                   ~Q(servicedeliverypointproductreport__report_date__gt=date_check) )
         for dict in missing_products.values('sms_code'):
             all_products.append(dict['sms_code'])
         missing_product_list = list(set(all_products)-set(reported_products))
         if missing_product_list:
             kwargs = {'contact_name': self.msg.contact.name,
                       'facility_name': sdp.name,
                       'product_list': ' '.join(missing_product_list)}
             self.respond(_('Thank you %(contact_name)s for reporting your stock on hand for %(facility_name)s.  Still missing %(product_list)s.'), **kwargs)
         else:    
             self.respond(_('Thank you, you reported you have %(reply_list)s. If incorrect, please resend.'), reply_list=','.join(reply_list))
         self.respond(_("Please send in your adjustments in the format 'la <product> +-<amount> +-<product> +-<amount>...'"))
         st = ServiceDeliveryPointStatusType.objects.filter(short_name="lost_adjusted_reminder_sent_facility")[0:1].get()
         ns = ServiceDeliveryPointStatus(service_delivery_point=sdp, status_type=st, status_date=datetime.now())
         ns.save()
 def handle(self, text):
     product_code = text.strip().upper()
     try:
         product = Product.get_product(product_code)      
     except Product.DoesNotExist:
         self.respond(_("Sorry, invalid product code %(code)s"), code=product_code)
         return
     sdp = self.msg.contact.contactdetail.service_delivery_point
     report_type = ProductReportType.objects.filter(sms_code='soh')[0:1].get()
     sdp.report_product_status(product=product,report_type=report_type,quantity=0, message=self.msg.logger_msg)
     kwargs = {'contact_name': self.msg.contact.name,
               'facility_name': sdp.name,
               'product_name': product.name}
     self.respond(_('Thank you %(contact_name)s for reporting a stockout of %(product_name)s for %(facility_name)s.'), **kwargs)
 def handle(self, text):
     product_list = text.split()
     if len(product_list) > 0 and len(product_list) % 2 != 0:
          self.respond(_("Sorry, invalid format.  The message should be in the format 'la <product> +-<amount> +-<product> +-<amount>..."))
          return
     else:    
         reported_products = []
         sdp = self.msg.contact.contactdetail.service_delivery_point
         reply_list = []
         while len(product_list) >= 2:
             product_code = product_list.pop(0)
             quantity = product_list.pop(0)
             if not is_number(quantity):
                 if is_number(product_code):
                     temp = product_code
                     product_code = quantity
                     quantity = temp
                 else:                        
                     self.respond(_("Sorry, invalid format.  The message should be in the format 'la <product> +-<amount> +-<product> +-<amount>..."))
                     return
             report_type = ProductReportType.objects.filter(sms_code='la')[0:1].get()
             try:
                 product = Product.get_product(product_code)      
             except Product.DoesNotExist:
                 self.respond(_("Sorry, invalid product code %(code)s"), code=product_code.upper())
                 return
             reported_products.append(product.sms_code)
             reply_list.append('%s %s' % (product.sms_code, quantity) )
             sdp.report_product_status(product=product,report_type=report_type,quantity=quantity, message=self.msg.logger_msg)
         now = datetime.now()
         all_products = []
         #TODO: this needs to be fixed not to just check the last 7 days
         date_check = datetime.now() + relativedelta(days=-7)
         missing_products = Product.objects.filter(Q(activeproduct__service_delivery_point=sdp,
                                                     servicedeliverypointproductreport__report_type__sms_code = 'la', 
                                                     activeproduct__is_active=True), 
                                                   ~Q(servicedeliverypointproductreport__report_date__gt=date_check) )
         for dict in missing_products.values('sms_code'):
             all_products.append(dict['sms_code'])
         missing_product_list = list(set(all_products)-set(reported_products))
         if missing_product_list:
             kwargs = {'contact_name': self.msg.contact.name,
                       'facility_name': sdp.name,
                       'product_list': ', '.join(missing_product_list),
                       'reply_list': ','.join(reply_list)}
                             
             self.respond(_('Thank you, you reported your losses/adjustments: %(reply_list)s. Still missing %(product_list)s.'), **kwargs)
         else:    
             self.respond(_('Thank you, you reported your losses/adjustments: %(reply_list)s. If incorrect, please resend.'), reply_list=','.join(reply_list))
 def handle(self, text):
     product_code, quantity = text.split()
     product_code = sub('m|M', '', product_code)
     if not product_code and quantity:
          self.respond(_("Sorry, invalid format.  The message should be in the format 'si <MSD product code> <amount>'"))
          return
     else:    
         sdp = self.msg.contact.contactdetail.service_delivery_point
         try:
             product = Product.get_product(product_code)   
         except Product.DoesNotExist:
             self.respond(_("Sorry, invalid product code %(code)s"), code=product_code.upper())
             return
         if not is_number(quantity):
             self.respond(_("Sorry, invalid format.  The message should be in the format 'si <MSD product code> <amount>'"))
             return
         report_type = ProductReportType.objects.filter(sms_code='soh')[0:1].get()
         sdp.report_product_status(product=product,report_type=report_type,quantity=quantity, message=self.msg.logger_msg)
         self.respond(_('Thank you, you reported you have %(quantity)s     %(product_name)s. If incorrect, please resend.'), product_name=product.name, quantity=quantity)        
 def handle(self, text):
     service_delivery_point=self.msg.contact.contactdetail.service_delivery_point
     if service_delivery_point.service_delivery_point_type.name == "DISTRICT":
         st = ServiceDeliveryPointStatusType.objects.filter(short_name="delivery_received_district")[0:1].get()
         ns = ServiceDeliveryPointStatus(service_delivery_point=service_delivery_point, status_type=st, status_date=datetime.now())
         ns.save()
         kwargs={'contact_name': self.msg.contact.name,
                 'facility_name': service_delivery_point.name}
         self.respond(_('Thank you %(contact_name)s for reporting your delivery for %(facility_name)s'), **kwargs)
         self._send_delivery_alert_to_facilities(service_delivery_point)
     elif service_delivery_point.service_delivery_point_type.name == "FACILITY":
         product_list = text.split()
         if len(product_list) > 0 and len(product_list) % 2 != 0:
              self.respond(_("Sorry, invalid format.  The message should be in the format 'delivered product amount product amount'"))
              return
         else:
             reply_list = []
             while len(product_list) >= 2:
                 product_code = product_list.pop(0)
                 quantity = product_list.pop(0)
                 if not is_number(quantity):
                     if is_number(product_code):
                         temp = product_code
                         product_code = quantity
                         quantity = temp
                     else:                        
                         self.respond(_("Sorry, invalid format.  The message should be in the format 'delivered product amount product amount'"))
                         return
                 
                 report_type = ProductReportType.objects.filter(sms_code='dlvd')[0:1].get()
                 try:
                     product = Product.get_product(product_code)      
                 except Product.DoesNotExist:
                     self.respond(_('Sorry, invalid product code %(code)s'), code=product_code)
                     return
                 reply_list.append('%s %s' % (product.sms_code, quantity) )
                 service_delivery_point.report_product_status(product=product,report_type=report_type,quantity=quantity, message=self.msg.logger_msg)
             
             st = ServiceDeliveryPointStatusType.objects.filter(short_name="delivery_quantities_reported")[0:1].get()
             ns = ServiceDeliveryPointStatus(service_delivery_point=service_delivery_point, status_type=st, status_date=datetime.now())
             ns.save()
             self.respond(_('Thank you, you reported a delivery of %(reply_list)s. If incorrect, please resend.'), reply_list=','.join(reply_list))