4  Process Cost Accounting

Process cost accounting is about the process involved in mass producing products that are identical or similar in nature. To calculate production costs the process costing is used.

Process cost accounting involves:

4.1 Process Cost Systems

Manufacturing process cost systems is to apply costs to similar products that are mass produced in a continuous way.

Similarities and differences between job order and process cost systems is that costs are tracked through the series of manufacturing processes and not by individual jobs.

Job order cost flow:

  1. direct materials, labor, manufacturing overhead
  2. work in process inventory
  3. finished goods inventory
  4. cost of goods sold

Process cost flow:

  1. direct materials, labor, manufacturing overhead
  2. work in process (department A)
  3. work in process (department B)
  4. finished goods inventory
  5. cost of goods sold

The similarities of job order cost and process cost systems, are manufacturing cost elements, both have costing systems track materials, labor and overhead. The accumulation of the costs of materials, labor and overhead are all debited costs. Lastly, the flow of costs are debited in both costing system but the methods used do differ between them.

The differences are the number of work in process accounts used, job order costing uses only one process account. The documents used to track costs, as process costs system summarizes the costs in a production cost report for each department and job cost systems tally individual jobs then sums the cost in a cost sheet when the job is finished. The process cost system the unit cost is the total manufacturing costs for the period divided by the units produced during the period, unlike job cost system job cost divided by units produced.

  • Operating costs is the hybrid approach using both process cost and job order cost systems.

4.2 Manufacturing costs

The accumulation of costs for materials, labor and manufacturing overhead is debited for all raw materials when materials are purchased. Factory labor is debited when costs are incurred, and likewise for debit overhead costs.

  • All raw materials used for production are the material costs
  • time tickets could be used in a factory labor cost for process cost system
  • manufacturing overhead costs can be determined by looking at the machine time used (not direct labor), as this provides a clear overhead cost.

4.2.1 Proccess costing example

A company makes a generic beverage, using two processes such as blending and bottling. In June the raw materials used cost $18,000 for blending and 4,000 dollars for bottling. Factory labor costs were $12,000 for blending, 5,000 for bottling. Manufacturing overhead costs were 6,000 dollars for blending and 2500 dollars for bottling. Units completed at a cost of 19,000 dollars in the blending department transferred to bottling department. Units completed at a cost of 11,000 dollars in the bottling department transferred to the finished goods inventory. Journalize the assignment of these costs to the two processes and the transfer of the units.

Make a dictionary for the costs. The abbreviation ‘wip’ is for work in process.

Show the code
bev_costs = {
  # raw materials
  'raw_wip_blending': 18e3,
  'raw_wip_bottling': 4e3,
  # factory labor
  'labor_wip_blending': 12e3,
  'labor_wip_bottling': 5e3,
  # manufacturing
  'man_wip_blending': 6e3,
  'man_wip_bottling': 2500,
  
  'blending_dep': 19e3,
  'bottling_dep': 11e3
}
Show the code
list(bev_costs.values())
[18000.0, 4000.0, 12000.0, 5000.0, 6000.0, 2500, 19000.0, 11000.0]

Calculate the materials used, factory labor to production and overhead to production.

Show the code
def process_costing( dict):
  # get the dictionary values as an array and use the index of elements
  d = list(dict.values())
  raw_invent = d[0] + d[1]
  factory_labor = d[2] + d[3]
  manuf_overhead = d[4] + d[5]
  blending = dict['blending_dep']
  bottle = dict['bottling_dep']
  
  print(" -- Process Costing --")
  print("Raw materials inventory ............ ${:,}".format(raw_invent))
  print("Factory labor ...................... ${:,}".format(factory_labor))
  print("Manufacturing overhead ............. ${:,}".format(manuf_overhead))
  print("Work in process blending ........... ${:,}".format(blending ))
  print("Work in process bottling ........... ${:,}".format(bottle ))
  

