Пример #1
0
 public function create_operation()
 {
     $this->load->helper('operations');
     $operation_data_temp = $this->input->post('operation');
     $this->db->trans_begin();
     $form = $this->get_form(@$operation_data_temp['type'], @$operation_data_temp['subtraction_type']);
     build_validator_from_form($form);
     if ($this->form_validation->run()) {
         $operation_data = $this->input->post('operation');
         $operation_service_data = $this->input->post('operation_service');
         $operation_product_data = $this->input->post('operation_product');
         $operations_addition = new Operation();
         $operations_addition->where('type', Operation::TYPE_ADDITION);
         $operations_addition->select_sum('amount', 'amount_sum');
         $operations_addition->where_related_person('id', '${parent}.id');
         $operations_subtraction_direct = new Operation();
         $operations_subtraction_direct->where('type', Operation::TYPE_SUBTRACTION);
         $operations_subtraction_direct->where('subtraction_type', Operation::SUBTRACTION_TYPE_DIRECT);
         $operations_subtraction_direct->select_sum('amount', 'amount_sum');
         $operations_subtraction_direct->where_related_person('id', '${parent}.id');
         $operations_subtraction_products = new Operation();
         $operations_subtraction_products->where('type', Operation::TYPE_SUBTRACTION);
         $operations_subtraction_products->where('subtraction_type', Operation::SUBTRACTION_TYPE_PRODUCTS);
         $operations_subtraction_products->where_related('product_quantity', 'price >', 0);
         $operations_subtraction_products->group_start(' NOT', 'AND');
         $operations_subtraction_products->where_related('product_quantity', 'product_id', NULL);
         $operations_subtraction_products->group_end();
         unset($operations_subtraction_products->db->ar_select[0]);
         $operations_subtraction_products->select_func('SUM', array('@product_quantities.quantity', '*', '@product_quantities.price', '*', '@product_quantities.multiplier'), 'amount_sum');
         $operations_subtraction_products->where_related_person('id', '${parent}.id');
         $operations_subtraction_services = new Operation();
         $operations_subtraction_services->where('type', Operation::TYPE_SUBTRACTION);
         $operations_subtraction_services->where('subtraction_type', Operation::SUBTRACTION_TYPE_SERVICES);
         $operations_subtraction_services->where_related('service_usage', 'price >', 0);
         $operations_subtraction_services->group_start(' NOT', 'AND');
         $operations_subtraction_services->where_related('service_usage', 'service_id', NULL);
         $operations_subtraction_services->group_end();
         unset($operations_subtraction_services->db->ar_select[0]);
         $operations_subtraction_services->select_func('SUM', array('@service_usages.quantity', '*', '@service_usages.price', '*', '@service_usages.multiplier'), 'amount_sum');
         $operations_subtraction_services->where_related_person('id', '${parent}.id');
         $person = new Person();
         $person->where('admin', 0);
         $person->select('*');
         $person->select_subquery($operations_addition, 'plus_amount');
         $person->select_subquery($operations_subtraction_direct, 'minus_amount_direct');
         $person->select_subquery($operations_subtraction_products, 'minus_amount_products');
         $person->select_subquery($operations_subtraction_services, 'minus_amount_services');
         $person->get_by_id((int) $operation_data['person_id']);
         if (!$person->exists()) {
             $this->db->trans_rollback();
             add_error_flash_message('Účastník sa nenašiel.');
             redirect(site_url('operations/new_operation'));
         }
         $admin = new Person();
         $admin->where('admin', 1);
         $admin->get_by_id((int) auth_get_id());
         if (!$admin->exists()) {
             $this->db->trans_rollback();
             add_error_flash_message('Administrátor sa nenašiel.');
             redirect(site_url('operations/new_operation'));
         }
         $workplace = new Workplace();
         if ((int) $operation_data['workplace_id'] > 0) {
             $workplace->get_by_id((int) $operation_data['workplace_id']);
             if (!$workplace->exists()) {
                 $this->db->trans_rollback();
                 add_error_flash_message('Zamestnanie sa nenašlo.');
                 redirect(site_url('operations/new_operation'));
             }
         }
         if ($operation_data['type'] == Operation::TYPE_ADDITION) {
             $amount_to_add = (double) $operation_data['amount'];
             $remaining = 0;
             if ($operation_data['addition_type'] == Operation::ADDITION_TYPE_TRANSFER && !operations_ledcoin_addition_possible($amount_to_add, $remaining)) {
                 $this->db->trans_rollback();
                 add_error_flash_message('Nedá sa prideliť <strong>' . $amount_to_add . '</strong> ' . get_inflection_ledcoin($amount_to_add) . ', na účte vedúcich zostáva iba <strong>' . $remaining . '</strong> ' . get_inflection_ledcoin($remaining) . '.');
                 redirect('operations');
                 return;
             }
             if ($operation_data['addition_type'] == Operation::ADDITION_TYPE_TRANSFER && !operations_ledcoin_limit_check($amount_to_add)) {
                 add_common_flash_message('Pozor, pridanie ' . $amount_to_add . ' LEDCOIN-ov presahuje denný limit. Pred pridaním bolo už použitých ' . operations_ledcoin_added_in_day() . ' z ' . operations_ledcoin_daily_limit() . ' LEDCOIN-ov!');
             }
             $operation = new Operation();
             $operation->from_array($operation_data, array('comment', 'amount', 'type', 'addition_type'));
             $operation->subtraction_type = Operation::SUBTRACTION_TYPE_DIRECT;
             if ($operation->save(array('person' => $person, 'admin' => $admin, 'workplace' => $workplace)) && $this->db->trans_status()) {
                 $this->db->trans_commit();
                 add_success_flash_message('Účastník <strong>' . $person->name . ' ' . $person->surname . '</strong> dostal <strong>' . $operation->amount . '</strong> ' . get_inflection_ledcoin((double) $operation->amount) . ' úspešne.');
                 redirect(site_url('operations'));
             } else {
                 $this->db->trans_rollback();
                 add_error_flash_message('Účastníkovi <strong>' . $person->name . ' ' . $person->surname . '</strong> sa nepodarilo prideliť <strong>' . $operation->amount . '</strong> ' . get_inflection_ledcoin((double) $operation->amount) . '.');
                 redirect(site_url('operations/new_operation'));
             }
         } else {
             $amount_at_disposal = doubleval($person->plus_amount) - doubleval($person->minus_amount_direct) - doubleval($person->minus_amount_products) - doubleval($person->minus_amount_services);
             $total_amount = 0;
             if ($operation_data['subtraction_type'] == Operation::SUBTRACTION_TYPE_DIRECT) {
                 $total_amount += (double) $operation_data['amount'];
             }
             $service_data = array();
             if ($operation_data['subtraction_type'] == Operation::SUBTRACTION_TYPE_SERVICES) {
                 $services = new Service();
                 $services->order_by('title', 'asc');
                 $services->get_iterated();
                 foreach ($services as $service) {
                     if (isset($operation_service_data[$service->id])) {
                         if (isset($operation_service_data[$service->id]['quantity']) && (int) $operation_service_data[$service->id]['quantity'] > 0 && isset($operation_service_data[$service->id]['price']) && (double) $operation_service_data[$service->id]['price'] > 0) {
                             $service_data[$service->id] = $operation_service_data[$service->id];
                             $total_amount += (int) $operation_service_data[$service->id]['quantity'] * (double) $operation_service_data[$service->id]['price'] * (double) $operation_data['multiplier'];
                         }
                     }
                 }
             }
             $product_data = array();
             if ($operation_data['subtraction_type'] == Operation::SUBTRACTION_TYPE_PRODUCTS) {
                 $quantity_addition = new Product_quantity();
                 $quantity_addition->select_sum('quantity', 'quantity_sum');
                 $quantity_addition->where('type', Product_quantity::TYPE_ADDITION);
                 $quantity_addition->where_related('product', 'id', '${parent}.id');
                 $quantity_subtraction = new Product_quantity();
                 $quantity_subtraction->select_sum('quantity', 'quantity_sum');
                 $quantity_subtraction->where('type', Product_quantity::TYPE_SUBTRACTION);
                 $quantity_subtraction->where_related('product', 'id', '${parent}.id');
                 $products = new Product();
                 $products->order_by('title', 'asc');
                 $products->select('*');
                 $products->select_subquery($quantity_addition, 'plus_quantity');
                 $products->select_subquery($quantity_subtraction, 'minus_quantity');
                 $products->get_iterated();
                 foreach ($products as $product) {
                     if (isset($operation_product_data[$product->id])) {
                         if (isset($operation_product_data[$product->id]['quantity']) && (int) $operation_product_data[$product->id]['quantity'] > 0 && isset($operation_product_data[$product->id]['price']) && (double) $operation_product_data[$product->id]['price'] > 0) {
                             $product_data[$product->id] = $operation_product_data[$product->id];
                             $total_amount += (int) $operation_product_data[$product->id]['quantity'] * (double) $operation_product_data[$product->id]['price'] * (double) $operation_data['multiplier'];
                         }
                     }
                 }
             }
             if ($total_amount > $amount_at_disposal) {
                 $this->db->trans_rollback();
                 add_error_flash_message('Účastník <strong>' . $person->name . ' ' . $person->surname . '</strong> nemá dostatok LEDCOIN-u. Potrebuje <strong>' . $total_amount . '</strong> ' . get_inflection_ledcoin((double) $total_amount) . ' ale má iba <strong>' . $amount_at_disposal . '</strong> ' . get_inflection_ledcoin((double) $amount_at_disposal) . '.');
                 redirect(site_url('operations/new_operation'));
             }
             if ($total_amount == 0) {
                 $this->db->trans_rollback();
                 add_error_flash_message('Celková suma LEDCOIN-u na odobratie je nulová, preto nie je možné pokračovať.');
                 redirect(site_url('operations/new_operation'));
             }
             $operation = new Operation();
             $operation->from_array($operation_data, array('comment', 'type', 'subtraction_type'));
             if ($operation_data['subtraction_type'] == Operation::SUBTRACTION_TYPE_DIRECT) {
                 $operation->amount = (double) $operation_data['amount'];
             } else {
                 $operation->amount = 0.0;
             }
             if ($operation->save(array('person' => $person, 'admin' => $admin, 'workplace' => $workplace)) && $this->db->trans_status()) {
                 if (count($service_data) > 0) {
                     foreach ($service_data as $service_id => $service_post) {
                         $service_usage = new Service_usage();
                         $service_usage->from_array($service_post, array('quantity', 'price'));
                         $service_usage->multiplier = (double) $operation_data['multiplier'];
                         $service_usage->service_id = (int) $service_id;
                         if (!$service_usage->save(array('operation' => $operation))) {
                             $service = new Service();
                             $service->get_by_id((int) $service_id);
                             $this->db->trans_rollback();
                             add_error_flash_message('Nepodarilo sa uložiť záznam o odobratí LEDCOIN-u za službu <strong>' . $service->title . '</strong>.');
                             redirect(site_url('operations/new_operation'));
                             die;
                         }
                     }
                 }
                 if (count($product_data) > 0) {
                     foreach ($product_data as $product_id => $product_post) {
                         $product_quantity = new Product_quantity();
                         $product_quantity->type = Product_quantity::TYPE_SUBTRACTION;
                         $product_quantity->from_array($product_post, array('quantity', 'price'));
                         $product_quantity->multiplier = (double) $operation_data['multiplier'];
                         $product_quantity->product_id = (int) $product_id;
                         if (!$product_quantity->save(array('operation' => $operation))) {
                             $product = new Product();
                             $product->get_by_id((int) $product_id);
                             $this->db->trans_rollback();
                             add_error_flash_message('Nepodarilo sa uložiť záznam o odobratí LEDCOIN-u za produkt <strong>' . $product->title . '</strong>.');
                             redirect(site_url('operations/new_operation'));
                             die;
                         }
                     }
                 }
                 $this->db->trans_commit();
                 add_success_flash_message('Účastníkovi <strong>' . $person->name . ' ' . $person->surname . '</strong> sa úspešne podarilo odobrať <strong>' . $total_amount . '</strong> ' . get_inflection_ledcoin((double) $total_amount) . '.');
                 redirect(site_url('operations'));
             } else {
                 $this->db->trans_rollback();
                 add_error_flash_message('Účastníkovi <strong>' . $person->name . ' ' . $person->surname . '</strong> sa nepodarilo odobrať <strong>' . $total_amount . '</strong> ' . get_inflection_ledcoin((double) $total_amount) . '.');
                 redirect(site_url('operations/new_operation'));
             }
         }
     } else {
         $this->db->trans_rollback();
         $this->new_operation();
     }
 }
