from editing import *
write('app/Services/EntrepriseAccess.php', '''<?php
namespace App\\Services;
use App\\Models\\{Entreprise, User};
use Illuminate\\Database\\Eloquent\\Builder;
class EntrepriseAccess
{
    public function globalRead(User $user): bool { return $user->isAdmin() || $user->hasPermission('viewEntreprise') || $user->hasPermission('manageEntreprise'); }
    public function globalWrite(User $user): bool { return $user->isAdmin() || $user->hasPermission('manageEntreprise'); }
    private function sameMrc( User $user, Entreprise $company): bool { return $user->mrc_id !== null && $company->ville()->where('mrc_id', $user->mrc_id)->exists(); }
    public function canView(User $user, Entreprise $company): bool
    {
        if ($this->globalRead($user)) return true;
        if (($user->isEntreprise() || $user->hasPermission('viewOwnEntreprise')) && (int) $company->user_id === (int) $user->id) return true;
        return ($user->isMrcManager() || $user->hasPermission('viewEntrepriseInSameMRC') || $user->hasPermission('manageEntrepriseInSameMRC')) && $this->sameMrc($user,$company);
    }
    public function canManage(User $user, Entreprise $company): bool
    {
        if ($this->globalWrite($user)) return true;
        if ($user->isEntreprise() && (int) $company->user_id === (int) $user->id) return true;
        return ($user->isMrcManager() || $user->hasPermission('manageEntrepriseInSameMRC')) && $this->sameMrc($user,$company);
    }
    public function query(User $user): Builder
    {
        $query = Entreprise::query();
        if ($this->globalRead($user)) return $query;
        $own = $user->isEntreprise() || $user->hasPermission('viewOwnEntreprise');
        $mrc = $user->mrc_id !== null && ($user->isMrcManager() || $user->hasPermission('viewEntrepriseInSameMRC') || $user->hasPermission('manageEntrepriseInSameMRC'));
        return $query->where(function (Builder $scope) use ($user,$own,$mrc): void {
            $scope->whereRaw('1 = 0');
            if ($own) $scope->orWhere('user_id',$user->id);
            if ($mrc) $scope->orWhereHas('ville',fn(Builder $city)=>$city->where('mrc_id',$user->mrc_id));
        });
    }
}''')
p='app/Policies/Concerns/ResolvesAdminScope.php';s=read(p);a=s.index('        if ($user->isAdmin())');s=s[:a]+"        return app(\\App\\Services\\EntrepriseAccess::class)->canView($user, $entreprise);\n    }\n}\n";write(p,s)
p='app/Policies/EntreprisePolicy.php';s=read(p).replace("|| $user->hasPermission('viewEntrepriseInSameMRC');", "|| $user->hasPermission('viewEntrepriseInSameMRC') || $user->hasPermission('manageEntrepriseInSameMRC');")
a=s.index('return $this->canAccessEntreprise',s.index('public function update'));b=s.index(';',a);s=s[:a]+"return app(\\App\\Services\\EntrepriseAccess::class)->canManage($user, $entreprise)"+s[b:];write(p,s)
p='app/Policies/EntrepriseProduitPolicy.php';s=read(p).replace('return $this->view($user, $entrepriseProduit);', "$company = $entrepriseProduit->entreprise()->first();\n        return $company !== null && $user->can('update', $company);");write(p,s)
p='app/Http/Controllers/Admin/EntrepriseController.php';s=read(p).replace("$this->authorize('update', $entreprise);\n        $entreprise->load", "$this->authorize('view', $entreprise);\n        $entreprise->load")
a=s.index('        if ($user->isAdmin())',s.index('private function scoped'));b=s.index('\n    }',a);s=s[:a]+"        return app(\\App\\Services\\EntrepriseAccess::class)->query($user);"+s[b:]
s=s.replace("'entreprise' => $entreprise->exists ? $entreprise : null,", "'entreprise' => $entreprise->exists ? $entreprise : null,\n            'canEdit' => $entreprise->exists ? $user->can('update', $entreprise) : $user->can('create', Entreprise::class),")
s=s.replace("if ($user->isMrcManager()) {\n            $villes", "if (! app(\\App\\Services\\EntrepriseAccess::class)->globalWrite($user) && ($user->isMrcManager() || $user->hasPermission('manageEntrepriseInSameMRC'))) {\n            $villes")
write(p,s)
p='app/Http/Controllers/Admin/EntrepriseProduitController.php';replace(p,"'entreprise' => $entreprise->only('id', 'nom'),", "'entreprise' => $entreprise->only('id', 'nom'),\n            'canEdit' => $request->user()->can('update', $entreprise),")
p='app/Http/Requests/Admin/EntrepriseRequest.php';replace(p,"if ($user?->isMrcManager() && $this->filled('ville_id'))", "if ($user && ! app(\\App\\Services\\EntrepriseAccess::class)->globalWrite($user) && ($user->isMrcManager() || $user->hasPermission('manageEntrepriseInSameMRC')) && $this->filled('ville_id'))")
p='resources/js/pages/admin/Entreprises/Form.vue';s=read(p).replace('    entreprise?: any;', '    entreprise?: any;\n    canEdit: boolean;').replace('function save() {','function save() {\n    if (!props.canEdit) return;').replace('<form class="space-y-5" @submit.prevent="save">','<p v-if="!canEdit" class="mb-4 rounded border bg-white p-3">Consultation seulement : votre compte ne peut pas modifier cette fiche.</p><form class="space-y-5" @submit.prevent="save"><fieldset :disabled="!canEdit" class="min-w-0 space-y-5">').replace('            </div></form','            </div></fieldset></form').replace('label="Enregistrer"', 'v-if="canEdit" label="Enregistrer"');write(p,s)
p='resources/js/pages/admin/Entreprises/Products.vue';s=read(p).replace('    entreprise: any;', '    entreprise: any;\n    canEdit: boolean;').replace('label="Ajouter un produit"','v-if="canEdit" label="Ajouter un produit"').replace('<Column header="Actions"','<Column v-if="canEdit" header="Actions"');write(p,s)
p='tests/Feature/Admin/EntreprisePolicyTest.php';s=read(p).replace("$user->shouldReceive('isEntreprise')->andReturnTrue();", "$user->shouldReceive('isEntreprise')->andReturnTrue();\n    $user->shouldReceive('hasPermission')->andReturnFalse();\n    $user->shouldReceive('isMrcManager')->andReturnFalse();");write(p,s)
