総合原価計算をpythonで解く 〜8回目で合格を目指す簿記2級③〜
別にpythonでやる必要は全くないのだが、pythonを勉強してる関係で、手を動かすためにやってみた。こういうことをすると、両方の勉強になってよい。ちょうど次回の基本情報からはpythonが出題されるので、こちらの対策としても意味があるのではないかと思う。
これは、以前に総合原価計算の要素を変数化できるのではないかという記事を書いたときからやってみたいと思っていた。第153回の組別総合原価計算が題材としてちょうどよさそうだったので、年末年始の暇な時間を使って挑戦したところ、うまくいった。
おおまかなイメージ
仕掛品、製品、総合原価計算書、損益計算書については、クラスオブジェクトを作成する。組別なのでAとBに分け、特に仕掛品と製品については、期首、当月、完成、期末などに分けて生成する。
思ったより縦長になってしまった感がある。これは自分が手続き指向の言語を日常取り扱っているせいだろうか。オブジェクト指向は慣れていないと難しい。
実際のコーディングは、次の通りになった。変数名がダサいから、後でこっそり直しておこう。
class 仕掛品
#-- 仕掛品
class wip():
def __init__(self, mat, add, prt, qty):
self.mat = mat # 材料費率
self.add = add # 加工費率
self.prt = prt # 加工進捗
self.qty = qty # 数量
# 総合原価の算出
def totalcost(self, mat, add, prt):
return int( mat * self.qty ) + int( add * self.qty * prt / 100 )
# 加工費の配賦
def alrate(self, cc, part, whole):
return cc * part / whole
# 材料費率の算出
def calcmat(self, mat, qty):
self.mat = int(mat / qty)
# 加工費率の算出
def calcadd(self, add, qty):
self.add = int(add / qty)
class 製品
#-- 製品
class product():
def __init__(self, total, qty):
self.total = total # 総合原価
self.qty = qty # 数量
class 総合原価計算書
#-- 総合原価計算書
class costreport():
def __init__(self, price, mid, beg, end, cost):
self.price = price # 販売価格
self.mid = mid # 当期製造費用
self.beg = beg # 期首
self.end = end # 期末
self.cost = cost # 原価
# 当期製品製造原価の算出
def calccost(self):
self.cost = int(self.beg + self.mid - self.end)
# 販売
def sale(self, qty):
return int(self.price * qty)
class 損益計算書
#-- 損益計算書
class profitreport():
def __init__(self, sales, cost, selling, general):
self.sales = sales # 売上高
self.cost = cost # 売上原価
self.selling = selling # 販売費
self.general = general # 一般管理費
# 売上原価の算出
def calccost(self, beg, mid, end):
# 期首製品棚卸高 + 当期製品製造原価 - 期末製品棚卸高
self.cost = beg + mid - end
# 売上総利益の算出
def gross(self):
# 売上高 - 売上原価
return self.sales - self.cost
# 営業利益の算出
def income(self):
# 売上総利益 - ( 販売費 + 一般管理費 )
return self.gross() - (self.selling + self.general)
# 解答
def answer(self):
print('【損益計算書】\n 売上高 :{} \n 売上原価 :{} \n 売上総利益:{}'
.format(self.sales, self.cost, self.gross())
与えられたデータを変数に落とし込む
#-- 1.月初・月末在庫量
# 月初在庫量(仕掛品)
aw_beg = wip(0, 0, 100, 0)
bw_beg = wip(0, 0, 100, 0)
# 月初在庫量(製品)
ap_beg = product(0, 5000)
bp_beg = product(0, 2000)
# 月末在庫量(仕掛品)
aw_end = wip(0, 0, 100, 0)
bw_end = wip(0, 0, 30, 2000)
# 月末在庫量(製品)
ap_end = product(0, 3000)
bp_end = product(0, 3000)
#-- 2.当月の生産・販売データ
# 完成品
aw_cost = wip(0, 0, 100, 52000)
bw_cost = wip(0, 0, 100, 29000)
# 販売品
ap_cost = product(0, 54000)
bp_cost = product(0, 28000)
# 販売単価
acr = costreport(120, 0, 0, 0, 0)
bcr = costreport(140, 0, 0, 0, 0)
#-- 3.当月の原価データ
# 直接材料費
aw_mid = wip(1404000, 0, 100, 0)
bw_mid = wip(1085000, 0, 100, 0)
# 加工費
cc = 1312800
# 月初製品原価
ap_beg.total = 220000
bp_beg.total = 112000
#-- 4. 当月の機械稼働時間
a_time = 16250
b_time = 11100
計算を開始する
#-- 計算開始
# 加工費の配賦
aw_mid.add = aw_mid.alrate(cc, a_time, (a_time + b_time))
bw_mid.add = bw_mid.alrate(cc, b_time, (a_time + b_time))
# 単位原価の計算
aw_end.calcmat(aw_mid.mat, (aw_cost.qty - aw_beg.qty + aw_end.qty))
aw_end.calcadd(aw_mid.add, (aw_cost.qty - aw_beg.qty + aw_end.qty))
bw_end.calcmat(bw_mid.mat, (bw_cost.qty - bw_beg.qty + bw_end.qty))
bw_end.calcadd(bw_mid.add,
(bw_cost.qty - bw_beg.qty + (bw_end.qty * 30/100)))
# 期末製品棚卸高の計算
ap_end.total = (aw_end.mat + aw_end.add) * ap_end.qty
bp_end.total = (bw_end.mat + bw_end.add) * bp_end.qty
# 総合原価計算表の作成(A)
acr.beg = aw_beg.totalcost(aw_beg.mat, aw_beg.add, aw_beg.prt)
acr.mid = aw_mid.mat + aw_mid.add
acr.end = aw_end.totalcost(aw_end.mat, aw_end.add, aw_end.prt)
acr.calccost()
# 総合原価計算表の作成(B)
bcr.beg = bw_beg.totalcost(bw_beg.mat, bw_beg.add, bw_beg.prt)
bcr.mid = bw_mid.mat + bw_mid.add
bcr.end = bw_end.totalcost(bw_end.mat, bw_end.add, bw_end.prt)
bcr.calccost()
# 損益計算書の作成
pr = profitreport(0, 0, 0, 0)
pr.sales = acr.sale(ap_cost.qty) + bcr.sale(bp_cost.qty)
pr.calccost(ap_beg.total + bp_beg.total,
acr.cost + bcr.cost,
ap_end.total + bp_end.total)
pr.answer()
【損益計算書】
売上高 :10400000
売上原価 :3768000
売上総利益:6632000
結果が正しく出力された。