Beispiel #1
0
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(', ')
Beispiel #2
0
 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})
Beispiel #3
0
 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
         })
Beispiel #4
0
 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')
Beispiel #5
0
 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