Improve update of health care sheet and add duplicata validation while store health care sheet
This commit is contained in:
parent
5b3923557a
commit
c12ef5ea18
|
@ -50,3 +50,10 @@ if (!function_exists('generateTransactionCode')) {
|
||||||
return $randomString;
|
return $randomString;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!function_exists('array_has_dupes')) {
|
||||||
|
function array_has_dupes(array $array)
|
||||||
|
{
|
||||||
|
return count($array) !== count(array_unique($array));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -624,6 +624,9 @@ class HealthCareSheetController extends Controller
|
||||||
]);
|
]);
|
||||||
|
|
||||||
$performances = $request->input('performances', []);
|
$performances = $request->input('performances', []);
|
||||||
|
$prescriptions = $request->input('prescriptions', []);
|
||||||
|
$exams = $request->input('exams', []);
|
||||||
|
|
||||||
$insurance = NhInsurance::where('insured_id', $request->input('insured_id'))->whereIn('state', [InsuranceState::PAID, InsuranceState::PARTIALLY_PAID])->first();
|
$insurance = NhInsurance::where('insured_id', $request->input('insured_id'))->whereIn('state', [InsuranceState::PAID, InsuranceState::PARTIALLY_PAID])->first();
|
||||||
if (!isset($insurance)) {
|
if (!isset($insurance)) {
|
||||||
return $this->errorResponse(trans('errors.not_insured'));
|
return $this->errorResponse(trans('errors.not_insured'));
|
||||||
|
@ -646,6 +649,28 @@ class HealthCareSheetController extends Controller
|
||||||
return $this->errorResponse(trans('errors.nano_health_not_activated'));
|
return $this->errorResponse(trans('errors.nano_health_not_activated'));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//Verifier les duplicata
|
||||||
|
$performancesActsIds = array_map(function ($r) {
|
||||||
|
return $r['act_id'];
|
||||||
|
}, $performances);
|
||||||
|
if (array_has_dupes($performancesActsIds)) {
|
||||||
|
return $this->errorResponse(trans('errors.sheet_performances_duplicata'));
|
||||||
|
}
|
||||||
|
|
||||||
|
$examsActsIds = array_map(function ($r) {
|
||||||
|
return $r['act_id'];
|
||||||
|
}, $exams);
|
||||||
|
if (array_has_dupes($examsActsIds)) {
|
||||||
|
return $this->errorResponse(trans('errors.sheet_exams_duplicata'));
|
||||||
|
}
|
||||||
|
|
||||||
|
$prescriptionsDrugsIds = array_map(function ($r) {
|
||||||
|
return $r['drug_or_device_id'];
|
||||||
|
}, $prescriptions);
|
||||||
|
if (array_has_dupes($prescriptionsDrugsIds)) {
|
||||||
|
return $this->errorResponse(trans('errors.sheet_prescriptions_duplicata'));
|
||||||
|
}
|
||||||
|
|
||||||
// Fetch performances amounts
|
// Fetch performances amounts
|
||||||
foreach ($performances as $i => $p) {
|
foreach ($performances as $i => $p) {
|
||||||
$act = NhAct::find($p['act_id']);
|
$act = NhAct::find($p['act_id']);
|
||||||
|
@ -1751,7 +1776,7 @@ class HealthCareSheetController extends Controller
|
||||||
'prescriptions.*.id' => 'nullable|integer|exists:nh_medical_prescriptions,id',
|
'prescriptions.*.id' => 'nullable|integer|exists:nh_medical_prescriptions,id',
|
||||||
'prescriptions.*.drug_or_device_id' => 'required_with:prescriptions.*.id|integer|exists:nh_drugs_and_devices,id',
|
'prescriptions.*.drug_or_device_id' => 'required_with:prescriptions.*.id|integer|exists:nh_drugs_and_devices,id',
|
||||||
'prescriptions.*.dosage' => 'required_with:prescriptions.*.id|string',
|
'prescriptions.*.dosage' => 'required_with:prescriptions.*.id|string',
|
||||||
'prescriptions.*.quantity' => 'required_with:prescriptions.*.id|integer',
|
'prescriptions.*.quantity' => 'required_with:prescriptions.*.id|integer|min:1',
|
||||||
'prescriptions.*.unit_price' => 'nullable|numeric',
|
'prescriptions.*.unit_price' => 'nullable|numeric',
|
||||||
'prescriptions.*.to_delete' => 'nullable|boolean',
|
'prescriptions.*.to_delete' => 'nullable|boolean',
|
||||||
'exams' => 'nullable|array',
|
'exams' => 'nullable|array',
|
||||||
|
@ -1789,13 +1814,36 @@ class HealthCareSheetController extends Controller
|
||||||
return $this->errorResponse(trans('errors.nano_health_not_activated'));
|
return $this->errorResponse(trans('errors.nano_health_not_activated'));
|
||||||
}
|
}
|
||||||
|
|
||||||
$parts = $this->getConfigInsuranceParts($nhConfig, $request->input('care_condition', $sheet->care_condition));
|
|
||||||
$currency_code = $this->getNetworkCurrency($sheet->insurance->network_id);
|
|
||||||
|
|
||||||
$performances = $request->input('performances', []);
|
$performances = $request->input('performances', []);
|
||||||
$prescriptions = $request->input('prescriptions', []);
|
$prescriptions = $request->input('prescriptions', []);
|
||||||
$exams = $request->input('exams', []);
|
$exams = $request->input('exams', []);
|
||||||
|
|
||||||
|
//Verifier les duplicata
|
||||||
|
$performancesActsIds = array_merge($sheet->performances->pluck('act_id')->toArray(), array_map(function ($r) {
|
||||||
|
return $r['act_id'] ?? null;
|
||||||
|
}, $performances));
|
||||||
|
if (array_has_dupes($performancesActsIds)) {
|
||||||
|
return $this->errorResponse(trans('errors.sheet_performances_duplicata'));
|
||||||
|
}
|
||||||
|
|
||||||
|
$examsActsIds = array_map(function ($r) {
|
||||||
|
return $r['act_id'] ?? null;
|
||||||
|
}, $exams);
|
||||||
|
if (array_has_dupes($examsActsIds)) {
|
||||||
|
return $this->errorResponse(trans('errors.sheet_exams_duplicata'));
|
||||||
|
}
|
||||||
|
|
||||||
|
$prescriptionsDrugsIds = array_map(function ($r) {
|
||||||
|
return $r['drug_or_device_id'] ?? null;
|
||||||
|
}, $prescriptions);
|
||||||
|
if (array_has_dupes($prescriptionsDrugsIds)) {
|
||||||
|
return $this->errorResponse(trans('errors.sheet_prescriptions_duplicata'));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
$parts = $this->getConfigInsuranceParts($nhConfig, $request->input('care_condition', $sheet->care_condition));
|
||||||
|
$currency_code = $this->getNetworkCurrency($sheet->insurance->network_id);
|
||||||
|
|
||||||
$performancesIds = array_map(function ($r) {
|
$performancesIds = array_map(function ($r) {
|
||||||
return $r['id'] ?? null;
|
return $r['id'] ?? null;
|
||||||
}, $performances);
|
}, $performances);
|
||||||
|
@ -1869,7 +1917,7 @@ class HealthCareSheetController extends Controller
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach ($request->input('prescriptions', []) as $p) {
|
foreach ($request->input('prescriptions', []) as $i => $p) {
|
||||||
if (!empty($p['to_delete'])) {
|
if (!empty($p['to_delete'])) {
|
||||||
NhMedicalPrescription::find($p['id'])->delete();
|
NhMedicalPrescription::find($p['id'])->delete();
|
||||||
NhHealthCareSheetsPrescription::where('sheet_id', $sheet->id)->where('prescription_id', $p['id'])->delete();
|
NhHealthCareSheetsPrescription::where('sheet_id', $sheet->id)->where('prescription_id', $p['id'])->delete();
|
||||||
|
@ -1894,10 +1942,30 @@ class HealthCareSheetController extends Controller
|
||||||
} else {
|
} else {
|
||||||
if (!empty($p['unit_price'])) {
|
if (!empty($p['unit_price'])) {
|
||||||
$prescription->unit_price = $p['unit_price'];
|
$prescription->unit_price = $p['unit_price'];
|
||||||
|
}
|
||||||
|
if (!empty($p['quantity'])) {
|
||||||
|
$quantity_diff = $p['quantity'] - $prescription->quantity;
|
||||||
|
// Update billed quantity in the previous sheets
|
||||||
|
$previous_prescription = $sheet->prescriptionSheet->prescriptions()->where('drug_or_device_id', $prescription->drug_or_device_id)->first();
|
||||||
|
if (!isset($previous_prescription)) {
|
||||||
|
DB::rollback();
|
||||||
|
return $this->errorResponse(__('errors.consultation_prescription_not_found'));
|
||||||
|
}
|
||||||
|
$quantity_to_bill = $previous_prescription->quantity - ($previous_prescription->billed_quantity ?? 0);
|
||||||
|
if ($quantity_diff > $quantity_to_bill) {
|
||||||
|
DB::rollback();
|
||||||
|
return $this->errorResponse(__('errors.prescription_ordered_quantity_must_not_greater_than_ordered_quantity',
|
||||||
|
['id' => $i + 1, 'quantity' => $quantity_to_bill + $prescription->quantity]));
|
||||||
|
}
|
||||||
|
$previous_prescription->billed_quantity += $quantity_diff;
|
||||||
|
$previous_prescription->billed = ($previous_prescription->billed_quantity == $previous_prescription->quantity);
|
||||||
|
$previous_prescription->save();
|
||||||
|
$prescription->quantity = $p['quantity'];
|
||||||
|
}
|
||||||
|
|
||||||
$prescription->insured_paid_amount = $parts->insured_part * $prescription->unit_price * ($prescription->quantity ?? 1);
|
$prescription->insured_paid_amount = $parts->insured_part * $prescription->unit_price * ($prescription->quantity ?? 1);
|
||||||
$prescription->insurer_paid_amount = $parts->insurer_part * $prescription->unit_price * ($prescription->quantity ?? 1);
|
$prescription->insurer_paid_amount = $parts->insurer_part * $prescription->unit_price * ($prescription->quantity ?? 1);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
$prescription->updated_at = $datetime;
|
$prescription->updated_at = $datetime;
|
||||||
$prescription->save();
|
$prescription->save();
|
||||||
|
|
||||||
|
|
|
@ -112,4 +112,10 @@ class NhHealthCareSheet extends Model
|
||||||
return $this->hasManyThrough(NhMedicalPrescription::class, NhHealthCareSheetsPrescription::class,
|
return $this->hasManyThrough(NhMedicalPrescription::class, NhHealthCareSheetsPrescription::class,
|
||||||
'sheet_id', 'id', 'id', 'prescription_id');
|
'sheet_id', 'id', 'id', 'prescription_id');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function prescriptionSheet()
|
||||||
|
{
|
||||||
|
return $this->belongsTo(NhHealthCareSheet::class, 'prescription_sheet_id');
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -68,5 +68,6 @@ return [
|
||||||
'act_quantity_required' => "The quantity is required for the act :act_name",
|
'act_quantity_required' => "The quantity is required for the act :act_name",
|
||||||
'act_authorization_request_required' => "An authorization is required to apply the act :act_name",
|
'act_authorization_request_required' => "An authorization is required to apply the act :act_name",
|
||||||
'act_unit_quantity_required' => "The unit quantity is required for the act :act_name",
|
'act_unit_quantity_required' => "The unit quantity is required for the act :act_name",
|
||||||
'prescription_ordered_quantity_must_not_greater_than_ordered_quantity' => "Prescription quantity :id must not be greater than :quantity"
|
'prescription_ordered_quantity_must_not_greater_than_ordered_quantity' => "Prescription quantity :id must not be greater than :quantity",
|
||||||
|
'consultation_prescription_not_found' => "The consultation attached to this prescription does not exist"
|
||||||
];
|
];
|
||||||
|
|
|
@ -68,5 +68,10 @@ return [
|
||||||
'act_quantity_required' => "La quantité est requise pour l'acte :act_name",
|
'act_quantity_required' => "La quantité est requise pour l'acte :act_name",
|
||||||
'act_authorization_request_required' => "Une autorisation est requise pour appliquer l'acte :act_name",
|
'act_authorization_request_required' => "Une autorisation est requise pour appliquer l'acte :act_name",
|
||||||
'act_unit_quantity_required' => "La quantité de l'unité est requise pour l'acte :act_name",
|
'act_unit_quantity_required' => "La quantité de l'unité est requise pour l'acte :act_name",
|
||||||
'prescription_ordered_quantity_must_not_greater_than_ordered_quantity' => "La quantité de la prescription :id ne doit pas être supérieure à :quantity"
|
'prescription_ordered_quantity_must_not_greater_than_ordered_quantity' => "La quantité de la prescription :id ne doit pas être supérieure à :quantity",
|
||||||
|
'consultation_prescription_not_found' => "La consultation rattaché à cette prescription n'existe pas",
|
||||||
|
'sheet_performances_duplicata' => "La feuille de soins a des duplicata de prestations",
|
||||||
|
'sheet_exams_duplicata' => "La feuille de soins a des duplicata d'examens",
|
||||||
|
'sheet_prescriptions_duplicata' => "La feuille de soins a des duplicata de prescriptions médicales"
|
||||||
|
|
||||||
];
|
];
|
||||||
|
|
Loading…
Reference in New Issue