Source code for ferrosoft.apps.emiflow.dataimport.simple

from decimal import Decimal

from django.utils.translation import gettext as _

from ferrosoft.apps.dataimport.models import LogHighlight
from ferrosoft.apps.dataimport.queue import ModelProcessorArgs
from ferrosoft.apps.emiflow.dataimport.base import (
    ImportState,
    process_transport_chain,
    get_transport_chain_defaults,
)
from ferrosoft.apps.emiflow.models import (
    SimpleImportLine,
    TransportChain,
    BookingStatus,
    DistanceType,
    TransportChainType,
    Incoterm,
    OperationEpitype,
)
from ferrosoft.apps.emiflow.services.builder import TransportChainBuilder
from ferrosoft.apps.emiflow.services.emissions import TransportBookingService
from ferrosoft.apps.ferrobase.models.decimal import DecimalWithUnit


[docs] def model_processor(pargs: ModelProcessorArgs): process_transport_chain(pargs, SimpleImportLine, _create_transport_chain)
def _create_transport_chain( model: SimpleImportLine, state: ImportState, pargs: ModelProcessorArgs ): defaults = get_transport_chain_defaults(model, state, pargs) if defaults is None: return chain = _create_basic_transport_chain(model) if chain is None: pargs.ui_updater.send_log_entry( pargs.job, _("Skipping existing transport chain %(reference)s") % {"reference": model.reference}, pargs.line_number, LogHighlight.INFO, ) return chain_builder = TransportChainBuilder(chain) tce_builder = ( chain_builder.add_element() .epitype(OperationEpitype.TRANSPORT) .operation(defaults.transport_operation) .activity_distance_type(DistanceType(defaults.distance_type)) # TODO Support actual distance with values from SimpleImportLine .activity_distance(DecimalWithUnit.create("0", "km")) .distance_adjustment_factor(Decimal("1.0")) ) (chain_builder.add_freight_item().weight(model.weight).material(model.material)) tce_builder.add_geo_origin().address(model.start_address()) tce_builder.add_geo_destination().address(model.destination_address()) chain = chain_builder.save() TransportBookingService().book(chain) def _create_basic_transport_chain(model: SimpleImportLine) -> TransportChain | None: if TransportChain.objects.filter(reference=model.reference).count() > 0: return None else: return ( TransportChainBuilder.new() .status(BookingStatus.OPEN) .reference(model.reference) .booking_date(model.booking_date) .transport_type(TransportChainType(model.transport_type)) .incoterms(None if model.incoterms is None else Incoterm(model.incoterms)) .consignor(model.consignor) .consignee(model.consignee) .save() )