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()
)