Example #1
0
    def provisioning2xml(self, provisioning_id):
        """Generic functionality to create a XML file from kernelE's kommischein information."""

        provisioning_dict = Kerneladapter().get_kommischein(provisioning_id)

        xmlroot = self.root
        xml_provisioning = ET.SubElement(xmlroot, 'provisioning')

        # neccessary data from kommischein
        for fieldname in ['provpipeline_id', 'id']:
            _add_subelemententry(xml_provisioning, fieldname, provisioning_dict)

        # FIXME This is special treatment for archived provisionings. Is there a need to process the archived?
        for fieldname in ['parts']:
            attr_dict = provisioning_dict.get('attributes', provisioning_dict)
            _add_subelemententry(xml_provisioning, fieldname, attr_dict)

        # data from kommiauftrag
        fields = ['liefertermin', 'kundennr', 'auftragsnummer']
        kommiauftrag = Kerneladapter().get_kommiauftrag(provisioning_dict["provpipeline_id"])
        attr_dict = kommiauftrag.get('attributes', kommiauftrag)
        for fieldname in fields:
            _add_subelemententry(xml_provisioning, fieldname, attr_dict)

        # data from the kommischeins provisionings_ids
        weight_sum = 0
        volume_sum = 0

        # collect provisionings in a list of dictionaries -> for sorting
        provisionings = []
        # XXX: provisionings called provisioning_ids in kernel and provisionings in archive
        # FIXME: do we need archived provisionings?
        for provisioningid in provisioning_dict.get("provisioning_ids",
                                                    provisioning_dict.get("provisionings", [])):
            if provisioningid.startswith('P'):
                provisioning = Kerneladapter().get_pick(provisioningid)
            else:
                provisioning = Kerneladapter().get_movement(provisioningid)
            provisionings.append(provisioning)


        # process provisionings sorted by from_location
        for provisioning in sort_plaetze(provisionings, key='from_location'):

            xml_pos = ET.SubElement(xml_provisioning, 'provisioningposition')

            # FIXME was ist provisioning_type? -> pick/retrieval? wo wird das angedruckt?
            # FIXME: sowas wie from_location gibts bei archivierten daten nicht
            for fieldname in ['from_location', 'provisioning_type', 'menge']:
                _add_subelemententry(xml_pos, fieldname, provisioning)
            
            # article data
            artnr = provisioning['artnr']
            pickmenge = provisioning['menge']
            product = dict(cs.masterdata.article.eap(artnr)) # dict aus couchdb document machen
            product['artnr'] = artnr # ist sonst nur _id
            xml_product = ET.SubElement(xml_pos, 'product')

            volume = product.get('package_volume_liter')
            if volume:
                volume_sum += pickmenge * volume
            else:
                cs.zwitscher.zwitscher('%s: Volumen unbekannt' % artnr, username='******')

            weight = product.get('package_weight', 0)/1000.
            if weight:
                weight_sum += pickmenge * weight
            else:
                cs.zwitscher.zwitscher('%s: Gewicht unbekannt' % artnr, username='******')

            for fieldname in ['artnr', 'name', 'package_weight']:
                _add_subelemententry(xml_product, fieldname, product)

            if self.produktionsauftrag:
                ET.SubElement(xml_product, 'produktionshinweis').text = cs.masterdata.vorprodukte.produktionshinweis(artnr)

            products_per_export_package = product.get('products_per_export_package')
            if products_per_export_package:
                ET.SubElement(xml_pos, 'export_packages_per_position').text = unicode(
                        pickmenge / float(products_per_export_package))
            else:
                ET.SubElement(xml_pos, 'export_packages_per_position').text = ''

        ET.SubElement(xml_provisioning, 'volume_sum').text = str(volume_sum)
        ET.SubElement(xml_provisioning, 'weight_sum').text = str(weight_sum)
        return xmlroot