process_costing( bev_costs)
 -- Process Costing --
Raw materials inventory ............ $22,000.0
Factory labor ...................... $17,000.0
Manufacturing overhead ............. $8,500.0
Work in process blending ........... $19,000.0
Work in process bottling ........... $11,000.0

4.2.2 Equivalent units

Process cost system uses equivalent units of production which measures the work done during the period in completed units.

the formula:

  • conversion costs is the sum of labor costs and overhead costs
  • units completed and transferred out (materials) + equivalent units of ending work in process (materials) = equivalent units of production (materials)
  • units completes and transferred out (conversion costs) + equivalent units of ending work in process (conversion costs) = equivalent units of production (conversion costs)

4.2.2.1 Quick example

Calculate the cost of teachers at a college for each full time student.

  • total cost of teachers $9,000,000
  • part time students = 900
  • full time students = 1,000
  • part time students take 60% of the classes of a full time student
Show the code
teachers = {'PartTime': 900, 'FullTime': 1000,'Cost': 9e6,'PT_percent': 0.6}


def teacher_cost( dict):
  pt = dict['PartTime']
  ft = dict['FullTime']
  cost = dict['Cost']
  prct = dict['PT_percent']
  FT_equiv = pt + (prct * ft)
  total_teacher_cost = cost/ FT_equiv
  print("The cost of teacher per FT student = ${:,}".format(total_teacher_cost))
  
teacher_cost( teachers )
The cost of teacher per FT student = $6,000.0

4.2.3 Weighted average method

Reusing the beverage company from before, the blending department has an ending work in process of 4,000 units which account for 60% of the materials, labor and overhead. Period output for completion and transfer (to another department in the manufacturing process) is not specified in this example but is added to the calculation.

Show the code
units = 4000
percent = 0.60
period_output = 0

equivalent_units = units * percent + period_output
print(f"Equivalent units of production = {equivalent_units} units")
Equivalent units of production = 2400.0 units

4.2.4 Quick example

A company has start of process and end of process, where all raw materials for production are accounted for at the beginning of manufacturing, therefore shows materials 100% accounted for while conversion costs is part of the manufacturing process.

  • wip = work in process
stage units materials conversion costs
wip June 1 100,000 100% 70%
started production 800,000
total units 900,000
units transferred 700,000
wip June 30 200,000 100% 70%
total units 900,000
Show the code
units = 200e3
percent = [1.0, 0.6]
period_output = 700e3

equivalent_units = (units * percent[0]) + period_output
equivalent_units_2 = (units * percent[1]) + period_output

print("Equivalent units of production (materials) = {:,} units".format(equivalent_units))
print("Equivalent units of production (conversion costs) = {:,} units".format(equivalent_units_2))
Equivalent units of production (materials) = 900,000.0 units
Equivalent units of production (conversion costs) = 820,000.0 units

4.3 Production cost report

A production cost report is the key document management uses to understand the activities in a department, showing the production quantities and cost data for each department. Requirements for this report are:

  • calculation for physical unit flow
  • calculate the equivalent units of production
  • calculate the unit production costs
  • prepare the cost reconciliation schedule

This section will continue with the company used in previous examples. This example company makes breakfast pancakes which has different departments.

4.3.1 Physical flow

Physical units are the actual units to be accounted for during a period, regardless of any work performed. To keep track of these units, add units that got started or transferred into production during the time period, these units are called total units to be accounted for.

Using a nested list that has 2 data dictionaries to hold data about the company’s mixing department. This data object looks like a JSON data object, you can convert nested lists into dataframes but we will just use this nested list for the functions as this is flexible and looks similar to a Excel spreadsheet (in a way).

Normally we have seen simple dictionaries where there is a single key and a value pair, but here we have a list that stores 2 dictionaries, each which has a single key then the value is a dictionary instead of a single value. To access elements from a nested list array and get items from a dictionary, you need to slice the list, then specify which dictionary key, then the name of the nested dictionary key to get the value.

  • mixing_data has 2 elements which are both dictionaries [ {}, {} ], remember zero index
  • name the dictionary key [0]['units']
  • name the nested dictionary key [0]['units']['wip_start'] to get the value
