def input_stock(request, facility_code, context={}, template="logistics/input_stock.html"): # TODO: replace this with something that depends on the current user # QUESTION: is it possible to make a dynamic form? errors = '' rms = get_object_or_404(SupplyPoint, code=facility_code) productstocks = [ p for p in rms.stocked_productstocks().order_by('product__name') ] if request.method == "POST": # we need to use the helper/aggregator so that when we update # the supervisor on resolved stockouts we can do it all in a # single message prh = ProductReportsHelper(rms, Reports.SOH) for stock in productstocks: try: if stock.product.sms_code in request.POST: quantity = request.POST[stock.product.sms_code].strip() if quantity: if not quantity.isdigit(): errors = ", ".join([errors, stock.product.name]) continue prh.add_product_stock(stock.product.sms_code, quantity, save=False) if "%s_receipt" % stock.product.sms_code in request.POST: receipt = request.POST["%s_receipt" % stock.product.sms_code].strip() if not receipt.isdigit(): errors = ", ".join([errors, stock.product.name]) continue if int(receipt) != 0: prh.add_product_receipt(stock.product.sms_code, receipt, save=False) if "%s_consumption" % stock.product.sms_code in request.POST: consumption = request.POST["%s_consumption" % stock.product.sms_code].strip() if consumption: if not consumption.isdigit(): errors = ", ".join([errors, stock.product.name]) continue prh.add_product_consumption(stock.product, consumption) if "%s_use_auto_consumption" % stock.product.sms_code in request.POST: rms.activate_auto_consumption(stock.product) else: rms.deactivate_auto_consumption(stock.product) except ValueError, e: errors = errors + unicode(e) if not errors: prh.save() return HttpResponseRedirect( reverse(stockonhand_facility, args=(rms.code, ))) errors = "Please enter all stock on hand and consumption as integers, for example:'100'. " + \ "The following fields had problems: " + errors.strip(', ')
def handle(self, text): sp = self.msg.logistics_contact.supply_point result = text.split() product_code = result[0] amt = result[1] p = Product.objects.get(product_code=product_code) prh = ProductReportsHelper(sp, Reports.SOH) prh.add_product_stock(p.sms_code, amt) prh.save() self.respond(_(config.Messages.STOCK_INQUIRY_CONFIRM) % {"quantity": amt, "product_name": p.name})
def handle(self, text): sp = self.msg.logistics_contact.supply_point result = text.split() product_code = result[0] amt = result[1] p = Product.objects.get(product_code=product_code) prh = ProductReportsHelper(sp, Reports.SOH) prh.add_product_stock(p.sms_code, amt) prh.save() self.respond( _(config.Messages.STOCK_INQUIRY_CONFIRM) % { "quantity": amt, "product_name": p.name })
def testProductReportsHelper(self): sdp = SupplyPoint() m = Message() p = ProductReportsHelper(sdp, Reports.SOH, m) p.add_product_stock('lf', 10, save=False) p.add_product_stock('mc', 30, save=False) p.add_product_stock('aa', 0, save=False) p.add_product_stock('oq', 0, save=False) self.assertEquals(p.all(), "lf 10, aa 0, oq 0, mc 30") self.assertEquals(p.stockouts(), "aa oq") my_iter = p._getTokens("ab10cd20") self.assertEquals(my_iter.next(), 'ab') self.assertEquals(my_iter.next(), '10') self.assertEquals(my_iter.next(), 'cd') self.assertEquals(my_iter.next(), '20')
def testProductReportsHelper(self): sdp = SupplyPoint() m = Message() p = ProductReportsHelper(sdp, Reports.SOH, m) p.add_product_stock('lf',10, save=False) p.add_product_stock('mc',30, save=False) p.add_product_stock('aa',0, save=False) p.add_product_stock('oq',0, save=False) self.assertEquals(p.all(), "lf 10, aa 0, oq 0, mc 30") self.assertEquals(p.stockouts(), "aa oq") my_iter = p._getTokens("ab10cd20") self.assertEquals(my_iter.next(),'ab') self.assertEquals(my_iter.next(),'10') self.assertEquals(my_iter.next(),'cd') self.assertEquals(my_iter.next(),'20')
def input_stock(request, facility_code, context={}, template="logistics/input_stock.html"): # TODO: replace this with something that depends on the current user # QUESTION: is it possible to make a dynamic form? errors = '' rms = get_object_or_404(SupplyPoint, code=facility_code) productstocks = [p for p in ProductStock.objects.filter(supply_point=rms).order_by('product__name')] if request.method == "POST": # we need to use the helper/aggregator so that when we update # the supervisor on resolved stockouts we can do it all in a # single message prh = ProductReportsHelper(rms, Reports.SOH) for stock in productstocks: try: if stock.product.sms_code in request.POST: quantity = request.POST[stock.product.sms_code].strip() if quantity: if not quantity.isdigit(): errors = ", ".join([errors, stock.product.name]) continue prh.add_product_stock(stock.product.sms_code, quantity, save=False) if "%s_receipt" % stock.product.sms_code in request.POST: receipt = request.POST["%s_receipt" % stock.product.sms_code].strip() if not receipt.isdigit(): errors = ", ".join([errors, stock.product.name]) continue if int(receipt) != 0: prh.add_product_receipt(stock.product.sms_code, receipt, save=False) if "%s_consumption" % stock.product.sms_code in request.POST: consumption = request.POST["%s_consumption" % stock.product.sms_code].strip() if consumption: if not consumption.isdigit(): errors = ", ".join([errors, stock.product.name]) continue prh.add_product_consumption(stock.product, consumption) if "%s_use_auto_consumption" % stock.product.sms_code in request.POST: rms.activate_auto_consumption(stock.product) else: rms.deactivate_auto_consumption(stock.product) except ValueError, e: errors = errors + unicode(e) if not errors: prh.save() return HttpResponseRedirect(reverse(stockonhand_facility, args=(rms.code,))) errors = "Please enter all stock on hand and consumption as integers, for example:'100'. " + \ "The following fields had problems: " + errors.strip(', ')
def process_xform(submission): from logistics.models import ProductReportsHelper from logistics.util import config from logistics import const try: health_provider = submission.connection.contact.healthproviderbase.healthprovider except: logging.error('%s contact is not a health provider' % submission.connection.identity) return if not submission.message: logging.error('%s sent an empty message' % submission.connection.identity) return if health_provider.facility is None: logging.error('%s has no associated facility' % submission.connection.identity) return values_count = len(submission.submission_values()) try: if submission.xform.keyword == stock_reports[0]: stock_report = ProductReportsHelper(health_provider.facility.supply_point, const.Reports.SOH, submission.message) if values_count > 0: stock_report.add_product_receipt(config.Products.SIX_PACK, submission.eav.act_spd) if values_count > 1: stock_report.add_product_stock(config.Products.SIX_PACK, submission.eav.act_sps) if values_count > 2: stock_report.add_product_receipt(config.Products.TWELVE_PACK, submission.eav.act_tpd) if values_count > 3: stock_report.add_product_stock(config.Products.TWELVE_PACK, submission.eav.act_tps) if values_count > 4: stock_report.add_product_receipt(config.Products.EIGHTEEN_PACK, submission.eav.act_epd) if values_count > 5: stock_report.add_product_stock(config.Products.EIGHTEEN_PACK, submission.eav.act_eps) if values_count > 6: stock_report.add_product_receipt(config.Products.TWENTY_FOUR_PACK, submission.eav.act_fpd) if values_count > 7: stock_report.add_product_stock(config.Products.TWENTY_FOUR_PACK, submission.eav.act_fps) stock_report.save() elif submission.xform.keyword == stock_reports[1]: stock_report = ProductReportsHelper(health_provider.facility.supply_point, const.Reports.SOH, submission.message) if values_count > 0: stock_report.add_product_receipt(config.Products.OTHER_ACT_STOCK, submission.eav.qun_oad) if values_count > 1: stock_report.add_product_stock(config.Products.OTHER_ACT_STOCK, submission.eav.qun_oas) if values_count > 2: stock_report.add_product_receipt(config.Products.QUININE, submission.eav.qun_qud) if values_count > 3: stock_report.add_product_stock(config.Products.QUININE, submission.eav.qun_qus) stock_report.save() elif submission.xform.keyword == stock_reports[2]: stock_report = ProductReportsHelper(health_provider.facility.supply_point, const.Reports.SOH, submission.message) if values_count > 0: stock_report.add_product_receipt(config.Products.RAPID_DIAGNOSTIC_TEST, submission.eav.rdt_rdd) if values_count > 1: stock_report.add_product_stock(config.Products.RAPID_DIAGNOSTIC_TEST, submission.eav.rdt_rds) stock_report.save() except Exception, e: if submission.xform.keyword in stock_reports: submission.response = unicode(e) submission.has_errors = True submission.save() return