/public/application/controllers/invoice.php

https://gitlab.com/MichelZuniga/neoinvoice · PHP · 300 lines · 271 code · 26 blank · 3 comment · 81 complexity · 4792675f5538e05d3c3922b86da6b24d MD5 · raw file

  1. <?php
  2. class Invoice extends App_Controller {
  3. function __construct() {
  4. parent::__construct();
  5. $this->load->model("invoice_model");
  6. }
  7. function list_items($page = 0, $sort_col = 'name') {
  8. $this->load->helper('table_sort_helper');
  9. $sort_col = preg_replace('/[^a-z\-_]*/','', $sort_col); //remove invalid characters to prevent SQL-injections
  10. $data['invoices'] = $this->invoice_model->select_multiple($this->session->userdata('company_id'), $page, $this->pref_user['per_page'], TRUE, $sort_col);
  11. $data['total'] = $this->invoice_model->get_total($this->session->userdata('company_id'));
  12. $data['page'] = $page;
  13. $data['sort_column'] = $sort_col;
  14. $data['per_page'] = $this->pref_user['per_page'];
  15. $this->load->view('invoice/xhr_list_items', $data);
  16. }
  17. function list_by_project($project_id, $page = 0, $sort_col = '') {
  18. $this->load->view('invoice/xhr_list_items_project', $data);
  19. }
  20. function list_by_client($client_id, $page = 0, $sort_col = '') {
  21. $this->load->view('invoice/xhr_list_items_client', $data);
  22. }
  23. function list_pending($page = 0, $sort_col = '') {
  24. $this->load->view('invoice/xhr_list_items', $data);
  25. }
  26. function list_tree($initial = '') {
  27. $data['invoices'] = $this->invoice_model->select_multiple($this->session->userdata('company_id'));
  28. if ($initial)
  29. $data['no_tree'] = true;
  30. $this->load->view('invoice/xhr_display_tree', $data);
  31. }
  32. function view($invoice_id) {
  33. if ($this->security_model->own_invoice($invoice_id)) {
  34. $this->load->model('payment_model');
  35. $this->load->model('expense_model');
  36. $data['invoice'] = $this->invoice_model->select_single($invoice_id);
  37. $data['segments'] = $this->invoice_model->select_segments_by_invoice($invoice_id);
  38. $data['payments'] = $this->payment_model->select_multiple($invoice_id);
  39. $data['expenses'] = $this->expense_model->select_multiple($invoice_id);
  40. $this->load->view('invoice/xhr_view', $data);
  41. } else {
  42. $data['error'] = $this->lang->line('error_select_invoice');
  43. $this->load->view('xhr_error', $data);
  44. }
  45. }
  46. function download_pdf($invoice_id) {
  47. if ($this->security_model->own_invoice($invoice_id)) {
  48. $this->invoice_model->generate_pdf($invoice_id, true, 'invoice.pdf');
  49. } else {
  50. $data['error'] = $this->lang->line('error_select_invoice');
  51. $this->load->view('xhr_error', $data);
  52. }
  53. }
  54. function send($invoice_id) {
  55. if ($this->security_model->own_invoice($invoice_id) && $this->perm_user->invoice->send) {
  56. $data['invoice'] = $this->invoice_model->select_single($invoice_id);
  57. $data['sender'] = $this->session->userdata('name') . " &lt;" . $this->session->userdata('email') . "&gt;";
  58. $data['remain'] = $this->invoice_model->select_email_remain_month($this->session->userdata('company_id'));
  59. $this->load->view('invoice/xhr_send', $data);
  60. } else {
  61. $data['error'] = $this->lang->line('error_select_invoice');
  62. $this->load->view('xhr_error', $data);
  63. }
  64. }
  65. function send_submit($invoice_id) {
  66. if ($this->security_model->own_invoice($invoice_id) && $this->perm_user->invoice->send && $this->invoice_model->select_email_remain_month($this->session->userdata('company_id'))) {
  67. $message = htmlentities($this->input->post('content'));
  68. $this->invoice_model->mail_invoice($invoice_id, $this->input->post('recipient'), nl2br($message), 'New Invoice', 'You have a new invoice due.', post_checkbox('copy_self'));
  69. $data['message'] = $this->lang->line("invoice_sent");
  70. $this->load->view('invoice/xhr_send_submit', $data);
  71. } else {
  72. $data['error'] = $this->lang->line('error_select_invoice');
  73. $this->load->view('xhr_error', $data);
  74. }
  75. }
  76. function delete($invoice_id) {
  77. if ($this->security_model->own_invoice($invoice_id) && $this->perm_user->invoice->delete) {
  78. $data['invoice'] = $this->invoice_model->select_single($invoice_id);
  79. $this->load->view('invoice/xhr_delete', $data);
  80. } else {
  81. $data['error'] = $this->lang->line('error_delete_invoice');
  82. $this->load->view('xhr_error', $data);
  83. }
  84. }
  85. function delete_submit($invoice_id) {
  86. if ($this->security_model->own_invoice($invoice_id) && $this->perm_user->invoice->delete && $this->invoice_model->delete($invoice_id)) {
  87. $data['message'] = $this->lang->line('invoice_deleted');
  88. $this->load->view('invoice/xhr_delete_submit', $data);
  89. } else {
  90. $data['error'] = $this->lang->line('error_delete_invoice');
  91. $this->load->view('xhr_error', $data);
  92. }
  93. }
  94. function add($client_id = 0, $project_ids = '') {
  95. if (($client_id && !$this->security_model->own_client($client_id)) || !$this->perm_user->invoice->create) {
  96. $this->security_model->warn_user($this->session->userdata('id'));
  97. $data['error'] = $this->lang->line('error_load_client');
  98. $this->load->view('xhr_error', $data);
  99. } else if (!$client_id && !$project_ids) { # STEP 1
  100. $this->load->model("client_model");
  101. $data['clients'] = $this->client_model->select_active($this->session->userdata('company_id'));
  102. $this->load->view('invoice/xhr_add', $data);
  103. } else if ($client_id && !$project_ids) { # STEP 2
  104. $this->load->model("project_model");
  105. $data['projects'] = $this->project_model->select_multiple_client($client_id, TRUE);
  106. $data['client_id'] = $client_id;
  107. $this->load->view('invoice/xhr_add_step-2', $data);
  108. } else if ($client_id && $project_ids) { # STEP 3
  109. $this->load->model("client_model");
  110. $this->load->model("project_model");
  111. $this->load->model("segment_model");
  112. $this->load->model("expense_model");
  113. $data['client'] = $this->client_model->select_single($client_id);
  114. $data['project_ids'] = explode(':', $project_ids);
  115. $data['projects'] = $this->project_model->select_multiple_by_ids($data['project_ids'], $this->session->userdata('company_id'));
  116. $data['default_invoice_name'] = $data['client']['name'] . ' ' . date('Y-m-d');
  117. foreach($data['project_ids'] AS $project_id) {
  118. $data['segments'][$project_id] = $this->segment_model->select_available_project($project_id);
  119. $data['expenses'][$project_id] = $this->expense_model->select_available_project($project_id);
  120. }
  121. $this->load->view('invoice/xhr_add_step-3', $data);
  122. }
  123. }
  124. function add_submit() {
  125. if ($this->perm_user->invoice->create) {
  126. $this->load->model("segment_model");
  127. $this->load->model("expense_model");
  128. $invoice['name'] = htmlentities($this->input->post('name'));
  129. $invoice['duedate'] = $this->input->post('duedate');
  130. $invoice['client_id'] = (int) $this->input->post('client_id');
  131. $invoice['amount'] = (double) $this->input->post('amount');
  132. $invoice['paid'] = post_checkbox('paid');
  133. $invoice['remind'] = post_checkbox('remind');
  134. if ($invoice['paid']) {
  135. $invoice['paiddate'] = $this->input->post('paiddate');
  136. } else {
  137. $invoice['paiddate'] = '0000-00-00';
  138. }
  139. $invoice['itemize'] = post_checkbox('itemize');
  140. $invoice['sent'] = post_checkbox('sent');
  141. $invoice['content'] = htmlentities($this->input->post('content'));
  142. $invoice['company_id'] = $this->session->userdata('company_id');
  143. $segment_ids = $this->input->post('segments');
  144. $can_update = TRUE;
  145. if (!$segment_ids || $this->security_model->own_segments($segment_ids)) {
  146. } else {
  147. $can_update = FALSE;
  148. }
  149. $expense_ids = $this->input->post('expenses');
  150. if (!$expense_ids || $this->security_model->own_expenses($expense_ids)) {
  151. } else {
  152. $can_update = FALSE;
  153. }
  154. if ($invoice['name'] && $can_update && $this->security_model->own_client($invoice['client_id'])) {
  155. $invoice_id = $this->invoice_model->insert($invoice);
  156. if ($invoice_id) {
  157. if ($this->segment_model->multiple_set_invoice($segment_ids, $invoice_id)) {
  158. $data['message'] = $this->lang->line('invoice_added');
  159. $data['error'] = FALSE;
  160. /**
  161. * @todo I think this if statement is whack
  162. */
  163. if ($expense_ids && !$this->expense_model->multiple_set_invoice($expense_ids, $invoice_id)) {
  164. $data['message'] = $this->lang->line('error_update_expense');
  165. $data['error'] = TRUE;
  166. }
  167. } else {
  168. $data['message'] = $this->lang->line('error_update_segment');
  169. $data['error'] = TRUE;
  170. }
  171. } else {
  172. $data['message'] = $this->lang->line('error_create_invoice');
  173. $data['error'] = TRUE;
  174. }
  175. if (!$data['error']) {
  176. $data['invoice_id'] = $invoice_id;
  177. $this->load->view('invoice/xhr_add_submit', $data);
  178. } else {
  179. $this->load->view('xhr_error', $data);
  180. }
  181. } else {
  182. $data['error'] = $this->lang->line('error_update_segment');
  183. $this->load->view('xhr_error', $data);
  184. }
  185. } else {
  186. $data['error'] = $this->lang->line('error_low_perm');
  187. $this->load->view('xhr_error', $data);
  188. }
  189. }
  190. function edit($invoice_id) {
  191. if ($this->security_model->own_invoice($invoice_id) && $this->perm_user->invoice->update) {
  192. $this->load->model('client_model');
  193. $data['invoice'] = $this->invoice_model->select_single($invoice_id);
  194. $data['client'] = $this->client_model->select_single($data['invoice']['client_id']);
  195. $this->load->view('invoice/xhr_edit', $data);
  196. } else {
  197. $data['error'] = $this->lang->line('error_update_invoice');
  198. $this->load->view('xhr_error', $data);
  199. }
  200. }
  201. function edit_submit($invoice_id) {
  202. $invoice['name'] = htmlentities($this->input->post('name'));
  203. $invoice['duedate'] = $this->input->post('duedate');
  204. $invoice['client_id'] = (int) $this->input->post('client_id');
  205. $invoice['amount'] = (double) $this->input->post('amount');
  206. $invoice['paid'] = post_checkbox('paid');
  207. $invoice['remind'] = post_checkbox('remind');
  208. if ($invoice['paid']) {
  209. $invoice['paiddate'] = $this->input->post('paiddate');
  210. } else {
  211. $invoice['paiddate'] = '0000-00-00';
  212. }
  213. $invoice['itemize'] = post_checkbox('itemize');
  214. $invoice['sent'] = post_checkbox('sent');
  215. $invoice['content'] = htmlentities($this->input->post('content'));
  216. $invoice['company_id'] = $this->session->userdata('company_id');
  217. if ($invoice['name'] && $this->security_model->own_invoice($invoice_id) && $this->perm_user->invoice->update && $this->invoice_model->update($invoice_id, $invoice)) {
  218. $data['message'] = $this->lang->line('invoice_updated');
  219. $this->load->view('invoice/xhr_edit_submit', $data);
  220. } else {
  221. $data['error'] = $this->lang->line('error_update_invoice');
  222. $this->load->view('xhr_error', $data);
  223. }
  224. }
  225. function payment($invoice_id = 0) {
  226. if ($this->perm_user->payment->create) {
  227. $data['invoices'] = $this->invoice_model->select_payable($this->session->userdata('company_id'), 0,0, FALSE, 'duedate');
  228. $data['selected'] = $invoice_id;
  229. $this->load->view('invoice/xhr_payment', $data);
  230. } else {
  231. $data['error'] = $this->lang->line('error_low_perm');
  232. $this->load->view('xhr_error', $data);
  233. }
  234. }
  235. function payment_submit() {
  236. $this->load->model('payment_model');
  237. $data['date_received'] = $_POST['date'];
  238. $data['content'] = htmlentities($_POST['content']);
  239. $data['amount'] = (double) $_POST['amount'];
  240. $data['invoice_id'] = (int) $_POST['invoice_id'];
  241. $data['company_id'] = $this->session->userdata('company_id');
  242. if ($this->security_model->own_invoice($data['invoice_id']) && $this->perm_user->payment->create && $this->payment_model->insert($data)) {
  243. $data['message'] = $this->lang->line('payment_added');
  244. $this->load->view('invoice/xhr_payment_submit', $data);
  245. } else {
  246. $data['error'] = $this->lang->line('error_create_payment');
  247. $this->load->view('xhr_error', $data);
  248. }
  249. }
  250. function payment_delete($payment_id) {
  251. $this->load->model('payment_model');
  252. if ($this->security_model->own_payment($payment_id) && $this->perm_user->payment->delete && $this->payment_model->delete($payment_id)) {
  253. echo "1";
  254. } else {
  255. echo "0";
  256. }
  257. }
  258. function expense_unassign($expense_id) {
  259. $this->load->model('expense_model');
  260. if ($this->security_model->own_expense($expense_id) && $this->perm_user->expense->update && $this->expense_model->unassign_from_invoice($expense_id)) {
  261. echo "1";
  262. } else {
  263. echo "0";
  264. }
  265. }
  266. function segment_unassign($segment_id) {
  267. $this->load->model('segment_model');
  268. if ($this->security_model->own_segment($segment_id) && $this->perm_user->segment->update && $this->segment_model->unassign_from_invoice($segment_id)) {
  269. echo "1";
  270. } else {
  271. echo "0";
  272. }
  273. }
  274. }