def approve_cash_receipt(request): params = json.loads(request.body) dct = {} if params.get('id'): voucher = CashReceipt.objects.get(id=params.get('id')) else: dct['error_message'] = 'Voucher needs to be saved before being approved!' return HttpResponse(json.dumps(dct), mimetype="application/json") cash_account = Account.objects.get(name='Cash Account', company=request.company) discount_expenses_account = Account.objects.get(name='Discount Expenses', company=request.company) if voucher.rows.all().count() > 0: total_receipt = sum(row.receipt for row in voucher.rows.all()) total_discount = sum(row.discount for row in voucher.rows.all()) total = total_receipt + total_discount set_transactions(voucher, voucher.receipt_on, ['dr', cash_account, total_receipt], ['dr', discount_expenses_account, total_discount], ['cr', voucher.party.customer_account, total] ) else: set_transactions(voucher, voucher.receipt_on, ['dr', cash_account, voucher.amount], ['cr', voucher.party.customer_account, voucher.amount] ) return HttpResponse(json.dumps(dct), mimetype="application/json")
def approve_cash_payment(request): params = json.loads(request.body) dct = {} if params.get('id'): voucher = CashPayment.objects.get(id=params.get('id')) else: dct['error_message'] = 'Voucher needs to be saved before being approved!' return HttpResponse(json.dumps(dct), mimetype="application/json") cash_account = Account.objects.get(name='Cash Account', company=request.company) discount_income_account = Account.objects.get(name='Discount Income', company=request.company) if voucher.rows.all().count() > 0: total_payment = sum(row.payment for row in voucher.rows.all()) total_discount = sum(row.discount for row in voucher.rows.all()) total = total_payment + total_discount set_transactions(voucher, voucher.payment_on, ['dr', voucher.party.supplier_account, total], ['cr', discount_income_account, total_discount], ['cr', cash_account, total_payment] ) else: set_transactions(voucher, voucher.payment_on, ['dr', cash_account, voucher.amount], ['cr', voucher.party.supplier_account, voucher.amount] ) voucher.status = 'Approved' voucher.save() return HttpResponse(json.dumps(dct), mimetype="application/json")
def electronic_fund_transfer_out(request, id=None): if id: payment = get_object_or_404(ElectronicFundTransferOut, id=id, company=request.company) scenario = 'Update' else: payment = ElectronicFundTransferOut(date=date.today()) scenario = 'New' if request.POST.get('action') == 'Approve': set_transactions(payment, payment.date, ['cr', payment.bank_account, payment.amount], ['dr', payment.beneficiary, payment.amount], ) payment.status = 'Approved' payment.save() return redirect(reverse_lazy('update_electronic_fund_transfer_out', kwargs={'id': payment.id})) if request.POST: form = ElectronicFundTransferOutForm(request.POST, request.FILES, instance=payment, company=request.company) if form.is_valid(): payment = form.save(commit=False) payment.company = request.company print request.POST if 'attachment' in request.FILES: payment.attachment = request.FILES['attachment'] payment.status = 'Unapproved' payment.save() return redirect(reverse_lazy('update_electronic_fund_transfer_out', kwargs={'id': payment.id})) else: form = ElectronicFundTransferOutForm(instance=payment, company=request.company) return render(request, 'electronic_fund_transfer_out.html', {'form': form, 'scenario': scenario})
def approve_invoice(request): params = json.loads(request.body) dct = {} if params.get('id'): voucher = Invoice.objects.get(id=params.get('id')) else: dct['error_message'] = 'Voucher needs to be saved before being approved!' return HttpResponse(json.dumps(dct), mimetype="application/json") # cash_account = Account.objects.get(name='Cash Account', company=request.company) sales_tax_account = Account.objects.get(name='Sales Tax', company=request.company) for row in voucher.particulars.all(): # print row ##sales-cr;tax-cr;cash-dr # TODO reduce db query by sending tax rate from client tax_percent = row.tax_scheme.percent wo_discount = row.quantity * row.unit_price amt = wo_discount - ((row.discount * wo_discount) / 100) if voucher.tax == 'inclusive': tax_amount = amt * (tax_percent / (100 + tax_percent)) net_amount = amt elif voucher.tax == 'exclusive': tax_amount = amt * (tax_percent / 100) net_amount = amt - tax_amount elif voucher.tax == 'no': tax_amount = 0 net_amount = amt sales_account = row.item.sales_account set_transactions(row, voucher.date, ['dr', voucher.party.customer_account, amt], ['cr', sales_account, net_amount], ['cr', sales_tax_account, tax_amount], ) voucher.status = 'Approved' voucher.save() return HttpResponse(json.dumps(dct), mimetype="application/json")
def cash_deposit(request, id=None): if id: receipt = get_object_or_404(BankCashDeposit, id=id, company=request.company) scenario = 'Update' else: receipt = BankCashDeposit(date=date.today(), company=request.company) scenario = 'New' if request.POST.get('action') == 'Approve': set_transactions(receipt, receipt.date, ['dr', receipt.bank_account, receipt.amount], ['cr', receipt.benefactor, receipt.amount], ) receipt.status = 'Approved' receipt.save() return redirect(reverse_lazy('update_cash_deposit', kwargs={'id': receipt.id})) if request.POST: form = BankCashDepositForm(request.POST, initial={'voucher_no': 20}, instance=receipt, company=request.company) if form.is_valid(): receipt = form.save(commit=False) receipt.company = request.company if 'attachment' in request.FILES: receipt.attachment = request.FILES['attachment'] receipt.status = 'Unapproved' receipt.save() return redirect(reverse_lazy('update_cash_deposit', kwargs={'id': receipt.id})) else: form = BankCashDepositForm(instance=receipt, company=request.company) return render(request, 'cash_deposit.html', {'form': form, 'scenario': scenario})
def approve_fixed_asset(request): params = json.loads(request.body) dct = {} if params.get('id'): voucher = FixedAsset.objects.get(id=params.get('id')) else: dct['error_message'] = 'Voucher needs to be saved before being approved!' return HttpResponse(json.dumps(dct), mimetype="application/json") for row in voucher.rows.all(): set_transactions(row, voucher.date, ['dr', row.asset_ledger, row.amount], ['cr', voucher.from_account, row.amount]) voucher.status = 'Approved' voucher.save() return HttpResponse(json.dumps(dct), mimetype="application/json")
def create(self, validated_data): rows_data = validated_data.pop('rows') sv = SalaryVoucher.objects.create(**validated_data) for row_data in rows_data: data = dict(row_data) row = SalaryVoucherRow() row.employee = data.get('employee') row.sn = data.get('sn',0) row.amount = data.get('amount',0) row.paid_date = data.get('paid_date', datetime.datetime.today) row.start_date = data.get('start_date', datetime.datetime.today) row.last_date = data.get('last_date', datetime.datetime.today) row.salary_voucher = sv row.save() set_transactions(row, sv.date, ['dr', Account.objects.get_or_create(name='Salaries Expenses')[0],row.amount]) set_transactions(row, sv.date, ['cr', Account.objects.get_or_create(name='Cash')[0], row.amount]) return sv
def approve_purchase(request): params = json.loads(request.body) dct = {} if params.get('id'): voucher = PurchaseVoucher.objects.get(id=params.get('id')) else: dct['error_message'] = 'Voucher needs to be saved before being approved!' return HttpResponse(json.dumps(dct), mimetype="application/json") for row in voucher.particulars.all(): wo_discount = row.quantity * row.unit_price amt = wo_discount - ((row.discount * wo_discount) / 100) set_transactions(row, voucher.date, ['dr', voucher.party.supplier_account, amt], ['cr', row.item.purchase_account, amt], ) voucher.status = 'Approved' voucher.save() return HttpResponse(json.dumps(dct), mimetype="application/json")
def approve_cheque_deposit(request): params = json.loads(request.body) dct = {} if params.get('id'): voucher = ChequeDeposit.objects.get(id=params.get('id')) else: dct['error_message'] = 'Voucher needs to be saved before being approved!' return HttpResponse(json.dumps(dct), mimetype="application/json") bank_account = Account.objects.get(id=params.get('bank_account')) benefactor = Account.objects.get(id=params.get('benefactor')) for row in voucher.rows.all(): set_transactions(row, params.get('date'), ['dr', bank_account, row.amount], ['cr', benefactor, row.amount], ) voucher.status = 'Approved' voucher.save() return HttpResponse(json.dumps(dct), mimetype="application/json")
def approve_journal_voucher(request): params = json.loads(request.body) dct = {'rows': []} if params.get('id'): voucher = JournalVoucher.objects.get(id=params.get('id')) else: dct['error_message'] = 'Voucher needs to be saved before being approved!' return HttpResponse(json.dumps(dct), mimetype="application/json") for row in voucher.rows.all(): if row.type == 'Dr': set_transactions(row, voucher.date, ['dr', row.account, row.dr_amount], ) else: set_transactions(row, voucher.date, ['cr', row.account, row.cr_amount], ) dct['rows'].append(row.id) voucher.status = 'Approved' voucher.save() return HttpResponse(json.dumps(dct), mimetype="application/json")
def approve_group_payroll_voucher(request): params = json.loads(request.body) dct = {} if params.get('id'): voucher = GroupPayroll.objects.get(id=params.get('id')) else: dct['error_message'] = 'Voucher needs to be saved before being approved!' return HttpResponse(json.dumps(dct), mimetype="application/json") payroll_tax = Account.objects.get(name='Payroll Tax', company=request.company) for row in voucher.rows.all(): amount = row.rate_day * row.employee.get_unpaid_days() + row.rate_hour * row.employee.get_unpaid_hours() + row.rate_ot_hour * row.employee.get_unpaid_ot_hours() net_amount = amount - row.payroll_tax set_transactions(row, voucher.date, ['dr', row.pay_head, amount], ['cr', payroll_tax, row.payroll_tax], ['cr', row.employee.account, net_amount] ) row.employee.set_paid() voucher.status = 'Approved' voucher.save() return HttpResponse(json.dumps(dct), mimetype="application/json")
def save_entry(request): params = json.loads(request.body) dct = {'invalid_attributes': {}, 'saved': {}} values = { 'company': request.company, 'entry_no': params.get('entry_no') } if params.get('id'): the_entry = Entry.objects.get(id=params.get('id')) else: the_entry = Entry() # if not created: if params.get('rows') != [{}] or params.get('deleted_rows') != []: the_entry = save_model(the_entry, values) dct['id'] = the_entry.id model = EntryRow payroll_tax_account = Account.objects.get(name='Payroll Tax', company=request.company) for index, row in enumerate(params.get('rows')): if invalid(row, ['pay_heading', 'account_id', 'amount']): continue if row.get('tax') == '': row['tax'] = 0 values = {'sn': index + 1, 'employee_id': row.get('account_id'), 'pay_heading_id': row.get('pay_heading'), 'tax': row.get('tax'), 'remarks': row.get('remarks'), 'hours': row.get('hours'), 'amount': row.get('amount'), 'entry': the_entry} submodel, created = model.objects.get_or_create(id=row.get('id'), defaults=values) net_amount = float(row.get('amount')) - float(row.get('tax')) set_transactions(submodel, submodel.created, ['dr', Account.objects.get(id=row.get('pay_heading'), company=request.company), row.get('amount')], ['cr', Account.objects.get(id=row.get('account_id'), company=request.company), net_amount], ['cr', payroll_tax_account, row.get('tax')], ) if not created: submodel = save_model(submodel, values) dct['saved'][index] = submodel.id delete_rows(params.get('deleted_rows'), model) return HttpResponse(json.dumps(dct), mimetype="application/json")
def update(self, instance, validated_data): rows_data = validated_data.pop('rows') sv = SalaryVoucher.objects.get(pk=instance.id) sv.date = validated_data.pop('date',datetime.datetime.today) sv.voucher_no = validated_data.pop('voucher_no',1) sv.site = validated_data.pop('site') sv.save() for row_data in rows_data: data = dict(row_data) id = data.get('id', '') # if id: # row = SalaryVoucherRow.objects.get(pk=id) # row.employee = data.get('employee') # row.sn = data.get('sn',1) # row.amount = data.get('amount',0) # row.paid_date = data.get('paid_date', datetime.datetime.today) # row.start_date = data.get('start_date',datetime.datetime.today) # row.last_date = data.get('last_date', datetime.datetime.today) # row.salary_voucher = sv # row.save() # set_transactions(row, sv.date, ['dr', Account.objects.get_or_create(name='Salaries Expenses')[0], row.amount]) # set_transactions(row, sv.date, ['cr', Account.objects.get_or_create(name='Cash')[0], row.amount]) # row = SalaryVoucherRow() # else: if not id: row = SalaryVoucherRow() row.employee = data.get('employee') row.sn = data.get('sn',1) row.amount = data.get('amount',0) row.paid_date = data.get('paid_date',datetime.datetime.today) row.start_date = data.get('start_date',datetime.datetime.today) row.last_date = data.get('last_date',datetime.datetime.today) row.salary_voucher = sv row.save() set_transactions(row, sv.date, ['dr', Account.objects.get_or_create(name='Salaries Expenses')[0],row.amount]) set_transactions(row, sv.date, ['cr', Account.objects.get_or_create(name='Cash')[0], row.amount]) return sv
def account_form(request, id=None): obd = Account.objects.get(name='Opening Balance Difference', company=request.company) if id: account = get_object_or_404(Account, id=id, company=request.company) scenario = 'Update' else: account = Account() scenario = 'Create' for query in request.GET: setattr(account, query, request.GET[query]) if request.POST: form = AccountForm(data=request.POST, instance=account, company=request.company, scenario=scenario) if form.is_valid(): opening_dr = form.cleaned_data.get('opening_dr') opening_cr = form.cleaned_data.get('opening_cr') item = form.save(commit=False) item.company = request.company item.save() form.save_m2m() if scenario == 'Create' or scenario == 'Update': if not opening_dr == 0: set_transactions(item, date.today(), ['dr', item, form.cleaned_data['opening_dr']]) set_transactions(item, date.today(), ['cr', obd, form.cleaned_data['opening_dr']]) if not opening_cr == 0: set_transactions(item, date.today(), ['cr', item, form.cleaned_data['opening_cr']]) set_transactions(item, date.today(), ['dr', obd, form.cleaned_data['opening_cr']]) if request.is_ajax(): return render(request, 'callback.html', {'obj': AccountSerializer(item).data}) return redirect('/ledger/') else: form = AccountForm(instance=account, company=request.company, scenario=scenario) form.hide_field(request) if request.is_ajax(): base_template = 'modal.html' else: base_template = 'dashboard.html' return render(request, 'account_form.html', { 'scenario': scenario, 'form': form, 'base_template': base_template, })
def approve_individual_payroll_voucher(request): params = json.loads(request.body) dct = {} if params.get('id'): voucher = IndividualPayroll.objects.get(id=params.get('id')) else: dct['error_message'] = 'Voucher needs to be saved before being approved!' return HttpResponse(json.dumps(dct), mimetype="application/json") total_inclusion = 0 for row in voucher.inclusions.all(): set_transactions(row, voucher.date, ['dr', row.particular, row.amount] ) total_inclusion += row.amount total_exclusion = 0 for row in voucher.deductions.all(): set_transactions(row, voucher.date, ['cr', row.particular, row.amount] ) total_exclusion += row.amount diff = total_inclusion - total_exclusion if diff > 0: set_transactions(voucher, voucher.date, ['cr', voucher.employee.account, diff] ) elif diff < 0: set_transactions(voucher, voucher.date, ['dr', voucher.employee.account, diff * (-1)] ) voucher.employee.set_paid() voucher.status = 'Approved' voucher.save() return HttpResponse(json.dumps(dct), mimetype="application/json")
def approve(request): params = json.loads(request.body) dct = {} try: journal = DayJournal.objects.get(date=params.get('date'), company=request.company) except DayJournal.DoesNotExist: dct['error_message'] = 'Day Journal needs to be saved before being approved!' return HttpResponse(json.dumps(dct), mimetype="application/json") cash_account = Account.objects.get(name='Cash Account', company=request.company) card_account = Account.objects.get(name='Card Account', company=request.company) total_amount = 0 total_tax = 0 for cash_sale in journal.cash_sales.all(): tax_rate = cash_sale.sales_ledger.tax_rate or 0 tax_amount = cash_sale.amount * zero_for_none(tax_rate) / 100 net_amount = cash_sale.amount - tax_amount set_transactions(journal, journal.date, ['cr', cash_sale.sales_ledger, net_amount], ) total_amount += cash_sale.amount total_tax += tax_amount if journal.lotto_sales_dispenser_amount is None or journal.lotto_sales_dispenser_amount == 0: lotto_amount = journal.lotto_sales_register_amount else: lotto_amount = journal.lotto_sales_dispenser_amount total_amount += lotto_amount lotto_sales_ledger = Account.objects.get(name='Lotto Sales', company=request.company) lotto_tax_rate = lotto_sales_ledger.tax_rate lotto_tax = lotto_amount * zero_for_none(lotto_tax_rate) / 100 net_lotto_amount = lotto_amount - lotto_tax total_tax += lotto_tax set_transactions(journal, journal.date, ['cr', lotto_sales_ledger, net_lotto_amount], ) scratch_off_total = 0 for scratch_off in journal.lotto_detail.all(): day_close = scratch_off.day_close if day_close == 0: day_close = scratch_off.pack_count sales = (scratch_off.pack_count * zero_for_none(scratch_off.addition) + ( day_close - scratch_off.day_open)) * zero_for_none(scratch_off.rate) scratch_off_total += sales if scratch_off_total == 0: scratch_off_total = journal.scratch_off_sales_register_amount total_amount += scratch_off_total scratch_off_ledger = Account.objects.get(name='Scratch Off Sales', company=request.company) scratch_off_tax_rate = scratch_off_ledger.tax_rate scratch_off_tax = scratch_off_total * zero_for_none(scratch_off_tax_rate) / 100 net_scratch_off_amount = scratch_off_total - scratch_off_tax total_tax += scratch_off_tax set_transactions(journal, journal.date, ['cr', scratch_off_ledger, net_scratch_off_amount], ) set_transactions(journal, journal.date, ['cr', Account.objects.get(name='Sales Tax', company=request.company), total_tax], ) non_cash = 0 for card_sale in journal.card_sales.all(): commission_out = card_sale.commission_out or 0 net = card_sale.amount - commission_out set_transactions(journal, journal.date, ['dr', Account.objects.get(name='Commission Out', company=request.company), commission_out], ) set_transactions(journal, journal.date, ['dr', card_account, net], ) non_cash += card_sale.amount for cash_equivalent_sale in journal.cash_equivalent_sales.all(): set_transactions(journal, journal.date, ['dr', cash_equivalent_sale.account, cash_equivalent_sale.amount], ) non_cash += cash_equivalent_sale.amount set_transactions(journal, journal.date, ['dr', cash_account, total_amount - non_cash], ) for row in journal.summary_transfer.all(): # Cash - Dr ; Cheque - Dr ; Bill-payment - Cr; Card - Dr set_transactions(row, journal.date, ['dr', cash_account, zero_for_none(row.cash)], ['dr', card_account, zero_for_none(row.card)], ['dr', Account.objects.get(name='Cheque Account', company=request.company), zero_for_none(row.cheque)], ['cr', row.transfer_type, add(zero_for_none(row.cash), zero_for_none(row.card), zero_for_none(row.cheque))], ) for row in journal.vendor_payout.all(): if row.type == 'new': set_transactions(row, journal.date, ['dr', row.purchase_ledger, row.amount], ['cr', row.paid, row.amount], ) else: set_transactions(row, journal.date, ['dr', row.vendor, row.amount], ['cr', row.paid, row.amount], ) for row in journal.other_payout.all(): set_transactions(row, journal.date, ['dr', row.paid_to, row.amount], ['cr', row.paid, row.amount], ) #journal.status = 'Approved' #journal.save() return HttpResponse(json.dumps(dct), mimetype="application/json")