Show the code
mixing_data = {
  'units': {
    'wip_start': 100e3,                   # June 1
    'direct_materials_percent': 1,
    'conversion_costs_percent': 0.70,
    'units_in_production': 800e3,
    'units_completed_transferred': 700e3,
    'wip_end':200e3,                       # June 30
    'wip_end_materials_percent': 1,
    'wip_end_conversion_costs_percent':  0.60
    },
  'costs': {
    'wip_start_direct_materials': 50e3,
    'wip_start_conversion_costs': 35e3,
    'cost_wip_start': 85e3,
    'costs_direct_materials': 400e3,
    'costs_conversion_costs': 170e3,
    'costs_incurred': 570e3
    }  
}

Physical unit flow calculation

Show the code
def physical_flow( dict):
  
  # units to be accounted for = wip_start + started_transferred
  tot_units = dict['units']['wip_start'] + dict['units']['units_in_production']
  # units accounted for = completed_transferred + wip_end
  units_acc = dict['units']['units_completed_transferred'] + dict['units']['wip_end']
  
  print("-- Physical Unit Flow --")
  print("Total units accounted for  ........ {:,}".format(units_acc))
  print("Total units ....................... {:,}".format(tot_units))
  

physical_flow( mixing_data )
-- Physical Unit Flow --
Total units accounted for  ........ 900,000.0
Total units ....................... 900,000.0

4.3.2 Equivalent units: Production

After determining the physical flow of units next step is to measure the department’s productivity in equivalent units of production. For this example company, two calculations are required as there is mixing materials and the conversion costs.

Show the code
def equivalent_units( dict ):
  
  units = list(dict['units'].values())
 
  wip_end = units[-3] 
  wip_end_materials = units[-2]
  units_completed_transferred = units[-4]
  wip_end_conversion_costs_percent = units[-1]
  materials_equiv_cost = (wip_end * wip_end_materials) + units_completed_transferred
  conv_costs_equiv_cost = (wip_end * wip_end_conversion_costs_percent) + units_completed_transferred

  print("-- Equivalent Units --")
  print("Equivalent units (materials) .................... {:,}".format(materials_equiv_cost))
  print("Equivalent units (conversion costs) ............. {:,}".format(conv_costs_equiv_cost))
  
  
equivalent_units(mixing_data)
-- Equivalent Units --
Equivalent units (materials) .................... 900,000.0
Equivalent units (conversion costs) ............. 820,000.0

4.3.3 Unit Production Costs

Now we need to calculate the unit production costs which are costs expressed in terms of equivalent units of production. If equivalent units of production are different for materials and for conversion costs, then 3 unit costs are calculated:

  • material costs
  • conversion costs
  • total manufacturing cost

Calculation of the total materials cost for pancakes

Show the code
def production_costs( dict ):
  
  units = list(dict['units'].values())

  wip_end = units[-3]
  wip_end_materials_percent = units[-2]
  units_completed_transferred = units[4]
  
  materials_equiv_cost = (wip_end * wip_end_materials_percent) + units_completed_transferred
  
  costs = list(dict['costs'].values())
  
  wip_start_conversion_costs = costs[0]
  costs_conversion_costs = costs[-2]
  
  tot_material_cost =  wip_start_conversion_costs + costs_conversion_costs
  unit_material_cost = round(tot_material_cost / materials_equiv_cost, 2)
  tot_conv_cost = wip_start_conversion_costs + costs_conversion_costs
  conv_costs_equiv_cost = (wip_end * units[-1]) + units_completed_transferred
  unit_conv_cost = round(tot_conv_cost / conv_costs_equiv_cost, 2)
  tot_manuf_cpu = unit_material_cost + unit_conv_cost
  transf_out = units_completed_transferred * tot_manuf_cpu
  
  tot_cost_recon = (wip_end * unit_material_cost) + ((wip_end * units[-1]) * unit_conv_cost)
  
  recon_sched = transf_out + tot_cost_recon
  
  print("-- Unit Production Costs --")
  print("Total materials costs  ..................... ${:,}".format(tot_material_cost))
  print("Unit materials cost  ....................... ${:,}\n".format(unit_material_cost))
  print("Total conversion costs ..................... ${:,}".format(tot_conv_cost))
  print("Unit conversion costs  ..................... ${:,}".format(unit_conv_cost))
  print("Total manufacturing cost per unit  ......... ${:,}\n".format(tot_manuf_cpu))
  print("Cost reconciliation schedule ............... ${:,}".format(recon_sched))
  