Пример #2
0
 public function do_batch_stock_addition()
 {
     $this->db->trans_begin();
     build_validator_from_form($this->get_batch_stock_addition_form());
     if ($this->form_validation->run()) {
         $products = new Product();
         $products->get_iterated();
         $product_quantity_data = $this->input->post('product_quantity_addition');
         $success_messages = array();
         $error_messages = array();
         $added = 0;
         $failed = 0;
         foreach ($products as $product) {
             if (isset($product_quantity_data[$product->id]['quantity']) && (int) $product_quantity_data[$product->id]['quantity'] > 0) {
                 $product_quantity = new Product_quantity();
                 $product_quantity->type = Product_quantity::TYPE_ADDITION;
                 $product_quantity->quantity = (int) $product_quantity_data[$product->id]['quantity'];
                 $product_quantity->price = NULL;
                 $product_quantity->operation_id = NULL;
                 if ($product_quantity->save($product) && $this->db->trans_status()) {
                     $added++;
                     $success_messages[] = 'Produktu <strong>' . $product->title . '</strong> ' . get_inflection_by_numbers((int) $product_quantity->quantity, 'bolo pridaných', 'bol pridaný', 'boli pridané', 'boli pridané', 'boli pridané', 'bolo pridaných') . ' <strong>' . $product_quantity->quantity . '</strong> ' . get_inflection_by_numbers((int) $product_quantity->quantity, 'kusov', 'kus', 'kusy', 'kusy', 'kusy', 'kusov') . ' zásob na sklad.';
                 } else {
                     $failed++;
                     $error_messages[] = 'Produktu <strong>' . $product->title . '</strong> sa nepodarilo pridať <strong>' . $product_quantity->quantity . '</strong> ' . get_inflection_by_numbers((int) $product_quantity->quantity, 'kusov', 'kus', 'kusy', 'kusy', 'kusy', 'kusov') . ' zásob na sklad.';
                 }
             }
         }
         if ($added == 0 && $failed == 0) {
             $this->db->trans_rollback();
             add_common_flash_message('Nebolo nič pridané, keďže bol odoslaný prázdny formulár.');
             redirect(site_url('products'));
         } elseif ($added == 0 && $failed > 0) {
             $this->db->trans_rollback();
             add_error_flash_message('Nepodarilo sa pridať žiadne zásoby na sklad:<br /><br />' . implode('<br />', $error_messages));
             redirect(site_url('products/batch_stock_addition'));
         } else {
             $this->db->trans_commit();
             if ($added > 0) {
                 add_success_flash_message('Boli pridané zásoby k celkovo <strong>' . $added . '</strong> ' . get_inflection_by_numbers($added, 'produktom', 'produktu', 'produktom', 'produktom', 'produktom', 'produktom') . ':<br /><br />' . implode('<br />', $success_messages));
             }
             if ($failed > 0) {
                 add_error_flash_message('K <strong>' . $failed . '</strong> ' . get_inflection_by_numbers($failed, 'produktom', 'produktu', 'produktom', 'produktom', 'produktom', 'produktom') . ' sa nepodarilo pridat zásoby:<br /><br />' . implode('<br />', $error_messages));
             }
             redirect(site_url('products'));
         }
     } else {
         $this->db->trans_rollback();
         $this->batch_stock_addition();
     }
 }