diff --git a/.idea/dataSources.xml b/.idea/dataSources.xml index 0b73c9c..15f93b9 100644 --- a/.idea/dataSources.xml +++ b/.idea/dataSources.xml @@ -5,7 +5,7 @@ postgresql true org.postgresql.Driver - jdbc:postgresql://localhost:5433/ferme + jdbc:postgresql://localhost:5432/ferme $ProjectFileDir$ diff --git a/.idea/workspace.xml b/.idea/workspace.xml index d5f5372..640ad2e 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -5,9 +5,18 @@ + + + + + + + + + @@ -25,8 +34,8 @@ - + @@ -214,36 +223,36 @@ - { - "keyToString": { - "RunOnceActivity.MCP Project settings loaded": "true", - "RunOnceActivity.ShowReadmeOnStart": "true", - "RunOnceActivity.TerminalTabsStorage.copyFrom.TerminalArrangementManager.252": "true", - "RunOnceActivity.git.unshallow": "true", - "RunOnceActivity.typescript.service.memoryLimit.init": "true", - "git-widget-placeholder": "develop", - "last_opened_file_path": "/home/sroy/Documents/test/Ferme", - "node.js.detected.package.eslint": "true", - "node.js.detected.package.tslint": "true", - "node.js.selected.package.eslint": "(autodetect)", - "node.js.selected.package.tslint": "(autodetect)", - "nodejs_package_manager_path": "npm", - "settings.editor.selected.configurable": "configurable.group.appearance", - "ts.external.directory.path": "/opt/phpstorm/plugins/javascript-plugin/jsLanguageServicesImpl/external", - "vue.rearranger.settings.migration": "true" + +}]]> @@ -733,6 +742,22 @@ + + + + + file://$PROJECT_DIR$/src/Entity/ReceptionPelletBuilding.php + 6 + + + + file://$PROJECT_DIR$/src/Entity/Reception.php + 6 + + + + + diff --git a/frontend/components/reception/reception-bovine-received.vue b/frontend/components/reception/reception-bovine-received.vue new file mode 100644 index 0000000..00e9ec9 --- /dev/null +++ b/frontend/components/reception/reception-bovine-received.vue @@ -0,0 +1,41 @@ + + + + + + + + + + + diff --git a/frontend/components/reception/reception-product-received.vue b/frontend/components/reception/reception-product-received.vue index aed56c6..5e3d9d0 100644 --- a/frontend/components/reception/reception-product-received.vue +++ b/frontend/components/reception/reception-product-received.vue @@ -1,10 +1,11 @@ - + - Sélectionner des marchandises réceptionnnées + Sélection des marchandises réceptionnnées + + + + Sélection des races réceptionnnées + + Peser + >Peser + diff --git a/frontend/i18n/locales/fr.json b/frontend/i18n/locales/fr.json index 6f9026f..cc66034 100644 --- a/frontend/i18n/locales/fr.json +++ b/frontend/i18n/locales/fr.json @@ -1,64 +1,72 @@ { - "errors": { - "http": { - "get": "Impossible de récupérer les données.", - "post": "Impossible de créer la ressource.", - "put": "Impossible de mettre à jour la ressource.", - "patch": "Impossible de mettre à jour la ressource.", - "delete": "Impossible de supprimer la ressource." + "errors": { + "http": { + "get": "Impossible de récupérer les données.", + "post": "Impossible de créer la ressource.", + "put": "Impossible de mettre à jour la ressource.", + "patch": "Impossible de mettre à jour la ressource.", + "delete": "Impossible de supprimer la ressource." + }, + "reception": { + "list": "Impossible de récupérer la liste des réceptions.", + "fetch": "Impossible de récupérer la réception.", + "create": "Impossible de créer la réception.", + "update": "Impossible de mettre à jour la réception.", + "weigh": "Impossible de récupérer la pesée." + }, + "receptionType": { + "list": "Impossible de récupérer la liste des types de réception." + }, + "merchandiseType": { + "list": "Impossible de récupérer la liste des types de marchandises." + }, + "building": { + "list": "Impossible de récupérer la liste des bâtiments." + }, + "pelletType": { + "list": "Impossible de récupérer la liste des types de granulés." + }, + "receptionPelletBuilding": { + "list": "Impossible de récupérer la liste des dépôts de granulés.", + "create": "Impossible d'enregistrer le dépôt de granulés.", + "delete": "Impossible de supprimer le dépôt de granulés." + }, + "receptionBovine": { + "list": "Impossible de récupérer la liste des bovins de la réception.", + "create": "Impossible d'enregistrer le bovin.", + "delete": "Impossible de supprimer le bovin." + }, + "supplier": { + "list": "Impossible de récupérer la liste des fournisseurs." + }, + "truck": { + "list": "Impossible de récupérer la liste des camions." + }, + "bovin": { + "list": "Impossible de récupérer la liste des races de bovins." + }, + "carrier": { + "list": "Impossible de récupérer la liste des transporteurs." + }, + "driver": { + "list": "Impossible de récupérer la liste des chauffeurs." + }, + "vehicle": { + "list": "Impossible de récupérer la liste des immatriculations." + }, + "auth": { + "login": "Identifiants invalides.", + "users": "Impossible de récupérer les utilisateurs.", + "logout": "Impossible de se déconnecter." + } }, - "reception": { - "list": "Impossible de récupérer la liste des réceptions.", - "fetch": "Impossible de récupérer la réception.", - "create": "Impossible de créer la réception.", - "update": "Impossible de mettre à jour la réception.", - "weigh": "Impossible de récupérer la pesée." - }, - "receptionType": { - "list": "Impossible de récupérer la liste des types de réception." - }, - "merchandiseType": { - "list": "Impossible de récupérer la liste des types de marchandises." - }, - "building": { - "list": "Impossible de récupérer la liste des bâtiments." - }, - "pelletType": { - "list": "Impossible de récupérer la liste des types de granulés." - }, - "receptionPelletBuilding": { - "list": "Impossible de récupérer la liste des dépôts de granulés.", - "create": "Impossible d'enregistrer le dépôt de granulés.", - "delete": "Impossible de supprimer le dépôt de granulés." - }, - "supplier": { - "list": "Impossible de récupérer la liste des fournisseurs." - }, - "truck": { - "list": "Impossible de récupérer la liste des camions." - }, - "carrier": { - "list": "Impossible de récupérer la liste des transporteurs." - }, - "driver": { - "list": "Impossible de récupérer la liste des chauffeurs." - }, - "vehicle": { - "list": "Impossible de récupérer la liste des immatriculations." - }, - "auth": { - "login": "Identifiants invalides.", - "users": "Impossible de récupérer les utilisateurs.", - "logout": "Impossible de se déconnecter." + "success": { + "reception": { + "update": "Réception mise à jour avec succès." + }, + "auth": { + "login": "Connexion réussie.", + "logout": "Déconnexion réussie." + } } - }, - "success": { - "reception": { - "update": "Réception mise à jour avec succès." - }, - "auth": { - "login": "Connexion réussie.", - "logout": "Déconnexion réussie." - } - } } diff --git a/frontend/services/bovine-type.ts b/frontend/services/bovine-type.ts new file mode 100644 index 0000000..4e4dafd --- /dev/null +++ b/frontend/services/bovine-type.ts @@ -0,0 +1,23 @@ +import { useApi } from '~/composables/useApi' +import type {BovineTypeData} from "~/services/dto/bovine-type-data"; + +export type BovineTypeListResponse = + | BovineTypeData[] + | { 'hydra:member'?: BovineTypeData[] } + +export async function getBovineTypeList(): Promise { + const api = useApi() + const response = await api.get('bovine_types', {}, { + toastErrorKey: 'errors.bovin.list' + }) + + if (Array.isArray(response)) { + return response + } + + if (response && typeof response === 'object' && Array.isArray(response['hydra:member'])) { + return response['hydra:member'] + } + + return [] +} diff --git a/frontend/services/dto/bovine-type-data.ts b/frontend/services/dto/bovine-type-data.ts new file mode 100644 index 0000000..c12ca7c --- /dev/null +++ b/frontend/services/dto/bovine-type-data.ts @@ -0,0 +1,5 @@ +export interface BovineTypeData{ + id: number + label: string + code: string +} diff --git a/frontend/utils/constants.ts b/frontend/utils/constants.ts index 3676886..507b268 100644 --- a/frontend/utils/constants.ts +++ b/frontend/utils/constants.ts @@ -1,5 +1,6 @@ export const RECEPTION_TYPE_CODES = { - MERCHANDISES: 'MARCHANDISES' + MERCHANDISES: 'MARCHANDISES', + BOVINS: 'BOVINS' } as const export const MERCHANDISE_TYPE_CODES = { diff --git a/migrations/Version20260203123833.php b/migrations/Version20260203123833.php new file mode 100644 index 0000000..05296c7 --- /dev/null +++ b/migrations/Version20260203123833.php @@ -0,0 +1,39 @@ +addSql('CREATE TABLE bovine_type (id INT GENERATED BY DEFAULT AS IDENTITY NOT NULL, label VARCHAR(120) NOT NULL, code VARCHAR(50) NOT NULL, PRIMARY KEY (id))'); + $this->addSql('CREATE TABLE reception_bovine (id INT GENERATED BY DEFAULT AS IDENTITY NOT NULL, quantity INT NOT NULL, reception_id INT DEFAULT NULL, bovine_type_id INT NOT NULL, PRIMARY KEY (id))'); + $this->addSql('CREATE INDEX IDX_636B9DB97C14DF52 ON reception_bovine (reception_id)'); + $this->addSql('CREATE INDEX IDX_636B9DB97899F32E ON reception_bovine (bovine_type_id)'); + $this->addSql('ALTER TABLE reception_bovine ADD CONSTRAINT FK_636B9DB97C14DF52 FOREIGN KEY (reception_id) REFERENCES reception (id)'); + $this->addSql('ALTER TABLE reception_bovine ADD CONSTRAINT FK_636B9DB97899F32E FOREIGN KEY (bovine_type_id) REFERENCES bovine_type (id) NOT DEFERRABLE'); + } + + public function down(Schema $schema): void + { + // this down() migration is auto-generated, please modify it to your needs + $this->addSql('ALTER TABLE reception_bovine DROP CONSTRAINT FK_636B9DB97C14DF52'); + $this->addSql('ALTER TABLE reception_bovine DROP CONSTRAINT FK_636B9DB97899F32E'); + $this->addSql('DROP TABLE bovine_type'); + $this->addSql('DROP TABLE reception_bovine'); + } +} diff --git a/src/Entity/BovineType.php b/src/Entity/BovineType.php new file mode 100644 index 0000000..106fdfd --- /dev/null +++ b/src/Entity/BovineType.php @@ -0,0 +1,70 @@ + '\d+'], + normalizationContext: ['groups' => ['bovine-type:read']], + ), + new GetCollection( + normalizationContext: ['groups' => ['bovine-type:read']], + ), + ], + security: "is_granted('ROLE_USER')", +)] +class BovineType +{ + #[ORM\Id] + #[ORM\GeneratedValue] + #[ORM\Column] + #[Groups(['bovine-type:read', 'reception:read'])] + private ?int $id = null; + + #[ORM\Column(length: 120)] + #[Groups(['bovine-type:read', 'reception:read'])] + private ?string $label = null; + + #[ORM\Column(length: 50)] + #[Groups(['bovine-type:read', 'reception:read'])] + private ?string $code = null; + + public function getId(): ?int + { + return $this->id; + } + + public function getLabel(): ?string + { + return $this->label; + } + + public function setLabel(string $label): static + { + $this->label = $label; + + return $this; + } + + public function getCode(): ?string + { + return $this->code; + } + + public function setCode(string $code): static + { + $this->code = $code; + + return $this; + } +} diff --git a/src/Entity/Reception.php b/src/Entity/Reception.php index 636dc3d..6682ae0 100644 --- a/src/Entity/Reception.php +++ b/src/Entity/Reception.php @@ -168,6 +168,13 @@ class Reception #[ApiProperty(readableLink: true)] private ?Driver $driver = null; + /** + * @var Collection + */ + #[ORM\OneToMany(targetEntity: ReceptionBovine::class, mappedBy: 'reception', cascade: ['persist', 'remove'], orphanRemoval: true)] + #[Groups(['reception:read', 'reception:write'])] + private Collection $bovines_types; + public function __construct( ?DateTimeImmutable $receptionDate = null, ) { @@ -175,6 +182,7 @@ class Reception $this->weights = new ArrayCollection(); $this->buildings = new ArrayCollection(); $this->pelletBuildings = new ArrayCollection(); + $this->bovines_types = new ArrayCollection(); } public function getId(): ?int @@ -469,4 +477,34 @@ class Reception ) ; } + + /** + * @return Collection + */ + public function getBovinesTypes(): Collection + { + return $this->bovines_types; + } + + public function addBovinesType(ReceptionBovine $bovinesType): static + { + if (!$this->bovines_types->contains($bovinesType)) { + $this->bovines_types->add($bovinesType); + $bovinesType->setReception($this); + } + + return $this; + } + + public function removeBovinesType(ReceptionBovine $bovinesType): static + { + if ($this->bovines_types->removeElement($bovinesType)) { + // set the owning side to null (unless already changed) + if ($bovinesType->getReception() === $this) { + $bovinesType->setReception(null); + } + } + + return $this; + } } diff --git a/src/Entity/ReceptionBovine.php b/src/Entity/ReceptionBovine.php new file mode 100644 index 0000000..94938bb --- /dev/null +++ b/src/Entity/ReceptionBovine.php @@ -0,0 +1,94 @@ + '\d+'], + normalizationContext: ['groups' => ['reception-bovine:read']], + ), + new GetCollection( + normalizationContext: ['groups' => ['reception-bovine:read']], + ), + new Post( + normalizationContext: ['groups' => ['reception-bovine:read']], + denormalizationContext: ['groups' => ['reception-bovine:write']], + ), + new Delete(), + ], + security: "is_granted('ROLE_USER')", +)] +class ReceptionBovine +{ + #[ORM\Id] + #[ORM\GeneratedValue] + #[ORM\Column] + #[Groups(['reception-bovine:read', 'reception:read'])] + private ?int $id = null; + + #[ORM\ManyToOne(inversedBy: 'bovines_types')] + #[Groups(['reception-bovine:read'])] + private ?Reception $reception = null; + + #[ORM\ManyToOne] + #[ORM\JoinColumn(nullable: false)] + #[Groups(['reception-bovine:read', 'reception:read'])] + private ?BovineType $BovineType = null; + + #[ORM\Column(options: ['default' => 0])] + #[Groups(['reception-bovine:read', 'reception:read'])] + private ?int $Quantity = null; + + public function getId(): ?int + { + return $this->id; + } + + public function getReception(): ?Reception + { + return $this->reception; + } + + public function setReception(?Reception $reception): static + { + $this->reception = $reception; + + return $this; + } + + public function getBovineType(): ?BovineType + { + return $this->BovineType; + } + + public function setBovineType(?BovineType $BovineType): static + { + $this->BovineType = $BovineType; + + return $this; + } + + public function getQuantity(): ?int + { + return $this->Quantity; + } + + public function setQuantity(int $Quantity): static + { + $this->Quantity = $Quantity; + + return $this; + } +} diff --git a/src/Repository/BovineTypeRepository.php b/src/Repository/BovineTypeRepository.php new file mode 100644 index 0000000..ea7025a --- /dev/null +++ b/src/Repository/BovineTypeRepository.php @@ -0,0 +1,45 @@ + + */ +class BovineTypeRepository extends ServiceEntityRepository +{ + public function __construct(ManagerRegistry $registry) + { + parent::__construct($registry, BovineType::class); + } + + // /** + // * @return BovineType[] Returns an array of BovineType objects + // */ + // public function findByExampleField($value): array + // { + // return $this->createQueryBuilder('b') + // ->andWhere('b.exampleField = :val') + // ->setParameter('val', $value) + // ->orderBy('b.id', 'ASC') + // ->setMaxResults(10) + // ->getQuery() + // ->getResult() + // ; + // } + + // public function findOneBySomeField($value): ?BovineType + // { + // return $this->createQueryBuilder('b') + // ->andWhere('b.exampleField = :val') + // ->setParameter('val', $value) + // ->getQuery() + // ->getOneOrNullResult() + // ; + // } +} diff --git a/src/Repository/ReceptionBovineRepository.php b/src/Repository/ReceptionBovineRepository.php new file mode 100644 index 0000000..90bee8b --- /dev/null +++ b/src/Repository/ReceptionBovineRepository.php @@ -0,0 +1,45 @@ + + */ +class ReceptionBovineRepository extends ServiceEntityRepository +{ + public function __construct(ManagerRegistry $registry) + { + parent::__construct($registry, ReceptionBovine::class); + } + + // /** + // * @return ReceptionBovine[] Returns an array of ReceptionBovine objects + // */ + // public function findByExampleField($value): array + // { + // return $this->createQueryBuilder('r') + // ->andWhere('r.exampleField = :val') + // ->setParameter('val', $value) + // ->orderBy('r.id', 'ASC') + // ->setMaxResults(10) + // ->getQuery() + // ->getResult() + // ; + // } + + // public function findOneBySomeField($value): ?ReceptionBovine + // { + // return $this->createQueryBuilder('r') + // ->andWhere('r.exampleField = :val') + // ->setParameter('val', $value) + // ->getQuery() + // ->getOneOrNullResult() + // ; + // } +}