production_costs( mixing_data )
-- Unit Production Costs --
Total materials costs  ..................... $220,000.0
Unit materials cost  ....................... $0.24

Total conversion costs ..................... $220,000.0
Unit conversion costs  ..................... $0.27
Total manufacturing cost per unit  ......... $0.51

Cost reconciliation schedule ............... $437,400.0

4.3.4 Cost Reconciliation Schedule

Now is the stage where the cost of goods transferred out of one department and into another are determined.

Show the code
def cost_reconciliation( dict ):
  
  costs = list(dict['costs'].values())
  
  tot_cost = costs[2] + costs[-1]
  
  print("-- Cost Reconciliation --")
  print("Total costs charged to department ........... ${:,}".format(tot_cost))
  
cost_reconciliation( mixing_data )
-- Cost Reconciliation --
Total costs charged to department ........... $655,000.0

For this company example, $655,000 were the costs for the mixing department.

4.3.5 Production Cost Report

The production cost report is an internal document use by management that shows the production quantity and cost data for a department. There are 4 steps in preparing a production cost report:

  • prepare a physical unit schedule
  • calculate the equivalent units
  • calculate the unit costs
  • prepare a cost reconciliation schedule

This book is showing only Python code and output, but since accounting is in the business sector, you will obviously want to use your Python skills and convert your own .py file into a Microsoft Word document or presentation. By knowing Python you can extend these skills to using libraries such as python-docx which makes and reads Word Documents. Once you know Python you can usually type in Google or any other web search engine for “python + search terms” and will get results. Python code now is what you are seeing, but on your own you can make your python files into reproducible professional documents, dashboards and even web apps.

Since each of the steps has already been calculated above using functions, we can just copy our call our functions and get the output of the calculations.

Show the code
print("-- PRODUCTION COST REPORT --")
print('')
physical_flow(mixing_data)
print('')
equivalent_units(mixing_data)
print('')
production_costs( mixing_data)
print('')
cost_reconciliation(mixing_data)
-- PRODUCTION COST REPORT --

-- Physical Unit Flow --
Total units accounted for  ........ 900,000.0
Total units ....................... 900,000.0

-- Equivalent Units --
Equivalent units (materials) .................... 900,000.0
Equivalent units (conversion costs) ............. 820,000.0

-- Unit Production Costs --
Total materials costs  ..................... $220,000.0
Unit materials cost  ....................... $0.24

Total conversion costs ..................... $220,000.0
Unit conversion costs  ..................... $0.27
Total manufacturing cost per unit  ......... $0.51

Cost reconciliation schedule ............... $437,400.0

-- Cost Reconciliation --
Total costs charged to department ........... $655,000.0

The wonderful thing about functions is that you spend the time making them, but once you do you benefit from it. Making this report output was really easy, just calling the functions already created.

4.3.6 Cost Report: other

This example company that makes pancakes has 3 departments: mixing, baking and freezing then packaging. The costs of completed units from the mixing department are treated as material costs in the baking department. Transferred-in cost is the component treated the same way as any other cost component in the equivalent units of production and the cost per equivalent unit of production.

