Upload markdown files and organize them in a tree structure
⚠️ Warning: This action cannot be undone!
controllers/saveController.php (626 lines)
save
save
CREATE TABLE save (
saveid INT PRIMARY KEY AUTO_INCREMENT,
savename VARCHAR(255) NOT NULL,
savecurrentvalue DECIMAL(10,2) NOT NULL DEFAULT 0,
savedate DATETIME NOT NULL,
conditions INT NOT NULL DEFAULT 0, -- 0=active, 1=deleted
userid INT NOT NULL,
currencyId INT NOT NULL,
sortby INT NOT NULL DEFAULT 0,
treeId INT DEFAULT NULL, -- link to accountstree
saveTreeParentType INT DEFAULT 0, -- 0=regular(40), 1=special(408)
webApiId INT DEFAULT 0,
savetypeid INT DEFAULT NULL
);
savedaily - Cash Transaction Log
CREATE TABLE savedaily (
savedailyid INT PRIMARY KEY AUTO_INCREMENT,
savedailydate DATETIME NOT NULL,
userid INT NOT NULL,
savedailysavebefore DECIMAL(10,2) NOT NULL,
savedailychangeamount DECIMAL(10,2) NOT NULL,
savedailychangetype INT NOT NULL, -- 0=increase, 1=decrease
saveid INT NOT NULL,
processname VARCHAR(500), -- description of transaction
savedailymodelid INT, -- related record ID
savedailysaveafter DECIMAL(10,2) NOT NULL,
tablename VARCHAR(100) -- source table
);
savetype - Cash Box Categories
CREATE TABLE savetype (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(255) NOT NULL,
del INT NOT NULL DEFAULT 0 -- 0=active, 2=deleted
);
saveclose - Cash Box Transfers
CREATE TABLE saveclose (
savecloseid INT PRIMARY KEY AUTO_INCREMENT,
fromSaveId INT NOT NULL,
toSaveId INT NOT NULL,
amount DECIMAL(10,2) NOT NULL,
transferDate DATETIME NOT NULL,
userid INT NOT NULL,
conditions INT NOT NULL DEFAULT 0
);
accountstree - Chart of Accounts Integration
CREATE TABLE accountstree (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(255) NOT NULL,
customName VARCHAR(255),
parent INT NOT NULL,
type INT NOT NULL, -- 3=cash box account
level INT NOT NULL,
conditions INT NOT NULL DEFAULT 0
);
add() function - Lines 338-422)
-- Check for duplicate name
SELECT * FROM save WHERE savename = '{saveName}039; AND conditions = 0;
-- Insert new cash box
INSERT INTO save (
savedate, conditions, savecurrentvalue, savename,
currencyId, sortby, userid, saveTreeParentType,
webApiId, savetypeid
) VALUES (
NOW(), 0, {savecurrentValue}, '{saveName}039;,
{currencyId}, {sortby}, {userId}, {saveTreeParentType},
{webApiId}, {savetypeid}
);
-- Insert into savedaily audit log
INSERT INTO savedaily (
savedailydate, userid, savedailysavebefore, savedailychangeamount,
savedailychangetype, saveid, processname, savedailymodelid,
savedailysaveafter, tablename
) VALUES (
NOW(), {userId}, 0, {savecurrentValue},
0, {saveId}, 'تم اضافة خزنة باسم [{saveName}]039;, {saveId},
{savecurrentValue}, 'saveController.php039;
);
-- Add to chart of accounts tree
INSERT INTO accountstree (
name, customName, parent, type, level, conditions
) VALUES (
'{saveName}039;, 039;{saveName}039;, {parent}, 3, 1, 0
);
-- Update save with treeId
UPDATE save SET treeId = {treeId} WHERE saveid = {saveId};
-- Create accounting journal entry
INSERT INTO dailyentry (dDateTime, entryComment)
VALUES (NOW(), 'إضافة في {saveName}039;);
-- Debit entry (cash account)
INSERT INTO dailyentrydebtor (accountstreeid, value, dailyentryid)
VALUES ({treeId}, {savecurrentValue}, {dailyEntryId});
-- Credit entry (equity account)
INSERT INTO dailyentrycreditor (accountstreeid, value, dailyentryid)
VALUES (121, {savecurrentValue}, {dailyEntryId});
show() function - Lines 425-454)
-- Default query - all active cash boxes
SELECT s.*, c.name as currencyName, st.name as savetypeName
FROM save s
LEFT JOIN currency c ON s.currencyId = c.id
LEFT JOIN savetype st ON s.savetypeid = st.id
WHERE s.conditions = 0
ORDER BY s.sortby;
-- With type filter
SELECT s.*, c.name as currencyName, st.name as savetypeName
FROM save s
LEFT JOIN currency c ON s.currencyId = c.id
LEFT JOIN savetype st ON s.savetypeid = st.id
WHERE s.conditions = 0
AND s.savetypeid IN (0, {typeIds})
ORDER BY s.sortby;
-- With session-based access control
SELECT s.*, c.name as currencyName, st.name as savetypeName
FROM save s
LEFT JOIN currency c ON s.currencyId = c.id
LEFT JOIN savetype st ON s.savetypeid = st.id
WHERE s.conditions = 0
AND s.saveid IN ({allowedSaveIds})
ORDER BY s.sortby;
-- Single cash box view
SELECT s.*, c.name as currencyName, st.name as savetypeName
FROM save s
LEFT JOIN currency c ON s.currencyId = c.id
LEFT JOIN savetype st ON s.savetypeid = st.id
WHERE s.conditions = 0
AND s.saveid = {saveId};
delete() function - Lines 457-479)
-- Toggle conditions field for soft delete
UPDATE save
SET conditions = CASE
WHEN conditions = 1 THEN 0 -- Restore
WHEN conditions = 0 THEN 1 -- Delete
END,
savedate = NOW(),
userid = {userId}
WHERE saveid = {saveId};
-- Log the action in savedaily
INSERT INTO savedaily (
savedailydate, userid, savedailysavebefore, savedailychangeamount,
savedailychangetype, saveid, processname, savedailymodelid,
savedailysaveafter, tablename
) VALUES (
NOW(), {userId}, {currentValue}, 0,
2, {saveId}, 'حذف مؤقت للخزنة039;, {saveId},
{currentValue}, 'saveController.php039;
);
deleteFinaly() function - Lines 482-496)
-- Get save data for tree cleanup
SELECT * FROM save WHERE saveid = {saveId};
-- Delete from save table
DELETE FROM save WHERE saveid = {saveId};
-- Delete from chart of accounts
DELETE FROM accountstree WHERE id = {treeId};
-- Clean up related savedaily records (optional)
DELETE FROM savedaily WHERE saveid = {saveId};
edit() function - Lines 499-514)
-- Load cash box data with currency
SELECT s.*, c.name as currencyName
FROM save s
LEFT JOIN currency c ON s.currencyId = c.id
WHERE s.saveid = {saveId};
update() function - Lines 536-602)
-- Load existing data
SELECT * FROM save WHERE saveid = {saveId};
-- Update save record
UPDATE save SET
savedate = '{saveDate}039;,
conditions = {conditions},
savecurrentvalue = {savecurrentValue},
savename = '{saveName}039;,
userid = {userId},
sortby = {sortby},
saveTreeParentType = {saveTreeParentType},
savetypeid = {savetypeid}
WHERE saveid = {saveId};
-- Update chart of accounts tree
UPDATE accountstree SET
name = '{saveName}039;,
customName = '{saveName}039;,
parent = {parent}
WHERE id = {treeId};
-- Log the update in savedaily
INSERT INTO savedaily (
savedailydate, userid, savedailysavebefore, savedailychangeamount,
savedailychangetype, saveid, processname, savedailymodelid,
savedailysaveafter, tablename
) VALUES (
NOW(), {userId}, {oldValue}, {changeAmount},
{changeType}, {saveId}, 'تعديل بيانات الخزنة039;, {saveId},
{newValue}, 'saveController.php039;
);
sortby operation - Lines 307-310)
-- AJAX update for display order
UPDATE save SET sortby = {sortby} WHERE saveid = {id};
-- Get all active save types
SELECT name, id FROM savetype WHERE del != 2;
-- Get active currencies for dropdown
SELECT * FROM currency WHERE conditions = 0;
/api/save/add
{
"savename": "الخزنة الرئيسية",
"savecurrentvalue": 50000.00,
"savedetails": "خزنة المكتب الرئيسي",
"currencyId": 1,
"sortby": 1,
"saveTreeParentType": 0,
"savetypeid": 1,
"webApiId": 0,
"curlpost": 1
}
{
"status": 1,
"message": "تمت العمليه بنجاح",
"message_en": "Success",
"saveId": 123,
"treeId": 456
}
/api/save/list
savetypeids[]: Array of save type IDs to filter
conditions: 0 for active, 1 for deleted
{
"status": "success",
"data": [
{
"saveid": 1,
"savename": "الخزنة الرئيسية",
"savecurrentvalue": 50000.00,
"currencyName": "ريال سعودي",
"savetypeName": "خزنة نقدية",
"conditions": 0,
"sortby": 1
}
]
}
/api/save/update/{saveid}
{
"saveid": 1,
"savename": "الخزنة الرئيسية - محدث",
"savecurrentvalue": 75000.00,
"savedate": "2024-01-15",
"conditions": 0,
"sortby": 1,
"saveTreeParentType": 0,
"savetypeid": 1,
"curlpost": 1
}
/api/save/delete/{saveid}
{
"status": 1,
"message": "تمت العمليه بنجاح",
"message_en": "Success"
}
/api/save/{saveid}
{
"saveid": 1,
"savename": "الخزنة الرئيسية",
"savecurrentvalue": 50000.00,
"savedate": "2024-01-01",
"currencyId": 1,
"currencyName": "ريال سعودي",
"treeId": 456,
"savetypeid": 1,
"sortby": 1,
"conditions": 0
}
// Access control variables
$_SESSION['searchinonesave039;] // 0=multiple, 1=single
$_SESSION['saveids039;] // Comma-separated allowed IDs
$_SESSION['saveid039;] // Single cash box access
try {
// Operations
$mytransactions->commit();
} ">catch (Exception $ex) {
$mytransactions->rollback();
}
../public/authentication.php
$_SESSION['userid']
">if (isset($_POST['curlpost039;]) && $_POST[039;curlpost039;] == 1) {
// Return JSON response
">echo json_encode($data);
} else {
// Standard web redirect
header("location:?do=success");
}
insertSavedaily(
$savedailysavebefore,
$savedailychangeamount,
$savedailychangetype,
$saveid,
$processname,
$savedailymodelid,
$savedailysaveafter,
$tablename
);