It is totally a matter of taste. However 900 lines seems far too many.
Some say a class/method/function should fit a screen without scrolling.
Be part of JetBrains PHPverse 2026 on June 9 – a free online event bringing PHP devs worldwide together.
My senior uses the repository patterns to work with the controller business logics. In the function he has the create and update method to create/ update the resource and other side effects to perform actions whenever resource gets created or updated and both were approximately 900 of lines.
That was really too hard to understand it and overwhelming for me to just looking at the no of the lines in the function.
How long no of lines any function could have?
It is totally a matter of taste. However 900 lines seems far too many.
Some say a class/method/function should fit a screen without scrolling.
I second this. It really a matter of taste.
Sometimes you cannot avoid writting a large function and then never have the time to really write a readable function.
I prefer small functions and this is what I do when I encounter a massive function inside the codebase:
Just don't overcomplicate things. Write code for the person who is going to read it 3 months lated.
900 lines are way too much for a function and that should be refactored to tiny ones.
According to the most comprehensive resource on clean Code, the book Clean Code by Uncle Bob Martin. Each function should only contain 3-4 lines, at the same level of abstraction.
"The first rule of functions is that they should be small. The second rule of functions is that they should be smaller than that."
Robert C. Martin
I must admit 3-4 lines per function is a bit hard to achieve. We can aim for at most 10 lines per function for the most part.
Small functions are crucial to clean code and readability. Looking at the Laravel source code, thousands of people can grasp and contribute. Monster functions and chunks of code are only maintainable to whoever wrote them in the first place.
The unfortunate reality is, the majority of developers don't care much about clean code or small functions. Still, I always strive for them.
@shivamyadav A single method with 900 or more lines of code is a massive code smell, yes.
Any suggestions how to manage it?
@shivamyadav Impossible to say without seeing the method and knowing what it does.
You can have a look at this a shorter function somewhere 400 of lines.
public function create($data) {
/** Default Variables **/
$allowImageProcessing = false;
$organizationID = session()->exists('org.id') ? session('org.id') : (auth()->check() ? auth()->user()->organization_id : null);
$organizationUsagePlanID = auth()->check() ? auth()->user()->organization()->value('learner_plan_id') : session('org.learner_plan_id');
$distributedMarketplaceFlag = $this->settingRepository->findByKey('distributed_marketplace', $organizationID);
$isDistributedMarketplace = (! is_null($distributedMarketplaceFlag) && $distributedMarketplaceFlag == 1);
$isExceptionClient = in_array(session('org.sub_domain'), config('constants.csv_upload.exception_clients'));
$isMarketplace = $this->organizationRepository->isMarketplace($organizationID);
$isWhiteLabel = $this->organizationRepository->isWhiteLabel($organizationID);
$newUserPlan = null;
$setEmpIDAsPassword = $this->settingRepository->findByKey('set_employee_id_as_password', $organizationID);
$notificationByEmailFlag = $this->settingRepository->findByKey('all_notifications_to_email', $organizationID);
$setInviteFlag = false; // INFO: Allows to Send the Invite Email Twice
$storageUsed = 0;
/** Default Variables **/
/** Additional Metadata **/
$data['user']['organization_id'] = $organizationID;
if ($isExceptionClient || in_array(session('org.sub_domain'), config('clients.smasterkoushin.subdomains'))) { // INFO: User Activation (for Limited Clients)
$data['user']['is_active'] = 1; // Exception: Activate without Verification
} elseif (! array_key_exists('is_active', $data['user'])) {
$data['user']['is_active'] = 0; // INFO: Assign Inactive Status and User will Activate Post Password Reset
}
if (! is_null($setEmpIDAsPassword) && ($setEmpIDAsPassword == 1) && array_key_exists('emp_id', $data['user']) && strlen($data['user']['emp_id']) > 0) { // INFO: Flag to Force Assign Employee ID as Password
$data['user']['skip_reset_password'] = 1; // INFO: Skips Password Reset Step from Invite Email SSO Link
$data['user']['password'] = Hash::make($data['user']['emp_id']); // INFO: Override Password (if exists)
}
/** Additional Metadata **/
/** Upload Image (if exists) **/
if (array_key_exists('profile_image', $data['user'])) {
$allowImageProcessing = true; // Image Processing Needed
/** Upload Profile Image **/
$data['user']['profile_image'] = $this->s3Service->uploadFile('user-profile-image', $data['user']['profile_image']);
/** Upload Profile Image **/
/** Calculate Storage Used **/
$signedURL = $this->cloudFrontService->getSignedURL($data['user']['profile_image'], config('time.5_minutes'));
$fileHeaders = get_headers($signedURL, true);
$storageUsed += $this->storageService->convertBytesToKB($fileHeaders['Content-Length']);
/** Calculate Storage Used **/
} else {
if (in_array(session('org.sub_domain'), config('clients.chronos.subdomains'))) {
$data['user']['profile_image'] = env('S3_DM_CF_URL').'/cat.jpg';
} elseif (in_array(session('org.sub_domain'), config('clients.fujikura.subdomains'))) {
$data['user']['profile_image'] = env('S3_DM_CF_URL').'/white.png';
}
}
/** Upload Image (if exists) **/
/** Upgrade Learner Plan (if learner capacity exceeds and no plan is scheduled) **/
$totalUsers = ($this->getCountByRole() + 1);
if (($organizationUsagePlanID == config('constants.plans.users.small_team')) && ($totalUsers > config('constants.plans.users.small_team_user_limit'))) {
$newUserPlan = $this->organizationRepository->getNextUserPlan();
}
/** Upgrade Learner Plan (if learner capacity exceeds and no plan is scheduled) **/
/** Upgrade GTM Users Plan **/
if ($isWhiteLabel == false) { // INFO: Only for Organization Client
$this->manageGTMSubscription($totalUsers);
}
/** Upgrade GTM Users Plan **/
/** Assign Notification Email (as per setting flag) **/
if (! array_key_exists('allow_notification_email', $data['user'])) {
$data['user']['allow_notification_email'] = (! is_null($notificationByEmailFlag) && ($notificationByEmailFlag == 1)); // INFO: If the Flag is Set then Notification Emails will be Sent.
}
/** Assign Notification Email (as per setting flag) **/
/** Create User **/
$modelResource = $this->userModel->create($data['user']);
/** Create User **/
if ($modelResource->exists) {
/** [START] Corporate Level User Creation **/
if (in_array(session('org.sub_domain'), config('clients.jisha.subdomains')) && (array_key_exists('corporate', $data['user']) && $data['user']['corporate'] == true)) {
/** Assigning Manager Role **/
$data['user']['role_id'] = config('constants.roles.manager');
$modelResource->role_id = config('constants.roles.manager');
$modelResource->save();
/** Assigning Manager Role **/
/** Fetching/Creating Parent Division (if not exists) **/
$corporateDivisionResource = $this->divisionRepository->findOrCreate($organizationID, config('clients.jisha.parent_division_title'));
/** Fetching/Creating Parent Division (if not exists) **/
/** Creating Sub-Division and User Mapping **/
$divisionData['division']['parent_id'] = $corporateDivisionResource->id;
$divisionData['division']['title'] = $data['user']['company_name'];
$divisionData['division']['role_id'] = $data['user']['role_id'];
$divisionData['division']['user_id'] = $modelResource->id;
$this->divisionRepository->create($divisionData);
/** Creating Sub-Division and User Mapping **/
/** [START] Process Corporate Subscription **/
event(new HandleCorporateSubscription($data['user']['corporate_plan_id'], $modelResource->id));
/** [END] Process Corporate Subscription **/
}
/** Create Expert (if Role is Admin/Manager) **/
if (in_array($data['user']['role_id'], [config('constants.roles.admin'), config('constants.roles.manager')])) {
/** Get B2B Expert's Commission **/
$expertCommissionID = $this->commissionModel->where('rate', 0.95)->value('id');
/** Get B2B Expert's Commission **/
$expertStatus = 1;
if ($isDistributedMarketplace && $data['user']['role_id'] == config('constants.roles.manager')) { // INFO: Distributed Marketplace Client and Manager
$expertStatus = array_key_exists('registration_status', $data['user']) ? $data['user']['registration_status'] : config('constants.user.status.screening'); // CRITICAL: For Distributed Marketplace Block Expert from Editing Anything (-2: Screening = Limited Access, -1: Approval 1 = Limited Access & 1: Approval 2 = Full Access)
}
/** Set Stripe Connect Account ID **/
$stripeAccountID = null;
if ($isMarketplace && ! $isDistributedMarketplace) { // INFO: Marketplace Admin and Manager (Non Distributed Marketplace)
$stripeAccountKey = $this->settingRepository->findByKey('stripe_connect_account_id', $organizationID);
$stripeAccountID = ($stripeAccountKey ?? null);
}
/** Set Stripe Connect Account ID **/
$data['expert'] = [
'profile_type' => config('constants.user.profile_type.individual'),
'company_name' => $modelResource->company_name,
'telephone' => $modelResource->mobile,
'portal_id' => config('constants.portal.b2b'),
'organization_id' => $organizationID,
'stripe_account_id' => $stripeAccountID,
'course_commission_id' => $expertCommissionID,
'seminar_commission_id' => $expertCommissionID,
'ctl_name' => $modelResource->full_name,
'ctl_address_1' => $modelResource->address_1,
'ctl_address_2' => $modelResource->address_2,
'website_url' => $modelResource->website,
'is_active' => $expertStatus,
];
$modelResource->is_expert = 1;
$modelResource->expert()->create($data['expert']);
/** [START] Notification to Admin and Partner on Approval Process **/
if ($isDistributedMarketplace && $data['user']['role_id'] == config('constants.roles.manager')) {
/** Fetching/Creating Parent Division (if not exists) **/
$isGoGetterz = in_array(session('org.sub_domain'), config('clients.gogetterz.subdomains'));
if ($isGoGetterz) {
$parentDivisionTitle = config('clients.gogetterz.parent_division_title');
} else {
$parentDivisionTitle = 'Top';
}
$parentDivisionResource = $this->divisionRepository->findOrCreate($organizationID, $parentDivisionTitle);
/** Fetching/Creating Parent Division (if not exists) **/
/** Creating Sub-Division and User Mapping **/
$divisionData['division']['parent_id'] = $parentDivisionResource->id;
$divisionData['division']['title'] = $modelResource->username;
$divisionData['division']['role_id'] = $data['user']['role_id'];
$divisionData['division']['user_id'] = $modelResource->id;
$this->divisionRepository->create($divisionData);
/** Creating Sub-Division and User Mapping **/
/** [START] Send Screening Notification to Admins **/
if ($expertStatus == config('constants.user.status.screening')) {
/** Alert Variables **/
$alertData['data_set'] = [
config('constants.notify_admins.category.user') => $modelResource->id, // INFO: User : User ID
];
$alertData['organization_id'] = $organizationID;
$alertData['origin'] = config('constants.notify_admins.origin.distributed_marketplace_manager_register');
/** Alert Variables **/
/** Notify Admins **/
event(new NotifyOrganizationAdmins($alertData));
/** Notify Admins **/
}
/** [END] Send Screening Notification to Admins **/
/** Send Email Notification to Partner **/
if (in_array($expertStatus, [config('constants.user.status.approval_1'), config('constants.user.status.approval_2')])) { // INFO: -1: Approval - 1, 1: Approval - 2
$this->handleApprovalState($expertStatus, $modelResource);
}
/** Send Email Notification to Partner **/
/** Replicate Company Details **/
event(new ReplicateCompanyDetails($modelResource->id));
/** Replicate Company Details **/
}
/** [END] Notification to Admin and Partner on Approval Process **/
}
/** Create Expert (if Role is Admin/Manager) **/
/** Create Stripe Customer **/
$stripeResponse = app()->make(StripeCustomer::class)->createFromEmail($data['user']['email']);
$modelResource->stripe_customer_id = $stripeResponse['data']['id'];
$modelResource->save();
/** Create Stripe Customer **/
/** [Optional] Mapping Handling **/
$divisionExists = (array_key_exists('divisions', $data['user']) && (! empty($data['user']['divisions'])));
/** [Optional] Mapping Handling **/
/** Assign Division **/
if ($divisionExists) {
foreach ($data['user']['divisions'] as $divisionID) {
$data['user-division'] = [
'department_id' => $divisionID,
'organization_id' => $data['user']['organization_id'],
];
$modelResource->divisions()->updateOrCreate($data['user-division'], $data['user-division']);
}
}
/** Assign Division **/
/** Assign Permission Matrix **/
$permissionStatus = $this->updatePermission($modelResource);
if ($permissionStatus == false) {
return config('errors.permission.failed');
}
/** Assign Permission Matrix **/
/** Upgrade User Plan (learner capacity exceeded) **/
if (! is_null($newUserPlan)) {
$activationStatus = $this->upgradeUserPlan($organizationID, $newUserPlan);
if (! $activationStatus) {
return config('errors.subscription.failed');
}
}
/** Upgrade User Plan (learner capacity exceeded) **/
/** Update Storage Ledger **/
if ($storageUsed > 0) {
$data['storage-ledger'] = [
'organization_id' => $organizationID,
'learner_id' => auth()->check() ? auth()->id() : $modelResource->id,
'notes' => 'Added Profile Image.',
'debit' => $storageUsed,
];
$modelResource->storageLogs()->updateOrCreate([
'mod_ref_type' => 'b2b-learner',
'mod_ref_id' => $modelResource->id,
], $data['storage-ledger']);
}
/** Update Storage Ledger **/
/** Initiate Image Processor **/
if ($allowImageProcessing) {
event(new ImageProcessor($modelResource->id, 'b2b_learner_profile_image'));
}
/** Initiate Image Processor **/
/** Account Subscription (only for marketplace member user) **/
$organizationType = $modelResource->organization()->value('type');
$accountSubscriptionStatus = $this->accountSubscriptionService->isActive($organizationType);
if ($accountSubscriptionStatus &&
(in_array($modelResource->role_id, [config('constants.roles.member'), config('constants.roles.manager')]) ||
(in_array(session('org.sub_domain'), config('clients.jisha.subdomains')) && (array_key_exists('corporate', $data['user']) && $data['user']['corporate'] == true))
)
) { // INFO: Account Subscription is Active! - Current User is a Member/Manager OR Corporate Sign-Up
/** Mark Current Member as Super User **/
$modelResource->is_superuser = 1; // Assign Super User to only Member Role
$modelResource->save();
/** Mark Current Member as Super User **/
if (auth()->check() && (in_array(session('org.sub_domain'), config('clients.jisha.subdomains'))) && $divisionExists) {
/** [START] Process Corporate Subscription **/
if ($modelResource->role_id == config('constants.roles.member')) { // INFO: Added User is Member - Assign to Free Access Pool
$this->userSubscriptionRepository->assignFreeAccess($modelResource->id);
} elseif ($modelResource->role_id == config('constants.roles.manager')) { // INFO: Added User is Manager - More than One-Manager under Division then Assign to Free Access Pool
foreach ($data['user']['divisions'] as $divisionID) { // INFO: Loop Through Divisions
$totalManagers = $this->divisionUserModel->leftJoin('b2b_learners', 'b2b_department_learners.learner_id', '=', 'b2b_learners.id')
->where('b2b_learners.role_id', config('constants.roles.manager'))
->where('department_id', $divisionID)
->where('learner_id', '<>', $modelResource->id)
->whereNull('b2b_department_learners.deleted_at')
->whereNull('b2b_learners.deleted_at')
->count();
if ($totalManagers > 0) { // INFO: One-Manager Already Exists under this Division
$this->userSubscriptionRepository->assignFreeAccess($modelResource->id);
break; // INFO: Skip after Manager is Assigned in Free Access Pool
}
}
}
/** [END] Process Corporate Subscription **/
}
}
/** Account Subscription (only for marketplace member user) **/
/** Send Invite Email **/
if ($data['user']['send_email']) {
$skipResetPassword = array_key_exists('skip_reset_password', $data['user']);
$withDelay = (array_key_exists('invite_email_with_delay', $data['user']) ? $data['user']['invite_email_with_delay'] : true);
$this->sendInviteEmail($modelResource, $setInviteFlag, $skipResetPassword, $withDelay);
}
/** Send Invite Email **/
/** [START] Attach Custom Fields to User **/
if (array_key_exists('custom_fields', $data['user']) && count($data['user']['custom_fields'])) {
$this->attachCustomFields($modelResource->id, $data['user']['custom_fields']);
}
/** [END] Attach Custom Fields to User **/
/** [START] Client #250 > 102 Subdomains Related Expiration Logic **/
if (($organizationID >= 299 && $organizationID <= 400) && ($modelResource->role_id != config('constants.roles.admin'))) {
$expirationDate = date('Y-m-t 23:59:59', strtotime('+1 month', time())); // Last Day of Next Month
app()->make(UserExpirationLog::class)->create([
'organization_id' => $organizationID,
'learner_id' => $modelResource->id,
'expiration_at' => $expirationDate,
]);
}
/** [END] Client #250 > 102 Subdomains Related Expiration Logic **/
/** [START] Entity Allocation by Division **/
$newDivisions = $modelResource->divisions()->pluck('department_id')->toArray();
event(new EntityDivisionAllocation($modelResource->id, [], $newDivisions));
/** [END] Entity Allocation by Division **/
/** [START] Assign Manager's User Limit **/
if ($modelResource->role_id == config('constants.roles.manager') && array_key_exists('user_limit', $data['user']) && $data['user']['user_limit'] > 0) { // INFO: Role Switched from Manager to non-Manager (i.e. Admin/Member)
$settingData = [
'type' => "manager_{$modelResource->id}_user_limit",
'value' => $data['user']['user_limit'],
];
$this->settingRepository->upsert($organizationID, $settingData);
}
/** [END] Assign Manager's User Limit **/
}
return $modelResource;
}
Looks like that senior used to be a Cobol programmer.
I guess there are no tests written for it either, but if there are, I would ctrl-a delete, and start from scratch.
If not, the I would start by extraction each segment of the if statements to it's own method.
For example
if ($data['user']['send_email']) {
$skipResetPassword = array_key_exists('skip_reset_password', $data['user']);
$withDelay = (array_key_exists('invite_email_with_delay', $data['user']) ? $data['user']['invite_email_with_delay'] : true);
$this->sendInviteEmail($modelResource, $setInviteFlag, $skipResetPassword, $withDelay);
}
would become something like this
function sendInviteEmailIfNeeded($modelResource, $setInviteFlag, $data)
{
if (! $data['user']['send_email']) return;
$skipResetPassword = array_key_exists('skip_reset_password', $data['user']);
$withDelay = (array_key_exists('invite_email_with_delay', $data['user']) ? $data['user']['invite_email_with_delay'] : true);
$this->sendInviteEmail($modelResource, $setInviteFlag, $skipResetPassword, $withDelay);
}
Yeah, there's no any test written for a single piece of code..
I'm really curious about that function now!
Why isn't @laryai going crazy on this matter lol?
Where?
Function to create the user
public function create($data) {
/** Default Variables **/
$allowImageProcessing = false;
$organizationID = session()->exists('org.id') ? session('org.id') : (auth()->check() ? auth()->user()->organization_id : null);
$organizationUsagePlanID = auth()->check() ? auth()->user()->organization()->value('learner_plan_id') : session('org.learner_plan_id');
$distributedMarketplaceFlag = $this->settingRepository->findByKey('distributed_marketplace', $organizationID);
$isDistributedMarketplace = (! is_null($distributedMarketplaceFlag) && $distributedMarketplaceFlag == 1);
$isExceptionClient = in_array(session('org.sub_domain'), config('constants.csv_upload.exception_clients'));
$isMarketplace = $this->organizationRepository->isMarketplace($organizationID);
$isWhiteLabel = $this->organizationRepository->isWhiteLabel($organizationID);
$newUserPlan = null;
$setEmpIDAsPassword = $this->settingRepository->findByKey('set_employee_id_as_password', $organizationID);
$notificationByEmailFlag = $this->settingRepository->findByKey('all_notifications_to_email', $organizationID);
$setInviteFlag = false; // INFO: Allows to Send the Invite Email Twice
$storageUsed = 0;
/** Default Variables **/
/** Additional Metadata **/
$data['user']['organization_id'] = $organizationID;
if ($isExceptionClient || in_array(session('org.sub_domain'), config('clients.smasterkoushin.subdomains'))) { // INFO: User Activation (for Limited Clients)
$data['user']['is_active'] = 1; // Exception: Activate without Verification
} elseif (! array_key_exists('is_active', $data['user'])) {
$data['user']['is_active'] = 0; // INFO: Assign Inactive Status and User will Activate Post Password Reset
}
if (! is_null($setEmpIDAsPassword) && ($setEmpIDAsPassword == 1) && array_key_exists('emp_id', $data['user']) && strlen($data['user']['emp_id']) > 0) { // INFO: Flag to Force Assign Employee ID as Password
$data['user']['skip_reset_password'] = 1; // INFO: Skips Password Reset Step from Invite Email SSO Link
$data['user']['password'] = Hash::make($data['user']['emp_id']); // INFO: Override Password (if exists)
}
/** Additional Metadata **/
/** Upload Image (if exists) **/
if (array_key_exists('profile_image', $data['user'])) {
$allowImageProcessing = true; // Image Processing Needed
/** Upload Profile Image **/
$data['user']['profile_image'] = $this->s3Service->uploadFile('user-profile-image', $data['user']['profile_image']);
/** Upload Profile Image **/
/** Calculate Storage Used **/
$signedURL = $this->cloudFrontService->getSignedURL($data['user']['profile_image'], config('time.5_minutes'));
$fileHeaders = get_headers($signedURL, true);
$storageUsed += $this->storageService->convertBytesToKB($fileHeaders['Content-Length']);
/** Calculate Storage Used **/
} else {
if (in_array(session('org.sub_domain'), config('clients.chronos.subdomains'))) {
$data['user']['profile_image'] = env('S3_DM_CF_URL').'/cat.jpg';
} elseif (in_array(session('org.sub_domain'), config('clients.fujikura.subdomains'))) {
$data['user']['profile_image'] = env('S3_DM_CF_URL').'/white.png';
}
}
/** Upload Image (if exists) **/
/** Upgrade Learner Plan (if learner capacity exceeds and no plan is scheduled) **/
$totalUsers = ($this->getCountByRole() + 1);
if (($organizationUsagePlanID == config('constants.plans.users.small_team')) && ($totalUsers > config('constants.plans.users.small_team_user_limit'))) {
$newUserPlan = $this->organizationRepository->getNextUserPlan();
}
/** Upgrade Learner Plan (if learner capacity exceeds and no plan is scheduled) **/
/** Upgrade GTM Users Plan **/
if ($isWhiteLabel == false) { // INFO: Only for Organization Client
$this->manageGTMSubscription($totalUsers);
}
/** Upgrade GTM Users Plan **/
/** Assign Notification Email (as per setting flag) **/
if (! array_key_exists('allow_notification_email', $data['user'])) {
$data['user']['allow_notification_email'] = (! is_null($notificationByEmailFlag) && ($notificationByEmailFlag == 1)); // INFO: If the Flag is Set then Notification Emails will be Sent.
}
/** Assign Notification Email (as per setting flag) **/
/** Create User **/
$modelResource = $this->userModel->create($data['user']);
/** Create User **/
if ($modelResource->exists) {
/** [START] Corporate Level User Creation **/
if (in_array(session('org.sub_domain'), config('clients.jisha.subdomains')) && (array_key_exists('corporate', $data['user']) && $data['user']['corporate'] == true)) {
/** Assigning Manager Role **/
$data['user']['role_id'] = config('constants.roles.manager');
$modelResource->role_id = config('constants.roles.manager');
$modelResource->save();
/** Assigning Manager Role **/
/** Fetching/Creating Parent Division (if not exists) **/
$corporateDivisionResource = $this->divisionRepository->findOrCreate($organizationID, config('clients.jisha.parent_division_title'));
/** Fetching/Creating Parent Division (if not exists) **/
/** Creating Sub-Division and User Mapping **/
$divisionData['division']['parent_id'] = $corporateDivisionResource->id;
$divisionData['division']['title'] = $data['user']['company_name'];
$divisionData['division']['role_id'] = $data['user']['role_id'];
$divisionData['division']['user_id'] = $modelResource->id;
$this->divisionRepository->create($divisionData);
/** Creating Sub-Division and User Mapping **/
/** [START] Process Corporate Subscription **/
event(new HandleCorporateSubscription($data['user']['corporate_plan_id'], $modelResource->id));
/** [END] Process Corporate Subscription **/
}
/** Create Expert (if Role is Admin/Manager) **/
if (in_array($data['user']['role_id'], [config('constants.roles.admin'), config('constants.roles.manager')])) {
/** Get B2B Expert's Commission **/
$expertCommissionID = $this->commissionModel->where('rate', 0.95)->value('id');
/** Get B2B Expert's Commission **/
$expertStatus = 1;
if ($isDistributedMarketplace && $data['user']['role_id'] == config('constants.roles.manager')) { // INFO: Distributed Marketplace Client and Manager
$expertStatus = array_key_exists('registration_status', $data['user']) ? $data['user']['registration_status'] : config('constants.user.status.screening'); // CRITICAL: For Distributed Marketplace Block Expert from Editing Anything (-2: Screening = Limited Access, -1: Approval 1 = Limited Access & 1: Approval 2 = Full Access)
}
/** Set Stripe Connect Account ID **/
$stripeAccountID = null;
if ($isMarketplace && ! $isDistributedMarketplace) { // INFO: Marketplace Admin and Manager (Non Distributed Marketplace)
$stripeAccountKey = $this->settingRepository->findByKey('stripe_connect_account_id', $organizationID);
$stripeAccountID = ($stripeAccountKey ?? null);
}
/** Set Stripe Connect Account ID **/
$data['expert'] = [
'profile_type' => config('constants.user.profile_type.individual'),
'company_name' => $modelResource->company_name,
'telephone' => $modelResource->mobile,
'portal_id' => config('constants.portal.b2b'),
'organization_id' => $organizationID,
'stripe_account_id' => $stripeAccountID,
'course_commission_id' => $expertCommissionID,
'seminar_commission_id' => $expertCommissionID,
'ctl_name' => $modelResource->full_name,
'ctl_address_1' => $modelResource->address_1,
'ctl_address_2' => $modelResource->address_2,
'website_url' => $modelResource->website,
'is_active' => $expertStatus,
];
$modelResource->is_expert = 1;
$modelResource->expert()->create($data['expert']);
/** [START] Notification to Admin and Partner on Approval Process **/
if ($isDistributedMarketplace && $data['user']['role_id'] == config('constants.roles.manager')) {
/** Fetching/Creating Parent Division (if not exists) **/
$isGoGetterz = in_array(session('org.sub_domain'), config('clients.gogetterz.subdomains'));
if ($isGoGetterz) {
$parentDivisionTitle = config('clients.gogetterz.parent_division_title');
} else {
$parentDivisionTitle = 'Top';
}
$parentDivisionResource = $this->divisionRepository->findOrCreate($organizationID, $parentDivisionTitle);
/** Fetching/Creating Parent Division (if not exists) **/
/** Creating Sub-Division and User Mapping **/
$divisionData['division']['parent_id'] = $parentDivisionResource->id;
$divisionData['division']['title'] = $modelResource->username;
$divisionData['division']['role_id'] = $data['user']['role_id'];
$divisionData['division']['user_id'] = $modelResource->id;
$this->divisionRepository->create($divisionData);
/** Creating Sub-Division and User Mapping **/
/** [START] Send Screening Notification to Admins **/
if ($expertStatus == config('constants.user.status.screening')) {
/** Alert Variables **/
$alertData['data_set'] = [
config('constants.notify_admins.category.user') => $modelResource->id, // INFO: User : User ID
];
$alertData['organization_id'] = $organizationID;
$alertData['origin'] = config('constants.notify_admins.origin.distributed_marketplace_manager_register');
/** Alert Variables **/
/** Notify Admins **/
event(new NotifyOrganizationAdmins($alertData));
/** Notify Admins **/
}
/** [END] Send Screening Notification to Admins **/
/** Send Email Notification to Partner **/
if (in_array($expertStatus, [config('constants.user.status.approval_1'), config('constants.user.status.approval_2')])) { // INFO: -1: Approval - 1, 1: Approval - 2
$this->handleApprovalState($expertStatus, $modelResource);
}
/** Send Email Notification to Partner **/
/** Replicate Company Details **/
event(new ReplicateCompanyDetails($modelResource->id));
/** Replicate Company Details **/
}
/** [END] Notification to Admin and Partner on Approval Process **/
}
/** Create Expert (if Role is Admin/Manager) **/
/** Create Stripe Customer **/
$stripeResponse = app()->make(StripeCustomer::class)->createFromEmail($data['user']['email']);
$modelResource->stripe_customer_id = $stripeResponse['data']['id'];
$modelResource->save();
/** Create Stripe Customer **/
/** [Optional] Mapping Handling **/
$divisionExists = (array_key_exists('divisions', $data['user']) && (! empty($data['user']['divisions'])));
/** [Optional] Mapping Handling **/
/** Assign Division **/
if ($divisionExists) {
foreach ($data['user']['divisions'] as $divisionID) {
$data['user-division'] = [
'department_id' => $divisionID,
'organization_id' => $data['user']['organization_id'],
];
$modelResource->divisions()->updateOrCreate($data['user-division'], $data['user-division']);
}
}
/** Assign Division **/
/** Assign Permission Matrix **/
$permissionStatus = $this->updatePermission($modelResource);
if ($permissionStatus == false) {
return config('errors.permission.failed');
}
/** Assign Permission Matrix **/
/** Upgrade User Plan (learner capacity exceeded) **/
if (! is_null($newUserPlan)) {
$activationStatus = $this->upgradeUserPlan($organizationID, $newUserPlan);
if (! $activationStatus) {
return config('errors.subscription.failed');
}
}
/** Upgrade User Plan (learner capacity exceeded) **/
/** Update Storage Ledger **/
if ($storageUsed > 0) {
$data['storage-ledger'] = [
'organization_id' => $organizationID,
'learner_id' => auth()->check() ? auth()->id() : $modelResource->id,
'notes' => 'Added Profile Image.',
'debit' => $storageUsed,
];
$modelResource->storageLogs()->updateOrCreate([
'mod_ref_type' => 'b2b-learner',
'mod_ref_id' => $modelResource->id,
], $data['storage-ledger']);
}
/** Update Storage Ledger **/
/** Initiate Image Processor **/
if ($allowImageProcessing) {
event(new ImageProcessor($modelResource->id, 'b2b_learner_profile_image'));
}
/** Initiate Image Processor **/
/** Account Subscription (only for marketplace member user) **/
$organizationType = $modelResource->organization()->value('type');
$accountSubscriptionStatus = $this->accountSubscriptionService->isActive($organizationType);
if ($accountSubscriptionStatus &&
(in_array($modelResource->role_id, [config('constants.roles.member'), config('constants.roles.manager')]) ||
(in_array(session('org.sub_domain'), config('clients.jisha.subdomains')) && (array_key_exists('corporate', $data['user']) && $data['user']['corporate'] == true))
)
) { // INFO: Account Subscription is Active! - Current User is a Member/Manager OR Corporate Sign-Up
/** Mark Current Member as Super User **/
$modelResource->is_superuser = 1; // Assign Super User to only Member Role
$modelResource->save();
/** Mark Current Member as Super User **/
if (auth()->check() && (in_array(session('org.sub_domain'), config('clients.jisha.subdomains'))) && $divisionExists) {
/** [START] Process Corporate Subscription **/
if ($modelResource->role_id == config('constants.roles.member')) { // INFO: Added User is Member - Assign to Free Access Pool
$this->userSubscriptionRepository->assignFreeAccess($modelResource->id);
} elseif ($modelResource->role_id == config('constants.roles.manager')) { // INFO: Added User is Manager - More than One-Manager under Division then Assign to Free Access Pool
foreach ($data['user']['divisions'] as $divisionID) { // INFO: Loop Through Divisions
$totalManagers = $this->divisionUserModel->leftJoin('b2b_learners', 'b2b_department_learners.learner_id', '=', 'b2b_learners.id')
->where('b2b_learners.role_id', config('constants.roles.manager'))
->where('department_id', $divisionID)
->where('learner_id', '<>', $modelResource->id)
->whereNull('b2b_department_learners.deleted_at')
->whereNull('b2b_learners.deleted_at')
->count();
if ($totalManagers > 0) { // INFO: One-Manager Already Exists under this Division
$this->userSubscriptionRepository->assignFreeAccess($modelResource->id);
break; // INFO: Skip after Manager is Assigned in Free Access Pool
}
}
}
/** [END] Process Corporate Subscription **/
}
}
/** Account Subscription (only for marketplace member user) **/
/** Send Invite Email **/
if ($data['user']['send_email']) {
$skipResetPassword = array_key_exists('skip_reset_password', $data['user']);
$withDelay = (array_key_exists('invite_email_with_delay', $data['user']) ? $data['user']['invite_email_with_delay'] : true);
$this->sendInviteEmail($modelResource, $setInviteFlag, $skipResetPassword, $withDelay);
}
/** Send Invite Email **/
/** [START] Attach Custom Fields to User **/
if (array_key_exists('custom_fields', $data['user']) && count($data['user']['custom_fields'])) {
$this->attachCustomFields($modelResource->id, $data['user']['custom_fields']);
}
/** [END] Attach Custom Fields to User **/
/** [START] Client #250 > 102 Subdomains Related Expiration Logic **/
if (($organizationID >= 299 && $organizationID <= 400) && ($modelResource->role_id != config('constants.roles.admin'))) {
$expirationDate = date('Y-m-t 23:59:59', strtotime('+1 month', time())); // Last Day of Next Month
app()->make(UserExpirationLog::class)->create([
'organization_id' => $organizationID,
'learner_id' => $modelResource->id,
'expiration_at' => $expirationDate,
]);
}
/** [END] Client #250 > 102 Subdomains Related Expiration Logic **/
/** [START] Entity Allocation by Division **/
$newDivisions = $modelResource->divisions()->pluck('department_id')->toArray();
event(new EntityDivisionAllocation($modelResource->id, [], $newDivisions));
/** [END] Entity Allocation by Division **/
/** [START] Assign Manager's User Limit **/
if ($modelResource->role_id == config('constants.roles.manager') && array_key_exists('user_limit', $data['user']) && $data['user']['user_limit'] > 0) { // INFO: Role Switched from Manager to non-Manager (i.e. Admin/Member)
$settingData = [
'type' => "manager_{$modelResource->id}_user_limit",
'value' => $data['user']['user_limit'],
];
$this->settingRepository->upsert($organizationID, $settingData);
}
/** [END] Assign Manager's User Limit **/
}
return $modelResource;
}
You may more or less understand what's going on inside the function right now. But after a month or half a year you'll be totally lost, for sure.
Anyone trying to follow that method is going to have a really hard time. And that someone might be you two years from now.
Right now you're doing everything from control flow to low-level operations within the create() method. I'd refactor it so it only handles the top-level logic, and all heavy lifting is delegated to local methods. This makes the code more readable and also naturally comments it. Example:
if (array_key_exists('profile_image', $data['user'])) {
$storageUsed = $this->uploadImage($data);
}
If you need to modify the $data array in a subtask, you can pass it as a reference:
protected function doSomething(array &$data): void {
$data['user']['something'] = true;
}
Jesus christ!
If that's your senior engineer writing that code today, they need to be sacked, ASAP!
That's not code written by a senior! They might have been there a long time, but they are not a senior engineer.
Please or to participate in this conversation.