patient_id; $episode_id = $request->episode_id; $optical_ids_array = explode(",", $request->optical_ids); $order_ids_array = explode(",", $request->order_ids); $optical_subtotals_array = $request->optical_subtotal; $optical_amounts_array = $request->optical_amount; $optical_quantity_array = $request->quantity; $tag_id = 19; // update the track_receipt table to include created receipt $track_receipts = new TrackReceipt; $track_receipts->created_by = Auth::id(); $track_receipts->reason = 'Eye Glasses'; $track_receipts->save(); $receipt_number = sprintf("%04u", $track_receipts->id); // update the chart of accounts balance for each item for ($i = 0; $i < count($optical_ids_array); $i++) { $optical_account = get_name($optical_ids_array[$i], "id", "account_id", "eye_glasses"); $account_balance = get_name($optical_account, "id", "balance", "chart_of_accounts"); $optical = EyeGlasses::withTrashed()->find($optical_ids_array[$i]); $current_stock = $optical->pharmacy_stock; $new_stock = $current_stock - $optical_quantity_array[$i]; $optical->pharmacy_stock = $new_stock; /**** batch tracking */ $auto_calculated_batches_used = get_lab_batches_to_use_based_on_needed_quantity($optical_ids_array[$i], 7, $optical_quantity_array[$i],'pharmacy_stock'); foreach ($auto_calculated_batches_used as $batch_number => $batch_qty) { reduce_batch_item_from_pharmacy(7, $optical_ids_array[$i], $batch_number, $batch_qty, "ordered_eye_glasses", $order_ids_array[0], $patient_id); } /*** end batch tracking logic **/ $optical->update(); try { $new_balance = $account_balance + $optical_subtotals_array[$i]; ChartOfAccount::where(['id' => $optical_account])->update(['balance' => $new_balance]); } catch (\Exception $exception) { // raise error and go back to warn the person } } // check if donor discounts have been applied using null and insert into table if ($request->donor_discount) { DepositHelpers::donor_discount_details($patient_id, $episode_id, $receipt_number, $request->patient_discount_amount, $request->donor_to_pay, $request->hospital_to_pay_selected_discount, $request->donor_discount, $request->donor_id, $tag_id); } // add patient to debtors if balance is more than 0 if ($request->balance > 0) { DepositHelpers::debt($patient_id, $episode_id, $request->balance, $receipt_number, $tag_id); } // register one off discount if ($request->one_off_discount > 0) { DepositHelpers::patient_one_off_discount($patient_id, $episode_id, $request->one_off_discount, $tag_id, $request->one_off_discount_memo, $receipt_number); } // patient category discount flag $discount_status = 0; // check if patient has a discount amount more than zero and pay later is not available to them // this discount amount is represented as hospital to pay general if ($request->hospital_to_pay_general_discount > 0) { // change discount status $discount_status = 1; // add to discounts table DepositHelpers::discount($request->hospital_to_pay_general_discount, $patient_id, $episode_id, $receipt_number, 'Optical Items'); } // is_invoice flag for receipt purposes. Default is 0 for no $is_invoice = 0; // check if patient category is of type pay later to generate invoice for that category or to add to normal service payments table if ($request->pay_later == 1) { // change invoice flag to show that it is an invoice $is_invoice = 1; // create a new invoice DepositHelpers::patient_category_invoice( $request->patient_category_id, $patient_id, $episode_id, implode(',', $optical_subtotals_array), implode(',', $optical_ids_array), $receipt_number, $tag_id, implode(',', $optical_quantity_array), $request->patient_category_to_pay, date('Y-m-d'), implode(",", $order_ids_array) ); // for co-payment people with some cash if ($request->patient_to_pay > 0) { DepositHelpers::eye_glasses_payment( $patient_id, $episode_id, implode(',', $optical_ids_array), implode(',', $optical_quantity_array), implode(',', $optical_amounts_array), implode(',', $optical_subtotals_array), $discount_status, $receipt_number, $request->patient_to_pay, implode(",", $order_ids_array), $request->wallets_amount ); } } else { // create a new optics payment record DepositHelpers::eye_glasses_payment( $patient_id, $episode_id, implode(',', $optical_ids_array), implode(',', $optical_quantity_array), implode(',', $optical_amounts_array), implode(',', $optical_subtotals_array), $discount_status, $receipt_number, $request->patient_to_pay, implode(",", $order_ids_array), $request->wallets_amount ); } // update the payment status for the ordered ids to paid for ($i = 0; $i < count($order_ids_array); $i++) { OrderedEyeGlasses::where(['id' => $order_ids_array[$i]])->update(['payment_status' => 1]); } return $is_invoice . "," . $receipt_number; } }