Cost data for the freezing and packaging department. By copying the list object mixing_data, we can reuse the structure for new values for the packaging department. Changes do need to be made to this nested list object, but overall less work involved.

Show the code
freezing_data = {
    'units': {
        'wip_start': 200e3,                   # June 1
        'transferred_in_percent_complete': 1,
        'direct_materials_percent_complete': 0,
        'conversion_percent_complete': 0.90,
        'units_completed_transferred': 700e3,
        'units_in_production_complete': 800e3,
        'wip_end':  100e3,                       # June 30
        'wip_end_transf_complete_prct': 1,
        'wip_end_direct_material_prct':  0,
        'wip_end_conversion_complete': 0.75
      },
    'costs': {
        'wip_start_direct_materials': 170e3,
        'transferred_in_percent_complete': 1,
        'direct_materials_percent_complete': 0,
        'direct_materials_complete': 0,
        'conversion_percent_complete': 0.90,
        'conversion_complete': 36e3,
        'cost_wip_start': 206e3,
        'costs_transferred_in': 595e3,
        'costs_direct_materials': 120e3,
        'costs_conversion_costs': 139e3,
        'total_costs': 854e3,
      }  
}

4.3.7 Production Cost Report

A function for production cost report using a data dictionary.

Show the code
def prod_cost_report( dict ):
  
  print(" --- Production Cost Report ---\n")
  units = list(dict['units'].values()) 
  costs = list(dict['costs'].values())
  
  # -- units_in_production_complete + wip_end
  units_acc_transf = units[5] + units[6]
  # -- wip_start + units_completed_transferred
  tot_units = units[0] + units[4]
  # -- 
  units_in_production_complete = units[5]
  direct_materials_percent_complete = units[2]
  
  units_acc_materials = units_in_production_complete + direct_materials_percent_complete 
  
  wip_end_conversion_complete= units[-1]
  
  prct = units[6]  * wip_end_conversion_complete
  units_acc_conv = units_in_production_complete + prct
  
  costs_transferred_in = costs[-4]
  cost_transf = units[-2] + costs_transferred_in
  
  # direct_materials_complete + costs_direct_materials
  cost_materials = costs[3] + costs[8]
  # conversion_complete + costs_conversion_costs
  cost_conv = costs[5] + costs[-2]
  tot_unit_costs = cost_transf + cost_materials + cost_conv
  
  unit_cost_transf = round(cost_transf / units_acc_transf, 2)
  unit_cost_materials = round(cost_materials / units_acc_materials, 2)
  unit_costs_conv = round(cost_conv /units_acc_conv , 2)
  
  tot_unit_costs_2 = unit_cost_transf + unit_cost_materials + unit_costs_conv
  # cost_wip_start + total_costs
  total_costs = costs[6] + costs[-1]
  
  cost_acc_transf = tot_unit_costs_2 * units_acc_materials
  wip_end_transf = units[6] * unit_cost_transf
  # wip_end_direct_material_prct * unit_cost_materials
  wip_end_material = units[-2] * unit_cost_materials 
  wip_end_conv =  prct * unit_costs_conv
  tot_cost_recon = wip_end_transf + wip_end_material + wip_end_conv + cost_acc_transf

  
  print("-- Physical Unit Flow --")
  print("Total units ......................................... {:,}".format(tot_units))
  print("Total units accounted for transferred ............... {:,}".format(units_acc_transf))
  print("Total units accounted for direct materials .......... {:,}".format(units_acc_materials))
  print("Total units accounted for conversion costs .......... {:,}".format(units_acc_conv))
    

  print("\n-- Unit Costs --")
  print("Total unit costs transferred ....................... ${:,}".format(cost_transf))
  print("Total unit costs direct materials .................. ${:,}".format(cost_materials))
  print("Total unit conversion costs ........................ ${:,}".format(cost_conv))
  print("Total unit costs ................................... ${:,}".format(tot_unit_costs))
    
  print("Unit costs transferred ............................. ${:,}".format(unit_cost_transf))
  print("Unit costs direct materials ........................ ${:,}".format(unit_cost_materials))
  print("Unit conversion costs .............................. ${:,}".format(unit_costs_conv))
  print("Unit costs total ................................... ${:,}".format(tot_unit_costs_2))    
  print("Total costs ........................................ ${:,}".format(total_costs))
    
  print("\n --- Cost Reconciliation Schedule ---")
  print("Costs accounted for transferred ................... ${:,}".format(cost_acc_transf))
  print("Work in process end transferred ................... ${:,}".format(wip_end_transf))    
  print("Work in process end materials ..................... ${:,}".format(wip_end_material))
  print("Work in process end conversion costs .............. ${:,}".format(wip_end_conv))
  print("Total costs accounted for ......................... ${:,}".format(tot_cost_recon))
    


