A core charge is a refundable deposit taken when a rebuildable part is sold and returned when the old unit comes back. It is a liability, not revenue — and booking it as revenue is the most common accounting error in aftermarket distribution, because it inflates income while hiding an obligation.

Core charges, done correctly

EventCorrect treatment
Part sold with core chargePart to revenue; core charge to a core liability account.
Core returned in acceptable conditionClear the liability; credit the customer.
Core returned damaged or wrongPartial or no credit, against a stated policy.
Core never returnedLiability becomes revenue only once the return window closes.
Codeunit 50220 Core Charge Manager.al
codeunit 50220 "Core Charge Manager"
{
    Access = Public;
    Subtype = Normal;

    [EventSubscriber(ObjectType::Table, Database::"Sales Line", 'OnAfterAssignItemValues', '', false, false)]
    local procedure ApplyCoreDeposit(var SalesLine: Record "Sales Line")
    var
        Item: Record Item;
        CoreSalesLine: Record "Sales Line";
    begin
        if SalesLine.Type <> SalesLine.Type::Item then
            exit;

        if not Item.Get(SalesLine."No.") then
            exit;

        // Check if item requires a Core Charge deposit (e.g. Alternators, Starters)
        if Item."Requires Core Deposit" and (Item."Core Deposit Item No." <> '') then begin
            SalesLine."Attached to Line No." := SalesLine."Line No.";
            
            // Generate supplementary Core Charge line automatically
            CoreSalesLine.Init();
            CoreSalesLine."Document Type" := SalesLine."Document Type";
            CoreSalesLine."Document No." := SalesLine."Document No.";
            CoreSalesLine."Line No." := SalesLine."Line No." + 5000;
            CoreSalesLine.Validate(Type, CoreSalesLine.Type::Item);
            CoreSalesLine.Validate("No.", Item."Core Deposit Item No.");
            CoreSalesLine.Validate(Quantity, SalesLine.Quantity);
            CoreSalesLine.Insert(true);
        end;
    end;
}

The control that matters is the open-core report: which cores are outstanding, for how long, against which customer. Without it, the liability account accumulates balances nobody can explain, and reconciling it later means going back through individual invoices.

Supersession chains

Manufacturers replace parts. Part A is superseded by B, which is later superseded by C. A customer ordering A should receive C — but a customer ordering C must not receive A.

That directionality is the thing implementations get wrong. Modelled as a symmetric "equivalent parts" relationship, the chain will eventually ship an obsolete part in place of its own replacement.

Fitment

Whether a part fits a vehicle is not a property of the part and not a property of the vehicle. It is a relationship, frequently qualified — this part fits this model, in these years, with this engine, excluding a particular trim.

  1. Hold fitment in its own table, maintained against the industry catalogue standard.
  2. Accept that it is never complete. Build the workflow for the unknown case instead of assuming coverage.
  3. Where VIN decoding is available, use it to narrow the question, not to answer it outright.
In most distribution businesses a catalogue error is an inconvenience. Here it sends a part across the country, receives it back, and loses the account that ordered it.

Returns are the normal case

Aftermarket return rates make RMA handling a primary workflow rather than an exception path. It has to distinguish between a core return, a warranty claim and an ordinary return, because each has a different financial consequence and a different physical destination.