From 6d7c8c5b532809757bab2f89c06daee791724683 Mon Sep 17 00:00:00 2001 From: Korina Cordero Date: Tue, 16 Jan 2024 16:28:26 +0800 Subject: [PATCH] Add saving of item prices for price tier. #780 --- config/packages/catalyst_auth.yaml | 8 - config/packages/catalyst_menu.yaml | 4 - config/routes/item.yaml | 34 ---- src/Controller/ItemController.php | 188 ----------------------- src/Controller/ItemPricingController.php | 63 ++++++-- src/Entity/{Item.php => ItemPrice.php} | 4 +- src/Entity/ItemType.php | 2 +- src/Entity/PriceTier.php | 8 +- 8 files changed, 56 insertions(+), 255 deletions(-) delete mode 100644 config/routes/item.yaml delete mode 100644 src/Controller/ItemController.php rename src/Entity/{Item.php => ItemPrice.php} (98%) diff --git a/config/packages/catalyst_auth.yaml b/config/packages/catalyst_auth.yaml index 7e02d5c0..9707fc93 100644 --- a/config/packages/catalyst_auth.yaml +++ b/config/packages/catalyst_auth.yaml @@ -667,14 +667,6 @@ catalyst_auth: acls: - id: item.menu label: Menu - - id: item.list - label: List - - id: item.add - label: Add - - id: item.update - label: Update - - id: item.delete - label: Delete - id: item_pricing label: Item Pricing acls: diff --git a/config/packages/catalyst_menu.yaml b/config/packages/catalyst_menu.yaml index a6bd1583..7972a414 100644 --- a/config/packages/catalyst_menu.yaml +++ b/config/packages/catalyst_menu.yaml @@ -306,7 +306,3 @@ catalyst_menu: acl: item_pricing.update label: Item Pricing parent: item - - id: item_list - acl: item.list - label: Items - parent: item diff --git a/config/routes/item.yaml b/config/routes/item.yaml deleted file mode 100644 index 89dde4d2..00000000 --- a/config/routes/item.yaml +++ /dev/null @@ -1,34 +0,0 @@ -item_list: - path: /items - controller: App\Controller\ItemController::index - methods: [GET] - -item_rows: - path: /items/rowdata - controller: App\Controller\ItemController::datatableRows - methods: [POST] - -item_add_form: - path: /items/newform - controller: App\Controller\ItemController::addForm - methods: [GET] - -item_add_submit: - path: /items - controller: App\Controller\ItemController::addSubmit - methods: [POST] - -item_update_form: - path: /items/{id} - controller: App\Controller\ItemController::updateForm - methods: [GET] - -item_update_submit: - path: /items/{id} - controller: App\Controller\ItemController::updateSubmit - methods: [POST] - -item_delete: - path: /items/{id} - controller: App\Controller\ItemController::deleteSubmit - methods: [DELETE] diff --git a/src/Controller/ItemController.php b/src/Controller/ItemController.php deleted file mode 100644 index 7e9cd277..00000000 --- a/src/Controller/ItemController.php +++ /dev/null @@ -1,188 +0,0 @@ -render('item/list.html.twig'); - } - - /** - * @IsGranted("item.list") - */ - public function datatableRows(Request $req) - { - // get query builder - $total_qb = $this->getDoctrine() - ->getRepository(Item::class) - ->createQueryBuilder('q'); - - // get datatable params - $datatable = $req->request->get('datatable'); - - // count total records - $tquery = $total_qb->select('COUNT(q)') - ->leftJoin(Battery::class, 'battery', Join::WITH, 'battery.id = q.item_id') - ->leftJoin(ServiceOffering::class, 'so', Join::WITH, 'so.id = q.item_id'); - $this->setQueryFilters($datatable, $tquery); - $total = $tquery->getQuery() - ->getSingleScalarResult(); - - // get current page number - $page = $datatable['pagination']['page'] ?? 1; - - $perpage = $datatable['pagination']['perpage']; - $offset = ($page - 1) * $perpage; - - // add metadata - $meta = [ - 'page' => $page, - 'perpage' => $perpage, - 'pages' => ceil($total / $perpage), - 'total' => $total, - 'sort' => 'asc', - 'field' => 'id' - ]; - - // reset query builder - $qb = $this->getDoctrine() - ->getRepository(Item::class) - ->createQueryBuilder('q'); - - // build query - $query = $qb->select('q') - ->leftJoin(Battery::class, 'battery', Join::WITH, 'battery.id = q.item_id') - ->leftJoin(ServiceOffering::class, 'so', Join::WITH, 'so.id = q.item_id'); - $this->setQueryFilters($datatable, $query); - - // check if sorting is present, otherwise use default - if (isset($datatable['sort']['field']) && !empty($datatable['sort']['field'])) { - $order = $datatable['sort']['sort'] ?? 'asc'; - $query->orderBy('q.' . $datatable['sort']['field'], $order); - } else { - $query->orderBy('q.id', 'asc'); - } - - // get rows for this page - $obj_rows = $query->setFirstResult($offset) - ->setMaxResults($perpage) - ->getQuery() - ->getResult(); - - // process rows - $rows = []; - foreach ($obj_rows as $orow) { - // add row data - $row['id'] = $orow->getID(); - - // add row metadata - $row['meta'] = [ - 'update_url' => '', - 'delete_url' => '' - ]; - - // add crud urls - if ($this->isGranted('item_price.update')) - $row['meta']['update_url'] = $this->generateUrl('item_price_update_form', ['id' => $row['id']]); - if ($this->isGranted('item_price.delete')) - $row['meta']['delete_url'] = $this->generateUrl('item_price_delete', ['id' => $row['id']]); - - $rows[] = $row; - } - - // response - return $this->json([ - 'meta' => $meta, - 'data' => $rows - ]); - } - - /** - * @Menu(selected="item.list") - * @IsGranted("item.add") - */ - public function addForm(EntityManagerInterface $em) - { - $item = new Item(); - - // get the sets for the dropdowns - $sets = $this->generateFormSets($em); - - $params = [ - 'obj' => $item, - 'sets' => $sets, - 'mode' => 'create', - ]; - - // response - return $this->render('item/form.html.twig', $params); - } - - protected function generateFormSets(EntityManagerInterface $em) - { - // item types - $item_types = $em->getRepository(ItemType::class)->findby([], ['name' => 'asc']); - $item_type_set = []; - foreach ($item_types as $it) - { - $item_type_set[$it->getID()] = $it->getName(); - } - - // batteries - $batts = $em->getRepository(Battery::class)->findAll(); - $batt_set = []; - foreach ($batts as $batt) - { - $batt_set[$batt->getID()] = $batt->getModel()->getName() . ' ' . $batt->getSize()->getName(); - } - - // service offerings - $services = $em->getRepository(ServiceOffering::class)->findBy([],['name' => 'asc']); - $service_set = []; - foreach ($services as $service) - { - $service_set[$service->getID()] = $service->getName(); - } - - return [ - 'item_types' => $item_type_set, - 'batteries' => $batt_set, - 'services' => $service_set, - ]; - } - - protected function setQueryFilters($datatable, QueryBuilder $query) - { - // TODO: add filter for item type. - // TODO: fix filter for name since name is with the associated entity - if (isset($datatable['query']['data-rows-search']) && !empty($datatable['query']['data-rows-search'])) { - $query->where('q.name LIKE :filter') - ->setParameter('filter', '%' . $datatable['query']['data-rows-search'] . '%'); - } - } -} diff --git a/src/Controller/ItemPricingController.php b/src/Controller/ItemPricingController.php index f7fd78ec..ac093e82 100644 --- a/src/Controller/ItemPricingController.php +++ b/src/Controller/ItemPricingController.php @@ -63,25 +63,26 @@ class ItemPricingController extends Controller // get the item type $item_type = $em->getRepository(ItemType::class)->find($it_id); + if ($item_type->getCode() == 'battery') + { + // get batteries + $items = $em->getRepository(Battery::class)->findBy(['flag_active' => true], ['id' => 'asc']); + } + else + { + // get service offerings + $items = $em->getRepository(ServiceOffering::class)->findBy([], ['id' => 'asc']); + } + + // on default price tier if ($pt_id == 0) { // default price tier, update battery or service offering, depending on item type // NOTE: battery and service offering prices or fees are stored as decimal. - if ($item_type->getCode() == 'battery') - { - // get batteries - $items = $em->getRepository(Battery::class)->findBy(['flag_active' => true], ['id' => 'asc']); - } - else - { - // get service offerings - $items = $em->getRepository(ServiceOffering::class)->findBy([], ['id' => 'asc']); - } - foreach ($items as $item) { $item_id = $item->getID(); - if (isset[$prices[$item_id]]) + if (isset($prices[$item_id])) { // check item type if ($item_type->getCode() == 'battery') @@ -96,8 +97,42 @@ class ItemPricingController extends Controller // get the price tier $price_tier = $em->getRepository(PriceTier::class)->find($pt_id); - // TODO: finish this + $item_prices = $price_tier->getItems(); + + // clear the tier's item prices + foreach ($item_prices as $ip) + { + $em->remove($ip); + } + + // update the tier's item prices + foreach ($items as $item) + { + $item_id = $item->getID(); + + $item_price = new ItemPrice(); + + $item_price->setItemType($item_type) + ->setPriceTier($price_tier) + ->setItemID($item_id); + + if (isset($prices[$item_id])) + { + $item_price->setPrice($price[$item_id] * 100); + } + else + { + $item_price->setPrice($item->getPrice() * 100); + } + + // save + $em->persist($item_price); + } } + + $em->flush(); + + return $this->redirectToRoute('item_pricing'); } /** @@ -117,7 +152,7 @@ class ItemPricingController extends Controller $pt = $em->getRepository(PriceTier::class)->find($pt_id); // get the items under the price tier - $pt_items = $pt->getItems(); + $pt_items = $pt->getItemPrices(); foreach ($pt_items as $pt_item) { // make item price hash diff --git a/src/Entity/Item.php b/src/Entity/ItemPrice.php similarity index 98% rename from src/Entity/Item.php rename to src/Entity/ItemPrice.php index 2e5ed091..143833ee 100644 --- a/src/Entity/Item.php +++ b/src/Entity/ItemPrice.php @@ -9,7 +9,7 @@ use Doctrine\ORM\Mapping as ORM; * @ORM\Table(name="item") */ -class Item +class ItemPrice { // unique id /** @@ -20,7 +20,7 @@ class Item protected $id; /** - * @ORM\ManyToOne(targetEntity="PriceTier", inversedBy="items") + * @ORM\ManyToOne(targetEntity="PriceTier", inversedBy="item_prices") * @ORM\JoinColumn(name="price_tier_id", referencedColumnName="id") */ protected $price_tier; diff --git a/src/Entity/ItemType.php b/src/Entity/ItemType.php index 3ef422d8..8c24e65c 100644 --- a/src/Entity/ItemType.php +++ b/src/Entity/ItemType.php @@ -37,7 +37,7 @@ class ItemType // items under an item type /** - * @ORM\OneToMany(targetEntity="Item", mappedBy="item_type") + * @ORM\OneToMany(targetEntity="ItemPrice", mappedBy="item_type") */ protected $items; diff --git a/src/Entity/PriceTier.php b/src/Entity/PriceTier.php index d929fc8f..1e2599a5 100644 --- a/src/Entity/PriceTier.php +++ b/src/Entity/PriceTier.php @@ -34,9 +34,9 @@ class PriceTier // items under a price tier /** - * @ORM\OneToMany(targetEntity="Item", mappedBy="price_tier") + * @ORM\OneToMany(targetEntity="ItemPrice", mappedBy="price_tier") */ - protected $items; + protected $item_prices; public function __construct() { @@ -80,9 +80,9 @@ class PriceTier return $this; } - public function getItems() + public function getItemPrices() { - return $this->items; + return $this->item_prices; } }