#-----
prod_cost_report( freezing_data )
 --- Production Cost Report ---

-- Physical Unit Flow --
Total units ......................................... 900,000.0
Total units accounted for transferred ............... 900,000.0
Total units accounted for direct materials .......... 800,000.0
Total units accounted for conversion costs .......... 875,000.0

-- Unit Costs --
Total unit costs transferred ....................... $595,000.0
Total unit costs direct materials .................. $120,000.0
Total unit conversion costs ........................ $175,000.0
Total unit costs ................................... $890,000.0
Unit costs transferred ............................. $0.66
Unit costs direct materials ........................ $0.15
Unit conversion costs .............................. $0.2
Unit costs total ................................... $1.01
Total costs ........................................ $1,060,000.0

 --- Cost Reconciliation Schedule ---
Costs accounted for transferred ................... $808,000.0
Work in process end transferred ................... $66,000.0
Work in process end materials ..................... $0.0
Work in process end conversion costs .............. $15,000.0
Total costs accounted for ......................... $889,000.0

4.4 Equivalent Units: FIFO

FIFO is first in, first out method for calculating equivalent units. The FIFO method for costs assumes that the work in process completes before new work is initiated. Equivalent units for FIFO are:

  • process inventory is finished work in units
  • units in production have been completed
  • work started but not complete is partially completed, perpetually work in process

The company for this example makes home furnishings.

Show the code
fifo_data = {
    'units_start': {
      'wip_start_complete_percent': 0.40,
      'wip_start_complete': 500,
      'units_transf_prod': 8e3,
      'total_units':  8500
      },
    'units_end': {
      'wip_end_complete_transf': 8100,
      'wip_end_complete_percent': 0.75,
      'wip_end': 400,
      'total_units':  8500
      }
}

Equivalent units

Show the code
def fifo_method( dict):
  
  start = list(dict['units_start'].values())
  end = list(dict['units_end'].values())
  
  # wip_start_complete , wip_start_complete_percent
  begin_inv =  start[1] * (1 - start[0] )
  
  # wip_end_complete_transf - wip_start_complete
  units_started_finished = end[0] - start[1]
  
  # wip_end * wip_end_complete_percent
  equiv_units = end[2] * end[1]
  
  tot_equiv = begin_inv + units_started_finished + equiv_units
  
  print("-- Equivalent Units: FIFO --")
  print("beginning inventory required to complete ............ {:,} units".format(begin_inv))
  print("units started & completed ........................... {:,} units".format(units_started_finished ))
  print("equivalent units .................................... {:,} units".format(equiv_units ))
  print("Total equivalent units .............................. {:,} units".format(tot_equiv ))
  
fifo_method(fifo_data)
-- Equivalent Units: FIFO --
beginning inventory required to complete ............ 300.0 units
units started & completed ........................... 7,600 units
equivalent units .................................... 300.0 units
Total equivalent units .............................. 8,200.0 units